/ Hex Artifact Content
Login

Artifact 059991ce76b1a857cb84dd2469cfcfaaae1d77fa:


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 2f 2a 0a  IZE 0x10000../*.
4db0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
4dc0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
4dd0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
4de0: 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  ocated for each 
4df0: 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f  active.** savepo
4e00: 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65 6e  int and statemen
4e10: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  t transaction in
4e20: 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c   the system. All
4e30: 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65 73   such structures
4e40: 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69  .** are stored i
4e50: 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  n the Pager.aSav
4e60: 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20  epoint[] array, 
4e70: 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61 74  which is allocat
4e80: 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65  ed and.** resize
4e90: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52  d using sqlite3R
4ea0: 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20  ealloc()..**.** 
4eb0: 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  When a savepoint
4ec0: 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68 65   is created, the
4ed0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
4ee0: 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64  iHdrOffset field
4ef0: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e   is.** set to 0.
4f00: 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65   If a journal-he
4f10: 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  ader is written 
4f20: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f  into the main jo
4f30: 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74  urnal while.** t
4f40: 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  he savepoint is 
4f50: 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48 64  active, then iHd
4f60: 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20 74  rOffset is set t
4f70: 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  o the byte offse
4f80: 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  t .** immediatel
4f90: 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
4fa0: 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63  last journal rec
4fb0: 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ord written into
4fc0: 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75   the main.** jou
4fd0: 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65 20  rnal before the 
4fe0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20  journal-header. 
4ff0: 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
5000: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
5010: 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73  t.** rollback (s
5020: 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  ee pagerPlayback
5030: 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f  Savepoint())..*/
5040: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
5050: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 50  PagerSavepoint P
5060: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73  agerSavepoint;.s
5070: 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65 70  truct PagerSavep
5080: 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f 66  oint {.  i64 iOf
5090: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
50a0: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69 6e        /* Startin
50b0: 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69 6e  g offset in main
50c0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
50d0: 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20 20  4 iHdrOffset;   
50e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
50f0: 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74  e above */.  Bit
5100: 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e  vec *pInSavepoin
5110: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  t;        /* Set
5120: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 69   of pages in thi
5130: 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20  s savepoint */. 
5140: 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20   Pgno nOrig;    
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5160: 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72   Original number
5170: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69 6c   of pages in fil
5180: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62  e */.  Pgno iSub
5190: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
51a0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
51b0: 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e 20  first record in 
51c0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23  sub-journal */.#
51d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
51e0: 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57 61  IT_WAL.  u32 aWa
51f0: 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50 4f  lData[WAL_SAVEPO
5200: 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20 20  INT_NDATA];     
5210: 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70 6f     /* WAL savepo
5220: 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23  int context */.#
5230: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
5240: 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67 65  Bits of the Page
5250: 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c 61  r.doNotSpill fla
5260: 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72 20  g.  See further 
5270: 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c 6f  description belo
5280: 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50  w..*/.#define SP
5290: 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20 20  ILLFLAG_OFF     
52a0: 20 20 20 20 30 78 30 31 20 2f 2a 20 4e 65 76 65      0x01 /* Neve
52b0: 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20 20  r spill cache.  
52c0: 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20 2a  Set via pragma *
52d0: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
52e0: 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20 20  LAG_ROLLBACK    
52f0: 30 78 30 32 20 2f 2a 20 43 75 72 72 65 6e 74 20  0x02 /* Current 
5300: 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 2c 20 73 6f  rolling back, so
5310: 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 2a 2f   do not spill */
5320: 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c  .#define SPILLFL
5330: 41 47 5f 4e 4f 53 59 4e 43 20 20 20 20 20 20 30  AG_NOSYNC      0
5340: 78 30 34 20 2f 2a 20 53 70 69 6c 6c 20 69 73 20  x04 /* Spill is 
5350: 6f 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 73  ok, but do not s
5360: 79 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e  ync */../*.** An
5370: 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65   open page cache
5380: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
5390: 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72 2e  of struct Pager.
53a0: 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   A description o
53b0: 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65  f.** some of the
53c0: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
53d0: 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73  member variables
53e0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
53f0: 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54  eState.**.**   T
5400: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
5410: 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e' of the pager 
5420: 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65 20  object. See the 
5430: 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61 74  comment and stat
5440: 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20 61  e.**   diagram a
5450: 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63 72  bove for a descr
5460: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  iption of the pa
5470: 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ger state..**.**
5480: 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46   eLock.**.**   F
5490: 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73  or a real on-dis
54a0: 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  k database, the 
54b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c  current lock hel
54c0: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
54d0: 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f  e file -.**   NO
54e0: 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
54f0: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
5500: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
5510: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72  OCK..**.**   For
5520: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20   a temporary or 
5530: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
5540: 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20 77  se (neither of w
5550: 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e 79  hich require any
5560: 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68  .**   locks), th
5570: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  is variable is a
5580: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58 43  lways set to EXC
5590: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e  LUSIVE_LOCK. Sin
55a0: 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61 74  ce such.**   dat
55b0: 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68 61  abases always ha
55c0: 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73 69  ve Pager.exclusi
55d0: 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20  veMode==1, this 
55e0: 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65 72  tricks the pager
55f0: 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f  .**   logic into
5600: 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20 69   thinking that i
5610: 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 6c  t already has al
5620: 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20 77  l the locks it w
5630: 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65  ill ever.**   ne
5640: 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f  ed (and no reaso
5650: 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  n to release the
5660: 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73  m)..**.**   In s
5670: 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63 69  ome (obscure) ci
5680: 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68 69  rcumstances, thi
5690: 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 61  s variable may a
56a0: 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a  lso be set to.**
56b0: 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e     UNKNOWN_LOCK.
56c0: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
56d0: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
56e0: 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ne of UNKNOWN_LO
56f0: 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61  CK for.**   deta
5700: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67  ils..**.** chang
5710: 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a  eCountDone.**.**
5720: 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20     This boolean 
5730: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
5740: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
5750: 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  at the change-co
5760: 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68 65  unter .**   (the
5770: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20 66   4-byte header f
5780: 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66 66  ield at byte off
5790: 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64 61  set 24 of the da
57a0: 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73 20  tabase file) is 
57b0: 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74 65  .**   not update
57c0: 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68 61  d more often tha
57d0: 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a  n necessary. .**
57e0: 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74 20  .**   It is set 
57f0: 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68 65  to true when the
5800: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
5810: 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
5820: 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63 61  , which .**   ca
5830: 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
5840: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
5850: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
5860: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
5870: 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65 61  .**   It is clea
5880: 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c 73  red (set to fals
5890: 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20 65  e) whenever an e
58a0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
58b0: 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69 73   .**   relinquis
58c0: 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  hed on the datab
58d0: 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20 74  ase file. Each t
58e0: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
58f0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a  n is committed,.
5900: 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65 43  **   The changeC
5910: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
5920: 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20 69   inspected. If i
5930: 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 77  t is true, the w
5940: 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61  ork of.**   upda
5950: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
5960: 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74 74  counter is omitt
5970: 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ed for the curre
5980: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
5990: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65 63  **.**   This mec
59a0: 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68 61  hanism means tha
59b0: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  t when running i
59c0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
59d0: 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a  , a connection .
59e0: 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75  **   need only u
59f0: 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
5a00: 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66  -counter once, f
5a10: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72 61  or the first tra
5a20: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f  nsaction.**   co
5a30: 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73  mmitted..**.** s
5a40: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
5a50: 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69   When PagerCommi
5a60: 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63  tPhaseOne() is c
5a70: 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20  alled to commit 
5a80: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  a transaction, i
5a90: 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d  t may.**   (or m
5aa0: 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79 20  ay not) specify 
5ab0: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5ac0: 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69 74   name to be writ
5ad0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
5ae0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
5af0: 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79 6e  before it is syn
5b00: 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
5b10: 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72 20  **   Whether or 
5b20: 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  not a journal fi
5b30: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61  le contains a ma
5b40: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5b50: 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a 2a  nter affects .**
5b60: 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77 68     the way in wh
5b70: 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ich the journal 
5b80: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5b90: 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  d after the tran
5ba0: 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20  saction is .**  
5bb0: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
5bc0: 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20 72  lled back when r
5bd0: 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e  unning in "journ
5be0: 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54 22  al_mode=PERSIST"
5bf0: 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61   mode..**   If a
5c00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
5c10: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
5c20: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
5c30: 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a  pointer, it is.*
5c40: 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62 79  *   finalized by
5c50: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5c60: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
5c70: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5c80: 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f  s. If.**   it do
5c90: 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73  es contain a mas
5ca0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter-journal poin
5cb0: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
5cc0: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5cd0: 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e 63  d .**   by trunc
5ce0: 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f  ating it to zero
5cf0: 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73 20   bytes, just as 
5d00: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
5d10: 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e  n were .**   run
5d20: 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c  ning in "journal
5d30: 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22 20  _mode=truncate" 
5d40: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f  mode..**.**   Jo
5d50: 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61 74  urnal files that
5d60: 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72 20   contain master 
5d70: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
5d80: 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c   cannot be final
5d90: 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79  ized.**   simply
5da0: 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20   by overwriting 
5db0: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
5dc0: 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a 65  l-header with ze
5dd0: 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20  roes, as the.** 
5de0: 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c    master journal
5df0: 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20 69   pointer could i
5e00: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68 6f  nterfere with ho
5e10: 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
5e20: 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73  ck of any.**   s
5e30: 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74 65  ubsequently inte
5e40: 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63 74  rrupted transact
5e50: 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73 20  ion that reuses 
5e60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5e70: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c  ..**.**   The fl
5e80: 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61 73  ag is cleared as
5e90: 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75   soon as the jou
5ea0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69 6e  rnal file is fin
5eb0: 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a 2a  alized (either.*
5ec0: 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d 6d  *   by PagerComm
5ed0: 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50 61  itPhaseTwo or Pa
5ee0: 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66  gerRollback). If
5ef0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72 65   an IO error pre
5f00: 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a  vents the.**   j
5f10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d  ournal file from
5f20: 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66 75   being successfu
5f30: 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74  lly finalized, t
5f40: 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c 61  he setMaster fla
5f50: 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72 65  g.**   is cleare
5f60: 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74 68  d anyway (and th
5f70: 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76  e pager will mov
5f80: 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  e to ERROR state
5f90: 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70  )..**.** doNotSp
5fa0: 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73  ill.**.**   This
5fb0: 20 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74 72   variables contr
5fc0: 6f 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  ol the behavior 
5fd0: 6f 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73 20  of cache-spills 
5fe0: 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 0a   (calls made by.
5ff0: 2a 2a 20 20 20 74 68 65 20 70 63 61 63 68 65 20  **   the pcache 
6000: 6d 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70 61  module to the pa
6010: 67 65 72 53 74 72 65 73 73 28 29 20 72 6f 75 74  gerStress() rout
6020: 69 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61 63  ine to write cac
6030: 68 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74 6f  hed data.**   to
6040: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
6050: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65   in order to fre
6060: 65 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a 2a  e up memory)..**
6070: 0a 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73 20  .**   When bits 
6080: 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f 72  SPILLFLAG_OFF or
6090: 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42   SPILLFLAG_ROLLB
60a0: 41 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69 6c  ACK of doNotSpil
60b0: 6c 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20 20  l are set,.**   
60c0: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
60d0: 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61 67  atabase from pag
60e0: 65 72 53 74 72 65 73 73 28 29 20 69 73 20 64 69  erStress() is di
60f0: 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68 65  sabled altogethe
6100: 72 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49 4c  r..**   The SPIL
6110: 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 63  LFLAG_ROLLBACK c
6120: 61 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20 61  ase is done in a
6130: 20 76 65 72 79 20 6f 62 73 63 75 72 65 20 63 61   very obscure ca
6140: 73 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f 6d  se that.**   com
6150: 65 73 20 75 70 20 64 75 72 69 6e 67 20 73 61 76  es up during sav
6160: 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  epoint rollback 
6170: 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74 68  that requires th
6180: 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 0a  e pcache module.
6190: 2a 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74 65  **   to allocate
61a0: 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 70   a new page to p
61b0: 72 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72 6e  revent the journ
61c0: 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69  al file from bei
61d0: 6e 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20  ng written.**   
61e0: 77 68 69 6c 65 20 69 74 20 69 73 20 62 65 69 6e  while it is bein
61f0: 67 20 74 72 61 76 65 72 73 65 64 20 62 79 20 63  g traversed by c
6200: 6f 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c 61  ode in pager_pla
6210: 79 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53 50  yback().  The SP
6220: 49 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20 20  ILLFLAG_OFF.**  
6230: 20 63 61 73 65 20 69 73 20 61 20 75 73 65 72 20   case is a user 
6240: 70 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20 0a  preference..** .
6250: 2a 2a 20 20 20 49 66 20 74 68 65 20 53 50 49 4c  **   If the SPIL
6260: 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69 74  LFLAG_NOSYNC bit
6270: 20 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e 67   is set, writing
6280: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
6290: 20 66 72 6f 6d 0a 2a 2a 20 20 20 70 61 67 65 72   from.**   pager
62a0: 53 74 72 65 73 73 28 29 20 69 73 20 70 65 72 6d  Stress() is perm
62b0: 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63 69  itted, but synci
62c0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
62d0: 69 6c 65 20 69 73 20 6e 6f 74 2e 0a 2a 2a 20 20  ile is not..**  
62e0: 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73 65   This flag is se
62f0: 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65  t by sqlite3Page
6300: 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74 68  rWrite() when th
6310: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 65  e file-system se
6320: 63 74 6f 72 2d 73 69 7a 65 0a 2a 2a 20 20 20 69  ctor-size.**   i
6330: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
6340: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2d  e database page-
6350: 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  size in order to
6360: 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e   prevent a journ
6370: 61 6c 20 73 79 6e 63 0a 2a 2a 20 20 20 66 72 6f  al sync.**   fro
6380: 6d 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 20 62  m happening in b
6390: 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e  etween the journ
63a0: 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61  alling of two pa
63b0: 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ges on the same 
63c0: 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73  sector. .**.** s
63d0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a  ubjInMemory.**.*
63e0: 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f  *   This is a bo
63f0: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20  olean variable. 
6400: 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  If true, then an
6410: 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a  y required sub-j
6420: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f  ournal.**   is o
6430: 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
6440: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
6450: 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68  le. If false, th
6460: 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  en in-memory.** 
6470: 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61    sub-journals a
6480: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  re only used for
6490: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
64a0: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
64b0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
64c0: 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65 20   updated by the 
64d0: 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63 68  upper layer each
64e0: 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20   time a new .** 
64f0: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6500: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a  ion is opened..*
6510: 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f  *.** dbSize, dbO
6520: 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53  rigSize, dbFileS
6530: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69  ize.**.**   Vari
6540: 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73  able dbSize is s
6550: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
6560: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
6570: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
6580: 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69 64  **   It is valid
6590: 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52   in PAGER_READER
65a0: 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61 74   and higher stat
65b0: 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65  es (all states e
65c0: 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f  xcept for.**   O
65d0: 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20  PEN and ERROR). 
65e0: 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20  .**.**   dbSize 
65f0: 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20  is set based on 
6600: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
6610: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
6620: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
6630: 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68    larger than th
6640: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6650: 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c 75  tabase (the valu
6660: 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73  e stored at offs
6670: 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68  et.**   28 of th
6680: 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65  e database heade
6690: 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29 2e  r by the btree).
66a0: 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   If the size of 
66b0: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73  the file.**   is
66c0: 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
66d0: 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20  multiple of the 
66e0: 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76  page-size, the v
66f0: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
6700: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f  *   dbSize is ro
6710: 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e  unded down (i.e.
6720: 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68   a 5KB file with
6730: 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61   2K page-size ha
6740: 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a  s dbSize==2)..**
6750: 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66     Except, any f
6760: 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65 61  ile that is grea
6770: 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
6780: 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73   in size is cons
6790: 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68  idered.**   to h
67a0: 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ave at least one
67b0: 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31   page. (i.e. a 1
67c0: 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20  KB file with 2K 
67d0: 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a  page-size leads.
67e0: 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d  **   to dbSize==
67f0: 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69  1)..**.**   Duri
6800: 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ng a write-trans
6810: 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73  action, if pages
6820: 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65   with page-numbe
6830: 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a  rs greater than.
6840: 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65 20  **   dbSize are 
6850: 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65 20  modified in the 
6860: 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73  cache, dbSize is
6870: 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
6880: 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c  ngly..**   Simil
6890: 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74  arly, if the dat
68a0: 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61 74  abase is truncat
68b0: 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54 72  ed using PagerTr
68c0: 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a  uncateImage(), .
68d0: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 75  **   dbSize is u
68e0: 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  pdated..**.**   
68f0: 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67  Variables dbOrig
6900: 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53  Size and dbFileS
6910: 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e  ize are valid in
6920: 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41   states .**   PA
6930: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
6940: 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62  D and higher. db
6950: 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f  OrigSize is a co
6960: 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65  py of the dbSize
6970: 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61  .**   variable a
6980: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
6990: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
69a0: 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  It is used durin
69b0: 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20  g rollback,.**  
69c0: 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e   and to determin
69d0: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
69e0: 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
69f0: 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66  e journalled bef
6a00: 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d  ore.**   being m
6a10: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
6a20: 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72   Throughout a wr
6a30: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
6a40: 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74   dbFileSize cont
6a50: 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66  ains the size of
6a60: 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f  .**   the file o
6a70: 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e  n disk in pages.
6a80: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61 20   It is set to a 
6a90: 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77  copy of dbSize w
6aa0: 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69  hen the.**   wri
6ab0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6ac0: 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20  s first opened, 
6ad0: 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65 6e  and updated when
6ae0: 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d   VFS calls are m
6af0: 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74  ade.**   to writ
6b00: 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68  e or truncate th
6b10: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
6b20: 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20  on disk. .**.** 
6b30: 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f    The only reaso
6b40: 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  n the dbFileSize
6b50: 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65 71   variable is req
6b60: 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70 70  uired is to supp
6b70: 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63  ress .**   unnec
6b80: 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20  essary calls to 
6b90: 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74 65  xTruncate() afte
6ba0: 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  r committing a t
6bb0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20  ransaction. If, 
6bc0: 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61  .**   when a tra
6bd0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
6be0: 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c  itted, the dbFil
6bf0: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69  eSize variable i
6c00: 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74  ndicates .**   t
6c10: 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
6c20: 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20   file is larger 
6c30: 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61 73  than the databas
6c40: 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64  e image (Pager.d
6c50: 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61  bSize), .**   pa
6c60: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69  ger_truncate() i
6c70: 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61  s called. The pa
6c80: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63  ger_truncate() c
6c90: 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69  all uses xFilesi
6ca0: 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61  ze().**   to mea
6cb0: 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
6cc0: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20  e file on disk, 
6cd0: 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74  and then truncat
6ce0: 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72 65  es it if require
6cf0: 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69  d..**   dbFileSi
6d00: 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77  ze is not used w
6d10: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
6d20: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
6d30: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20  In this case.** 
6d40: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6d50: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63  () is called unc
6d60: 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68  onditionally (wh
6d70: 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20  ich means there 
6d80: 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61  may be.**   a ca
6d90: 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28  ll to xFilesize(
6da0: 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74  ) that is not st
6db0: 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64 29  rictly required)
6dc0: 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65  . In either case
6dd0: 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75  ,.**   pager_tru
6de0: 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75 73  ncate() may caus
6df0: 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  e the file to be
6e00: 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20  come smaller or 
6e10: 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62  larger..**.** db
6e20: 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20  HintSize.**.**  
6e30: 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20   The dbHintSize 
6e40: 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64  variable is used
6e50: 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75   to limit the nu
6e60: 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61  mber of calls ma
6e70: 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56  de to.**   the V
6e80: 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  FS xFileControl(
6e90: 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29  FCNTL_SIZE_HINT)
6ea0: 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20   method. .**.** 
6eb0: 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20    dbHintSize is 
6ec0: 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66  set to a copy of
6ed0: 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72 69   the dbSize vari
6ee0: 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20  able when a.**  
6ef0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
6f00: 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74  on is opened (at
6f10: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61   the same time a
6f20: 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64  s dbFileSize and
6f30: 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65  .**   dbOrigSize
6f40: 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65 43  ). If the xFileC
6f50: 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a  ontrol(FCNTL_SIZ
6f60: 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69  E_HINT) method i
6f70: 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64  s called,.**   d
6f80: 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63  bHintSize is inc
6f90: 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75  reased to the nu
6fa0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
6fb0: 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  at correspond to
6fc0: 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68   the.**   size-h
6fd0: 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  int passed to th
6fe0: 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53  e method call. S
6ff0: 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  ee pager_write_p
7000: 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a  agelist() for .*
7010: 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  *   details..**.
7020: 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a  ** errCode.**.**
7030: 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72 72     The Pager.err
7040: 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69 73  Code variable is
7050: 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20   only ever used 
7060: 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  in PAGER_ERROR s
7070: 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73  tate. It.**   is
7080: 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20   set to zero in 
7090: 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73  all other states
70a0: 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52  . In PAGER_ERROR
70b0: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72   state, Pager.er
70c0: 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61  rCode .**   is a
70d0: 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c  lways set to SQL
70e0: 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45  ITE_FULL, SQLITE
70f0: 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66  _IOERR or one of
7100: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
7110: 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d  R_XXX .**   sub-
7120: 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  codes..*/.struct
7130: 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74   Pager {.  sqlit
7140: 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20  e3_vfs *pVfs;   
7150: 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e         /* OS fun
7160: 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f  ctions to use fo
7170: 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63  r IO */.  u8 exc
7180: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
7190: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
71a0: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
71b0: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
71c0: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
71d0: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
71e0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
71f0: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
7200: 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  DE_* values */. 
7210: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7230: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
7240: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
7250: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79  ile */.  u8 noSy
7260: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
7270: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
7280: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
7290: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20  if true */.  u8 
72a0: 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20  fullSync;       
72b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65           /* Do e
72c0: 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68  xtra syncs of th
72d0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f  e journal for ro
72e0: 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38  bustness */.  u8
72f0: 20 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3b 20   ckptSyncFlags; 
7300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e            /* SYN
7310: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
7320: 5f 46 55 4c 4c 20 66 6f 72 20 63 68 65 63 6b 70  _FULL for checkp
7330: 6f 69 6e 74 20 2a 2f 0a 20 20 75 38 20 77 61 6c  oint */.  u8 wal
7340: 53 79 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20  SyncFlags;      
7350: 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f        /* SYNC_NO
7360: 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c  RMAL or SYNC_FUL
7370: 4c 20 66 6f 72 20 77 61 6c 20 77 72 69 74 65 73  L for wal writes
7380: 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c 61   */.  u8 syncFla
7390: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
73a0: 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c    /* SYNC_NORMAL
73b0: 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f 74   or SYNC_FULL ot
73c0: 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38 20  herwise */.  u8 
73d0: 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20  tempFile;       
73e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
73f0: 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f  ename is a tempo
7400: 72 61 72 79 20 6f 72 20 69 6d 6d 75 74 61 62 6c  rary or immutabl
7410: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  e file */.  u8 n
7420: 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  oLock;          
7430: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
7440: 74 20 6c 6f 63 6b 20 28 65 78 63 65 70 74 20 69  t lock (except i
7450: 6e 20 57 41 4c 20 6d 6f 64 65 29 20 2a 2f 0a 20  n WAL mode) */. 
7460: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7480: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
7490: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
74a0: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
74c0: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
74d0: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
74e0: 2f 0a 0a 20 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /..  /**********
74f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7530: 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
7540: 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74 61 69  ing block contai
7550: 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73 20 6d  ns those class m
7560: 65 6d 62 65 72 73 20 74 68 61 74 20 63 68 61 6e  embers that chan
7570: 67 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 72  ge during.  ** r
7580: 6f 75 74 69 6e 65 20 6f 70 65 72 61 74 69 6f 6e  outine operation
7590: 2e 20 20 43 6c 61 73 73 20 6d 65 6d 62 65 72 73  .  Class members
75a0: 20 6e 6f 74 20 69 6e 20 74 68 69 73 20 62 6c 6f   not in this blo
75b0: 63 6b 20 61 72 65 20 65 69 74 68 65 72 20 66 69  ck are either fi
75c0: 78 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68  xed.  ** when th
75d0: 65 20 70 61 67 65 72 20 69 73 20 66 69 72 73 74  e pager is first
75e0: 20 63 72 65 61 74 65 64 20 6f 72 20 65 6c 73 65   created or else
75f0: 20 6f 6e 6c 79 20 63 68 61 6e 67 65 20 77 68 65   only change whe
7600: 6e 20 74 68 65 72 65 20 69 73 20 61 0a 20 20 2a  n there is a.  *
7610: 2a 20 73 69 67 6e 69 66 69 63 61 6e 74 20 6d 6f  * significant mo
7620: 64 65 20 63 68 61 6e 67 65 20 28 73 75 63 68 20  de change (such 
7630: 61 73 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  as changing the 
7640: 70 61 67 65 5f 73 69 7a 65 2c 20 6c 6f 63 6b 69  page_size, locki
7650: 6e 67 5f 6d 6f 64 65 2c 0a 20 20 2a 2a 20 6f 72  ng_mode,.  ** or
7660: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   the journal_mod
7670: 65 29 2e 20 20 46 72 6f 6d 20 61 6e 6f 74 68 65  e).  From anothe
7680: 72 20 76 69 65 77 2c 20 74 68 65 73 65 20 63 6c  r view, these cl
7690: 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65 73 63  ass members desc
76a0: 72 69 62 65 0a 20 20 2a 2a 20 74 68 65 20 22 73  ribe.  ** the "s
76b0: 74 61 74 65 22 20 6f 66 20 74 68 65 20 70 61 67  tate" of the pag
76c0: 65 72 2c 20 77 68 69 6c 65 20 6f 74 68 65 72 20  er, while other 
76d0: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20 64 65  class members de
76e0: 73 63 72 69 62 65 20 74 68 65 0a 20 20 2a 2a 20  scribe the.  ** 
76f0: 22 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 22 20  "configuration" 
7700: 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20  of the pager..  
7710: 2a 2f 0a 20 20 75 38 20 65 53 74 61 74 65 3b 20  */.  u8 eState; 
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7730: 20 2f 2a 20 50 61 67 65 72 20 73 74 61 74 65 20   /* Pager state 
7740: 28 4f 50 45 4e 2c 20 52 45 41 44 45 52 2c 20 57  (OPEN, READER, W
7750: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 2e 2e 29 20  RITER_LOCKED..) 
7760: 2a 2f 0a 20 20 75 38 20 65 4c 6f 63 6b 3b 20 20  */.  u8 eLock;  
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7780: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f 63 6b   /* Current lock
7790: 20 68 65 6c 64 20 6f 6e 20 64 61 74 61 62 61 73   held on databas
77a0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 63  e file */.  u8 c
77b0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
77c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
77d0: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
77e0: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
77f0: 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73 65 74  nter */.  u8 set
7800: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
7810: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
7820: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
7830: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
7840: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
7850: 6f 74 53 70 69 6c 6c 3b 20 20 20 20 20 20 20 20  otSpill;        
7860: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7870: 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20  spill the cache 
7880: 77 68 65 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f  when non-zero */
7890: 0a 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f  .  u8 subjInMemo
78a0: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ry;            /
78b0: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e  * True to use in
78c0: 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72  -memory sub-jour
78d0: 6e 61 6c 73 20 2a 2f 0a 20 20 75 38 20 62 55 73  nals */.  u8 bUs
78e0: 65 46 65 74 63 68 3b 20 20 20 20 20 20 20 20 20  eFetch;         
78f0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
7900: 20 75 73 65 20 78 46 65 74 63 68 28 29 20 2a 2f   use xFetch() */
7910: 0a 20 20 75 38 20 68 61 73 48 65 6c 64 53 68 61  .  u8 hasHeldSha
7920: 72 65 64 4c 6f 63 6b 3b 20 20 20 20 20 20 20 2f  redLock;       /
7930: 2a 20 54 72 75 65 20 69 66 20 61 20 73 68 61 72  * True if a shar
7940: 65 64 20 6c 6f 63 6b 20 68 61 73 20 65 76 65 72  ed lock has ever
7950: 20 62 65 65 6e 20 68 65 6c 64 20 2a 2f 0a 20 20   been held */.  
7960: 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20 20 20  Pgno dbSize;    
7970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7980: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
7990: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
79a0: 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69 67 53  /.  Pgno dbOrigS
79b0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
79c0: 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65  /* dbSize before
79d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
79e0: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 50 67  nsaction */.  Pg
79f0: 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b 20 20  no dbFileSize;  
7a00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7a10: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
7a20: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
7a30: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 48 69  e */.  Pgno dbHi
7a40: 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  ntSize;         
7a50: 20 20 20 2f 2a 20 56 61 6c 75 65 20 70 61 73 73     /* Value pass
7a60: 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53 49 5a 45  ed to FCNTL_SIZE
7a70: 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f 0a 20 20  _HINT call */.  
7a80: 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20 20  int errCode;    
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
7aa0: 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69  ne of several ki
7ab0: 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f  nds of errors */
7ac0: 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7ae0: 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61 6c 6c  * Pages journall
7af0: 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20 6a 2d  ed since last j-
7b00: 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 2a  header written *
7b10: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69  /.  u32 cksumIni
7b20: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
7b30: 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20  /* Quasi-random 
7b40: 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65  value added to e
7b50: 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f  very checksum */
7b60: 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63 3b 20  .  u32 nSubRec; 
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7b80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  * Number of reco
7b90: 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73  rds written to s
7ba0: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  ub-journal */.  
7bb0: 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72 6e  Bitvec *pInJourn
7bc0: 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  al;         /* O
7bd0: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
7be0: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
7bf0: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 73  base file */.  s
7c00: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b  qlite3_file *fd;
7c10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
7c20: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
7c30: 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  r database */.  
7c40: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66  sqlite3_file *jf
7c50: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  d;          /* F
7c60: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7c70: 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  or main journal 
7c80: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
7c90: 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20 20  e *sjfd;        
7ca0: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
7cb0: 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75 72  tor for sub-jour
7cc0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  nal */.  i64 jou
7cd0: 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20  rnalOff;        
7ce0: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
7cf0: 77 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e 20  write offset in 
7d00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
7d10: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
7d20: 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  lHdr;           
7d30: 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
7d40: 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75   to previous jou
7d50: 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20  rnal header */. 
7d60: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
7d70: 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f 2a 20  *pBackup;    /* 
7d80: 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73 74 20  Pointer to list 
7d90: 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63 6b 75  of ongoing backu
7da0: 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a 20  p processes */. 
7db0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
7dc0: 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20  *aSavepoint; /* 
7dd0: 41 72 72 61 79 20 6f 66 20 61 63 74 69 76 65 20  Array of active 
7de0: 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20  savepoints */.  
7df0: 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20  int nSavepoint; 
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7e10: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
7e20: 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b  s in aSavepoint[
7e30: 5d 20 2a 2f 0a 20 20 75 33 32 20 69 44 61 74 61  ] */.  u32 iData
7e40: 56 65 72 73 69 6f 6e 3b 20 20 20 20 20 20 20 20  Version;        
7e50: 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68     /* Changes wh
7e60: 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20  enever database 
7e70: 63 6f 6e 74 65 6e 74 20 63 68 61 6e 67 65 73 20  content changes 
7e80: 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65  */.  char dbFile
7e90: 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20  Vers[16];       
7ea0: 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e   /* Changes when
7eb0: 65 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69  ever database fi
7ec0: 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 0a 20  le changes */.. 
7ed0: 20 69 6e 74 20 6e 4d 6d 61 70 4f 75 74 3b 20 20   int nMmapOut;  
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7ef0: 4e 75 6d 62 65 72 20 6f 66 20 6d 6d 61 70 20 70  Number of mmap p
7f00: 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 6f  ages currently o
7f10: 75 74 73 74 61 6e 64 69 6e 67 20 2a 2f 0a 20 20  utstanding */.  
7f20: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
7f30: 4d 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 44  Mmap;       /* D
7f40: 65 73 69 72 65 64 20 6d 61 78 69 6d 75 6d 20 6d  esired maximum m
7f50: 6d 61 70 20 73 69 7a 65 20 2a 2f 0a 20 20 50 67  map size */.  Pg
7f60: 48 64 72 20 2a 70 4d 6d 61 70 46 72 65 65 6c 69  Hdr *pMmapFreeli
7f70: 73 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  st;       /* Lis
7f80: 74 20 6f 66 20 66 72 65 65 20 6d 6d 61 70 20 70  t of free mmap p
7f90: 61 67 65 20 68 65 61 64 65 72 73 20 28 70 44 69  age headers (pDi
7fa0: 72 74 79 29 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a  rty) */.  /*.  *
7fb0: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 72 6f 75  * End of the rou
7fc0: 74 69 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20  tinely-changing 
7fd0: 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 0a 20 20  class members.  
7fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20  ***********/..  
8030: 75 31 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20  u16 nExtra;     
8040: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
8050: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  dd this many byt
8060: 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  es to each in-me
8070: 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
8080: 31 36 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20  16 nReserve;    
8090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
80a0: 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
80b0: 79 74 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65  ytes at end of e
80c0: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33  ach page */.  u3
80d0: 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20  2 vfsFlags;     
80e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
80f0: 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76  gs for sqlite3_v
8100: 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  fs.xOpen() */.  
8110: 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20  u32 sectorSize; 
8120: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
8130: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
8140: 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  ze during rollba
8150: 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65  ck */.  int page
8160: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
8170: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8180: 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65   bytes in a page
8190: 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e   */.  Pgno mxPgn
81a0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
81b0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c    /* Maximum all
81c0: 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65  owed size of the
81d0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
81e0: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  64 journalSizeLi
81f0: 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  mit;       /* Si
8200: 7a 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72  ze limit for per
8210: 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  sistent journal 
8220: 66 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  files */.  char 
8230: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
8240: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
8250: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
8260: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
8270: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
8280: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
8290: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
82a0: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73   */.  int (*xBus
82b0: 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29  yHandler)(void*)
82c0: 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f  ; /* Function to
82d0: 20 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20   call when busy 
82e0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
82f0: 48 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20  HandlerArg;     
8300: 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75   /* Context argu
8310: 6d 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61  ment for xBusyHa
8320: 6e 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61  ndler */.  int a
8330: 53 74 61 74 5b 33 5d 3b 20 20 20 20 20 20 20 20  Stat[3];        
8340: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
8350: 63 61 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73  cache hits, miss
8360: 65 73 20 61 6e 64 20 77 72 69 74 65 73 20 2a 2f  es and writes */
8370: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
8380: 45 53 54 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b  EST.  int nRead;
8390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83a0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61    /* Database pa
83b0: 67 65 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64  ges read */.#end
83c0: 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  if.  void (*xRei
83d0: 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b  niter)(DbPage*);
83e0: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
83f0: 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61  utine when reloa
8400: 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69  ding pages */.#i
8410: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
8420: 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a  CODEC.  void *(*
8430: 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f  xCodec)(void*,vo
8440: 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f  id*,Pgno,int); /
8450: 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e  * Routine for en
8460: 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a  /decoding data *
8470: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  /.  void (*xCode
8480: 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a  cSizeChng)(void*
8490: 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f  ,int,int); /* No
84a0: 74 69 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a  tify of page siz
84b0: 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76  e changes */.  v
84c0: 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65  oid (*xCodecFree
84d0: 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20  )(void*);       
84e0: 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63        /* Destruc
84f0: 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65  tor for the code
8500: 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f  c */.  void *pCo
8510: 64 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  dec;            
8520: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
8530: 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e  ment to xCodec..
8540: 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e  . methods */.#en
8550: 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70  dif.  char *pTmp
8560: 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
8570: 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53    /* Pager.pageS
8580: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  ize bytes of spa
8590: 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a  ce for tmp use *
85a0: 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43 61  /.  PCache *pPCa
85b0: 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  che;            
85c0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
85d0: 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20  ge cache object 
85e0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
85f0: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c  E_OMIT_WAL.  Wal
8600: 20 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20   *pWal;         
8610: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
8620: 65 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64  e-ahead log used
8630: 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   by "journal_mod
8640: 65 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72  e=wal" */.  char
8650: 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20   *zWal;         
8660: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
8670: 6e 61 6d 65 20 66 6f 72 20 77 72 69 74 65 2d 61  name for write-a
8680: 68 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64  head log */.#end
8690: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64  if.};../*.** Ind
86a0: 65 78 65 73 20 66 6f 72 20 75 73 65 20 77 69 74  exes for use wit
86b0: 68 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 2e  h Pager.aStat[].
86c0: 20 54 68 65 20 50 61 67 65 72 2e 61 53 74 61 74   The Pager.aStat
86d0: 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e  [] array contain
86e0: 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20  s.** the values 
86f0: 61 63 63 65 73 73 65 64 20 62 79 20 70 61 73 73  accessed by pass
8700: 69 6e 67 20 53 51 4c 49 54 45 5f 44 42 53 54 41  ing SQLITE_DBSTA
8710: 54 55 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 43  TUS_CACHE_HIT, C
8720: 41 43 48 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f 72  ACHE_MISS .** or
8730: 20 43 41 43 48 45 5f 57 52 49 54 45 20 74 6f 20   CACHE_WRITE to 
8740: 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
8750: 73 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  s()..*/.#define 
8760: 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54 20 20  PAGER_STAT_HIT  
8770: 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   0.#define PAGER
8780: 5f 53 54 41 54 5f 4d 49 53 53 20 20 31 0a 23 64  _STAT_MISS  1.#d
8790: 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54  efine PAGER_STAT
87a0: 5f 57 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20  _WRITE 2../*.** 
87b0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c  The following gl
87c0: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68  obal variables h
87d0: 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65  old counters use
87e0: 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
87f0: 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20   purposes only. 
8800: 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73   These variables
8810: 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e   do not exist in
8820: 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e  .** a non-testin
8830: 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20  g build.  These 
8840: 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f  variables are no
8850: 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a  t thread-safe..*
8860: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
8870: 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
8880: 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
8890: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
88a0: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61  umber of full pa
88b0: 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42  ges read from DB
88c0: 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   */.int sqlite3_
88d0: 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f  pager_writedb_co
88e0: 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75  unt = 0;   /* Nu
88f0: 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67  mber of full pag
8900: 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42  es written to DB
8910: 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   */.int sqlite3_
8920: 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75  pager_writej_cou
8930: 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75  nt = 0;    /* Nu
8940: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72  mber of pages wr
8950: 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c  itten to journal
8960: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47   */.# define PAG
8970: 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a  ER_INCR(v)  v++.
8980: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50  #else.# define P
8990: 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e  AGER_INCR(v).#en
89a0: 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75  dif..../*.** Jou
89b0: 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e  rnal files begin
89c0: 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
89d0: 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67  ing magic string
89e0: 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77  .  The data.** w
89f0: 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
8a00: 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49   /dev/random.  I
8a10: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61  t is used only a
8a20: 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b  s a sanity check
8a30: 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65  ..**.** Since ve
8a40: 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65  rsion 2.8.0, the
8a50: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
8a60: 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f  contains additio
8a70: 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68  nal sanity.** ch
8a80: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
8a90: 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65  on.  If the powe
8aa0: 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68  r fails while th
8ab0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69  e journal is bei
8ac0: 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73  ng.** written, s
8ad0: 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61  emi-random garba
8ae0: 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70  ge data might ap
8af0: 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72  pear in the jour
8b00: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65  nal.** file afte
8b10: 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f  r power is resto
8b20: 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65  red.  If an atte
8b30: 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65  mpt is then made
8b40: 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20  .** to roll the 
8b50: 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68  journal back, th
8b60: 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64  e database could
8b70: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20   be corrupted.  
8b80: 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a  The additional.*
8b90: 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * sanity checkin
8ba0: 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74  g data is an att
8bb0: 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72  empt to discover
8bc0: 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20   the garbage in 
8bd0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  the.** journal a
8be0: 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a  nd ignore it..**
8bf0: 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63  .** The sanity c
8c00: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
8c10: 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ion for the new 
8c20: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
8c30: 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20  onsists.** of a 
8c40: 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20  32-bit checksum 
8c50: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20  on each page of 
8c60: 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b  data.  The check
8c70: 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a  sum covers both.
8c80: 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ** the page numb
8c90: 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65  er and the pPage
8ca0: 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
8cb0: 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68  s of data for th
8cc0: 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20  e page..** This 
8cd0: 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c  cksum is initial
8ce0: 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74  ized to a 32-bit
8cf0: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68   random value th
8d00: 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  at appears in th
8d10: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
8d20: 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68  e right after th
8d30: 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72  e header.  The r
8d40: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65  andom initialize
8d50: 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a  r is important,.
8d60: 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61  ** because garba
8d70: 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70  ge data that app
8d80: 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20  ears at the end 
8d90: 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20  of a journal is 
8da0: 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74  likely.** data t
8db0: 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20  hat was once in 
8dc0: 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74  other files that
8dd0: 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64   have now been d
8de0: 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a  eleted.  If the.
8df0: 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20  ** garbage data 
8e00: 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73  came from an obs
8e10: 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69  olete journal fi
8e20: 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  le, the checksum
8e30: 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f  s might.** be co
8e40: 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69  rrect.  But by i
8e50: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
8e60: 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64  checksum to rand
8e70: 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a  om value which.*
8e80: 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  * is different f
8e90: 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c  or every journal
8ea0: 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68  , we minimize th
8eb0: 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74  at risk..*/.stat
8ec0: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
8ed0: 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d  d char aJournalM
8ee0: 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64  agic[] = {.  0xd
8ef0: 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30  9, 0xd5, 0x05, 0
8f00: 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c  xf9, 0x20, 0xa1,
8f10: 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a   0x63, 0xd7,.};.
8f20: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  ./*.** The size 
8f30: 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68 20 70  of the of each p
8f40: 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20 74 68  age record in th
8f50: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69 76  e journal is giv
8f60: 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c  en by.** the fol
8f70: 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f  lowing macro..*/
8f80: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
8f90: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20  _PG_SZ(pPager)  
8fa0: 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ((pPager->pageSi
8fb0: 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20  ze) + 8)../*.** 
8fc0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  The journal head
8fd0: 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73  er size for this
8fe0: 20 70 61 67 65 72 2e 20 54 68 69 73 20 69 73 20   pager. This is 
8ff0: 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61 6d 65  usually the same
9000: 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61 20 73   .** size as a s
9010: 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
9020: 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65 74 53  r. See also setS
9030: 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a  ectorSize()..*/.
9040: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
9050: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28  HDR_SZ(pPager) (
9060: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
9070: 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d  ze)../*.** The m
9080: 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72  acro MEMDB is tr
9090: 75 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61  ue if we are dea
90a0: 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d  ling with an in-
90b0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
90c0: 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61  .** We do this a
90d0: 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61  s a macro so tha
90e0: 74 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f  t if the SQLITE_
90f0: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61  OMIT_MEMORYDB ma
9100: 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74  cro is set,.** t
9110: 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44  he value of MEMD
9120: 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73  B will be a cons
9130: 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d  tant and the com
9140: 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d  piler will optim
9150: 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20  ize.** out code 
9160: 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72  that would never
9170: 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66   execute..*/.#if
9180: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9190: 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e  MEMORYDB.# defin
91a0: 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a  e MEMDB 0.#else.
91b0: 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70  # define MEMDB p
91c0: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e  Pager->memDb.#en
91d0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d  dif../*.** The m
91e0: 61 63 72 6f 20 55 53 45 46 45 54 43 48 20 69 73  acro USEFETCH is
91f0: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
9200: 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73 65 20 74  allowed to use t
9210: 68 65 20 78 46 65 74 63 68 20 61 6e 64 20 78 55  he xFetch and xU
9220: 6e 66 65 74 63 68 0a 2a 2a 20 69 6e 74 65 72 66  nfetch.** interf
9230: 61 63 65 73 20 74 6f 20 61 63 63 65 73 73 20 74  aces to access t
9240: 68 65 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  he database usin
9250: 67 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20  g memory-mapped 
9260: 49 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  I/O..*/.#if SQLI
9270: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
9280: 3e 30 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46  >0.# define USEF
9290: 45 54 43 48 28 78 29 20 28 28 78 29 2d 3e 62 55  ETCH(x) ((x)->bU
92a0: 73 65 46 65 74 63 68 29 0a 23 65 6c 73 65 0a 23  seFetch).#else.#
92b0: 20 64 65 66 69 6e 65 20 55 53 45 46 45 54 43 48   define USEFETCH
92c0: 28 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (x) 0.#endif../*
92d0: 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  .** The maximum 
92e0: 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  legal page numbe
92f0: 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e  r is (2^31 - 1).
9300: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45  .*/.#define PAGE
9310: 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34  R_MAX_PGNO 21474
9320: 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  83647../*.** The
9330: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
9340: 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66 69 6c  s macro is a fil
9350: 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 74 79  e descriptor (ty
9360: 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  pe sqlite3_file*
9370: 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69  )..** Return 0 i
9380: 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e  f it is not open
9390: 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62  , or non-zero (b
93a0: 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69 74 20  ut not 1) if it 
93b0: 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  is..**.** This i
93c0: 73 20 73 6f 20 74 68 61 74 20 65 78 70 72 65 73  s so that expres
93d0: 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77 72 69  sions can be wri
93e0: 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20  tten as:.**.**  
93f0: 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
9400: 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a  er->jfd) ){ ....
9410: 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66  **.** instead of
9420: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50 61  .**.**   if( pPa
9430: 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f  ger->jfd->pMetho
9440: 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65  ds ){ ....*/.#de
9450: 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46 64 29  fine isOpen(pFd)
9460: 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64   ((pFd)->pMethod
9470: 73 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  s!=0)../*.** Ret
9480: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 69 73  urn true if this
9490: 20 70 61 67 65 72 20 75 73 65 73 20 61 20 77 72   pager uses a wr
94a0: 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 69 6e  ite-ahead log in
94b0: 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75  stead of the usu
94c0: 61 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  al.** rollback j
94d0: 6f 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77 69 73  ournal. Otherwis
94e0: 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69 66 6e  e false..*/.#ifn
94f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9500: 57 41 4c 0a 73 74 61 74 69 63 20 69 6e 74 20 70  WAL.static int p
9510: 61 67 65 72 55 73 65 57 61 6c 28 50 61 67 65 72  agerUseWal(Pager
9520: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
9530: 75 72 6e 20 28 70 50 61 67 65 72 2d 3e 70 57 61  urn (pPager->pWa
9540: 6c 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  l!=0);.}.#else.#
9550: 20 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65   define pagerUse
9560: 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e  Wal(x) 0.# defin
9570: 65 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57  e pagerRollbackW
9580: 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65  al(x) 0.# define
9590: 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28   pagerWalFrames(
95a0: 76 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64 65 66  v,w,x,y) 0.# def
95b0: 69 6e 65 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  ine pagerOpenWal
95c0: 49 66 50 72 65 73 65 6e 74 28 7a 29 20 53 51 4c  IfPresent(z) SQL
95d0: 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20  ITE_OK.# define 
95e0: 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72  pagerBeginReadTr
95f0: 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c  ansaction(z) SQL
9600: 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23  ITE_OK.#endif..#
9610: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 2f  ifndef NDEBUG ./
9620: 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a  *.** Usage:.**.*
9630: 2a 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65  *   assert( asse
9640: 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
9650: 50 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20  Pager) );.**.** 
9660: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 75  This function ru
9670: 6e 73 20 6d 61 6e 79 20 61 73 73 65 72 74 73 20  ns many asserts 
9680: 74 6f 20 74 72 79 20 74 6f 20 66 69 6e 64 20 69  to try to find i
9690: 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65 73 20 69  nconsistencies i
96a0: 6e 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 6e 61  n.** the interna
96b0: 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50  l state of the P
96c0: 61 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  ager object..*/.
96d0: 73 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72  static int asser
96e0: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61  t_pager_state(Pa
96f0: 67 65 72 20 2a 70 29 7b 0a 20 20 50 61 67 65 72  ger *p){.  Pager
9700: 20 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20   *pPager = p;.. 
9710: 20 2f 2a 20 53 74 61 74 65 20 6d 75 73 74 20 62   /* State must b
9720: 65 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73  e valid. */.  as
9730: 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 3d  sert( p->eState=
9740: 3d 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20  =PAGER_OPEN.    
9750: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
9760: 3d 50 41 47 45 52 5f 52 45 41 44 45 52 0a 20 20  =PAGER_READER.  
9770: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9780: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
9790: 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c  LOCKED.       ||
97a0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
97b0: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
97c0: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
97d0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
97e0: 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20  TER_DBMOD.      
97f0: 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50   || p->eState==P
9800: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
9810: 53 48 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  SHED.       || p
9820: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9830: 45 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a  ERROR.  );..  /*
9840: 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   Regardless of t
9850: 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
9860: 2c 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f  , a temp-file co
9870: 6e 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  nnection always 
9880: 62 65 68 61 76 65 73 0a 20 20 2a 2a 20 61 73 20  behaves.  ** as 
9890: 69 66 20 69 74 20 68 61 73 20 61 6e 20 65 78 63  if it has an exc
98a0: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74  lusive lock on t
98b0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
98c0: 2e 20 49 74 20 6e 65 76 65 72 20 75 70 64 61 74  . It never updat
98d0: 65 73 0a 20 20 2a 2a 20 74 68 65 20 63 68 61 6e  es.  ** the chan
98e0: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
98f0: 2c 20 73 6f 20 74 68 65 20 63 68 61 6e 67 65 43  , so the changeC
9900: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
9910: 20 61 6c 77 61 79 73 20 73 65 74 2e 0a 20 20 2a   always set..  *
9920: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 74  /.  assert( p->t
9930: 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d  empFile==0 || p-
9940: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
9950: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  E_LOCK );.  asse
9960: 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d  rt( p->tempFile=
9970: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68  =0 || pPager->ch
9980: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b  angeCountDone );
9990: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73  ..  /* If the us
99a0: 65 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20 69 73  eJournal flag is
99b0: 20 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f 75 72   clear, the jour
99c0: 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65  nal-mode must be
99d0: 20 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e   "OFF". .  ** An
99e0: 64 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d if the journal
99f0: 2d 6d 6f 64 65 20 69 73 20 22 4f 46 46 22 2c 20  -mode is "OFF", 
9a00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9a10: 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f 70 65   must not be ope
9a20: 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  n..  */.  assert
9a30: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
9a40: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9a50: 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73  ODE_OFF || p->us
9a60: 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
9a70: 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c  sert( p->journal
9a80: 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
9a90: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21  NALMODE_OFF || !
9aa0: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29  isOpen(p->jfd) )
9ab0: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
9ac0: 61 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73  at MEMDB implies
9ad0: 20 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20   noSync. And an 
9ae0: 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
9af0: 6c 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74  l. Since .  ** t
9b00: 68 69 73 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d  his means an in-
9b10: 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 70 65 72  memory pager per
9b20: 66 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61  forms no IO at a
9b30: 6c 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e  ll, it cannot en
9b40: 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69  counter .  ** ei
9b50: 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52  ther SQLITE_IOER
9b60: 52 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c  R or SQLITE_FULL
9b70: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
9b80: 20 6f 72 20 77 68 69 6c 65 20 66 69 6e 61 6c 69   or while finali
9b90: 7a 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75  zing .  ** a jou
9ba0: 72 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68  rnal file. (alth
9bb0: 6f 75 67 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  ough the in-memo
9bc0: 72 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65  ry journal imple
9bd0: 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20  mentation may . 
9be0: 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
9bf0: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68  E_IOERR_NOMEM wh
9c00: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
9c10: 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20 77 72  file is being wr
9c20: 69 74 74 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a  itten). It .  **
9c30: 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6e 6f   is therefore no
9c40: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
9c50: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  n in-memory page
9c60: 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45  r to enter the E
9c70: 52 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61 74 65  RROR .  ** state
9c80: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d  ..  */.  if( MEM
9c90: 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  DB ){.    assert
9ca0: 28 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20  ( p->noSync );. 
9cb0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f     assert( p->jo
9cc0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
9cd0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
9ce0: 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d   .         || p-
9cf0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
9d00: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
9d10: 4d 45 4d 4f 52 59 20 0a 20 20 20 20 29 3b 0a 20  MEMORY .    );. 
9d20: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 53     assert( p->eS
9d30: 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
9d40: 52 20 26 26 20 70 2d 3e 65 53 74 61 74 65 21 3d  R && p->eState!=
9d50: 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20  PAGER_OPEN );.  
9d60: 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
9d70: 73 65 57 61 6c 28 70 29 3d 3d 30 20 29 3b 0a 20  seWal(p)==0 );. 
9d80: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 68 61 6e   }..  /* If chan
9d90: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 69 73 20 73  geCountDone is s
9da0: 65 74 2c 20 61 20 52 45 53 45 52 56 45 44 20 6c  et, a RESERVED l
9db0: 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d  ock or greater m
9dc0: 75 73 74 20 62 65 20 68 65 6c 64 0a 20 20 2a 2a  ust be held.  **
9dd0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 20 20   on the file..  
9de0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
9df0: 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
9e00: 44 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  Done==0 || pPage
9e10: 72 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  r->eLock>=RESERV
9e20: 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
9e30: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 50  ert( p->eLock!=P
9e40: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 0a  ENDING_LOCK );..
9e50: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65 53 74    switch( p->eSt
9e60: 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ate ){.    case 
9e70: 50 41 47 45 52 5f 4f 50 45 4e 3a 0a 20 20 20 20  PAGER_OPEN:.    
9e80: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
9e90: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9ea0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
9eb0: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
9ec0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
9ed0: 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
9ee0: 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
9ef0: 63 68 65 29 3d 3d 30 20 7c 7c 20 70 50 61 67 65  che)==0 || pPage
9f00: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
9f10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
9f20: 20 63 61 73 65 20 50 41 47 45 52 5f 52 45 41 44   case PAGER_READ
9f30: 45 52 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  ER:.      assert
9f40: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
9f50: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
9f60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
9f70: 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock!=UNKNOWN_
9f80: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
9f90: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d  sert( p->eLock>=
9fa0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
9fb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
9fc0: 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54   case PAGER_WRIT
9fd0: 45 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20 20 20  ER_LOCKED:.     
9fe0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
9ff0: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
a000: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a010: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a020: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
a030: 20 20 20 20 20 69 66 28 20 21 70 61 67 65 72 55       if( !pagerU
a040: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
a050: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a060: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52   p->eLock>=RESER
a070: 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  VED_LOCK );.    
a080: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
a090: 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
a0a0: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ==pPager->dbOrig
a0b0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Size );.      as
a0c0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a0d0: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
a0e0: 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a  ->dbFileSize );.
a0f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a100: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
a110: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  ==pPager->dbHint
a120: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Size );.      as
a130: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65  sert( pPager->se
a140: 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20  tMaster==0 );.  
a150: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
a160: 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54 45  case PAGER_WRITE
a170: 52 5f 43 41 43 48 45 4d 4f 44 3a 0a 20 20 20 20  R_CACHEMOD:.    
a180: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a190: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
a1a0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a1b0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
a1c0: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
a1d0: 20 20 20 20 20 20 69 66 28 20 21 70 61 67 65 72        if( !pager
a1e0: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
a1f0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 74 20  {.        /* It 
a200: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
a210: 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   if journal_mode
a220: 3d 77 61 6c 20 68 65 72 65 20 74 68 61 74 20 6e  =wal here that n
a230: 65 69 74 68 65 72 20 74 68 65 0a 20 20 20 20 20  either the.     
a240: 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
a250: 6c 65 20 6e 6f 72 20 74 68 65 20 57 41 4c 20 66  le nor the WAL f
a260: 69 6c 65 20 61 72 65 20 6f 70 65 6e 2e 20 54 68  ile are open. Th
a270: 69 73 20 68 61 70 70 65 6e 73 20 64 75 72 69 6e  is happens durin
a280: 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 72  g.        ** a r
a290: 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61 63 74  ollback transact
a2a0: 69 6f 6e 20 74 68 61 74 20 73 77 69 74 63 68 65  ion that switche
a2b0: 73 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 5f 6d  s from journal_m
a2c0: 6f 64 65 3d 6f 66 66 0a 20 20 20 20 20 20 20 20  ode=off.        
a2d0: 2a 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  ** to journal_mo
a2e0: 64 65 3d 77 61 6c 2e 0a 20 20 20 20 20 20 20 20  de=wal..        
a2f0: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
a300: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53  t( p->eLock>=RES
a310: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
a320: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
a330: 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20  Open(p->jfd) .  
a340: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a350: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a360: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a370: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
a380: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a390: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a3a0: 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
a3b0: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
a3c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a3d0: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
a3e0: 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  =pPager->dbFileS
a3f0: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
a400: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
a410: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
a420: 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20  >dbHintSize );. 
a430: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
a440: 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49 54   case PAGER_WRIT
a450: 45 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20 20 20  ER_DBMOD:.      
a460: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a470: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
a480: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a490: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
a4a0: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
a4b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
a4c0: 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
a4d0: 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  r) );.      asse
a4e0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 45 58  rt( p->eLock>=EX
a4f0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
a500: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
a510: 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20  Open(p->jfd) .  
a520: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a530: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a540: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
a550: 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  F .           ||
a560: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a570: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a580: 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b  DE_WAL .      );
a590: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a5a0: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a5b0: 65 3c 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  e<=pPager->dbHin
a5c0: 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62  tSize );.      b
a5d0: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a5e0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e  PAGER_WRITER_FIN
a5f0: 49 53 48 45 44 3a 0a 20 20 20 20 20 20 61 73 73  ISHED:.      ass
a600: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45  ert( p->eLock==E
a610: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
a620: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a630: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
a640: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
a650: 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65     assert( !page
a660: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
a670: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a680: 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20   isOpen(p->jfd) 
a690: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
a6a0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
a6b0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
a6c0: 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20  _OFF .          
a6d0: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f   || p->journalMo
a6e0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
a6f0: 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20  LMODE_WAL .     
a700: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
a710: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
a720: 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 2f 2a  _ERROR:.      /*
a730: 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
a740: 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73  t least one outs
a750: 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
a760: 65 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 69  e to the pager i
a770: 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 45 52  f.      ** in ER
a780: 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72  ROR state. Other
a790: 77 69 73 65 20 74 68 65 20 70 61 67 65 72 20 73  wise the pager s
a7a0: 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
a7b0: 64 79 20 64 72 6f 70 70 65 64 0a 20 20 20 20 20  dy dropped.     
a7c0: 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e   ** back to OPEN
a7d0: 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f   state..      */
a7e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a7f0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
a800: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
a810: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
a820: 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
a830: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
a840: 29 3e 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  )>0 );.      bre
a850: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ak;.  }..  retur
a860: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
a870: 20 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a   ifndef NDEBUG *
a880: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
a890: 5f 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65  _DEBUG ./*.** Re
a8a0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
a8b0: 6f 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62  o a human readab
a8c0: 6c 65 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73  le string in a s
a8d0: 74 61 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20  tatic buffer.** 
a8e0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73  containing the s
a8f0: 74 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65  tate of the Page
a900: 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  r object passed 
a910: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20  as an argument. 
a920: 54 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e  This.** is inten
a930: 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 77  ded to be used w
a940: 69 74 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e  ithin debuggers.
a950: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73   For example, as
a960: 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a   an alternative.
a970: 2a 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50  ** to "print *pP
a980: 61 67 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a  ager" in gdb:.**
a990: 0a 2a 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66  .** (gdb) printf
a9a0: 20 22 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67   "%s", print_pag
a9b0: 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
a9c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
a9d0: 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61  *print_pager_sta
a9e0: 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20  te(Pager *p){.  
a9f0: 73 74 61 74 69 63 20 63 68 61 72 20 7a 52 65 74  static char zRet
aa00: 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74  [1024];..  sqlit
aa10: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32 34  e3_snprintf(1024
aa20: 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22 46  , zRet,.      "F
aa30: 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25 73  ilename:      %s
aa40: 5c 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74 65  \n".      "State
aa50: 3a 20 20 20 20 20 20 20 20 20 25 73 20 65 72 72  :         %s err
aa60: 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20  Code=%d\n".     
aa70: 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20 20   "Lock:         
aa80: 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f   %s\n".      "Lo
aa90: 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63  cking mode:  loc
aaa0: 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a  king_mode=%s\n".
aab0: 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d        "Journal m
aac0: 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  ode:  journal_mo
aad0: 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22  de=%s\n".      "
aae0: 42 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74  Backing store: t
aaf0: 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62  empFile=%d memDb
ab00: 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25  =%d useJournal=%
ab10: 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72  d\n".      "Jour
ab20: 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e  nal:       journ
ab30: 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e  alOff=%lld journ
ab40: 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20  alHdr=%lld\n".  
ab50: 20 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20 20      "Size:      
ab60: 20 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64 62      dbsize=%d db
ab70: 4f 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46 69  OrigSize=%d dbFi
ab80: 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20  leSize=%d\n".   
ab90: 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d     , p->zFilenam
aba0: 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53 74  e.      , p->eSt
abb0: 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
abc0: 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f 50             ? "OP
abd0: 45 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  EN" :.        p-
abe0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
abf0: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 3f  EADER          ?
ac00: 20 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20 20   "READER" :.    
ac10: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
ac20: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
ac30: 45 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f 4c  ED   ? "WRITER_L
ac40: 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20 20  OCKED" :.       
ac50: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
ac60: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
ac70: 44 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43 48  D ? "WRITER_CACH
ac80: 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20  EMOD" :.        
ac90: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
aca0: 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20  _WRITER_DBMOD   
acb0: 20 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f 44   ? "WRITER_DBMOD
acc0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
acd0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
ace0: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 3f 20 22  TER_FINISHED ? "
acf0: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 22  WRITER_FINISHED"
ad00: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
ad10: 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
ad20: 52 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 45  R           ? "E
ad30: 52 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f  RROR" : "?error?
ad40: 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  ".      , (int)p
ad50: 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20  ->errCode.      
ad60: 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  , p->eLock==NO_L
ad70: 4f 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22 4e  OCK         ? "N
ad80: 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20  O_LOCK" :.      
ad90: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45    p->eLock==RESE
ada0: 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52  RVED_LOCK   ? "R
adb0: 45 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20 20  ESERVED" :.     
adc0: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43     p->eLock==EXC
add0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22  LUSIVE_LOCK  ? "
ade0: 45 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20 20  EXCLUSIVE" :.   
adf0: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53       p->eLock==S
ae00: 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f  HARED_LOCK     ?
ae10: 20 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20 20   "SHARED" :.    
ae20: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e      p->eLock==UN
ae30: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20  KNOWN_LOCK    ? 
ae40: 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72  "UNKNOWN" : "?er
ae50: 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d  ror?".      , p-
ae60: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f  >exclusiveMode ?
ae70: 20 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20 22   "exclusive" : "
ae80: 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20  normal".      , 
ae90: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
aea0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
aeb0: 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65  E_MEMORY   ? "me
aec0: 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20 20  mory" :.        
aed0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
aee0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
aef0: 45 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f 66  E_OFF      ? "of
af00: 66 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  f" :.        p->
af10: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
af20: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
af30: 45 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65 74  ELETE   ? "delet
af40: 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  e" :.        p->
af50: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
af60: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
af70: 45 52 53 49 53 54 20 20 3f 20 22 70 65 72 73 69  ERSIST  ? "persi
af80: 73 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  st" :.        p-
af90: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
afa0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
afb0: 54 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75 6e  TRUNCATE ? "trun
afc0: 63 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20  cate" :.        
afd0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
afe0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
aff0: 45 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77 61  E_WAL      ? "wa
b000: 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  l" : "?error?". 
b010: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74       , (int)p->t
b020: 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d  empFile, (int)p-
b030: 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e  >memDb, (int)p->
b040: 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  useJournal.     
b050: 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66   , p->journalOff
b060: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a  , p->journalHdr.
b070: 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e        , (int)p->
b080: 64 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e  dbSize, (int)p->
b090: 64 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e 74  dbOrigSize, (int
b0a0: 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20  )p->dbFileSize. 
b0b0: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52   );..  return zR
b0c0: 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  et;.}.#endif../*
b0d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
b0e0: 69 66 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  if it is necessa
b0f0: 72 79 20 74 6f 20 77 72 69 74 65 20 70 61 67 65  ry to write page
b100: 20 2a 70 50 67 20 69 6e 74 6f 20 74 68 65 20 73   *pPg into the s
b110: 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41  ub-journal..** A
b120: 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
b130: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
b140: 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
b150: 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6f  f there exists o
b160: 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70  ne.** or more op
b170: 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 66 6f  en savepoints fo
b180: 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20  r which:.**.**  
b190: 20 2a 20 54 68 65 20 70 61 67 65 2d 6e 75 6d 62   * The page-numb
b1a0: 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  er is less than 
b1b0: 6f 72 20 65 71 75 61 6c 20 74 6f 20 50 61 67 65  or equal to Page
b1c0: 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67  rSavepoint.nOrig
b1d0: 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65  , and.**   * The
b1e0: 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69   bit correspondi
b1f0: 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 2d 6e  ng to the page-n
b200: 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 73 65 74  umber is not set
b210: 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67 65 72   in.**     Pager
b220: 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
b230: 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  epoint..*/.stati
b240: 63 20 69 6e 74 20 73 75 62 6a 52 65 71 75 69 72  c int subjRequir
b250: 65 73 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  esPage(PgHdr *pP
b260: 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
b270: 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
b280: 72 3b 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f  r;.  PagerSavepo
b290: 69 6e 74 20 2a 70 3b 0a 20 20 50 67 6e 6f 20 70  int *p;.  Pgno p
b2a0: 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
b2b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
b2c0: 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e  i=0; i<pPager->n
b2d0: 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b  Savepoint; i++){
b2e0: 0a 20 20 20 20 70 20 3d 20 26 70 50 61 67 65 72  .    p = &pPager
b2f0: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b  ->aSavepoint[i];
b300: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69  .    if( p->nOri
b310: 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71  g>=pgno && 0==sq
b320: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 4e  lite3BitvecTestN
b330: 6f 74 4e 75 6c 6c 28 70 2d 3e 70 49 6e 53 61 76  otNull(p->pInSav
b340: 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b  epoint, pgno) ){
b350: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
b360: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
b370: 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66  urn 0;.}..#ifdef
b380: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
b390: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
b3a0: 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 61  if the page is a
b3b0: 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f  lready in the jo
b3c0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73  urnal file..*/.s
b3d0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e  tatic int pageIn
b3e0: 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
b3f0: 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50  Pager, PgHdr *pP
b400: 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  g){.  return sql
b410: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
b420: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
b430: 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d  l, pPg->pgno);.}
b440: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
b450: 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ead a 32-bit int
b460: 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69  eger from the gi
b470: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
b480: 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20  tor.  Store the 
b490: 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20  integer.** that 
b4a0: 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73  is read in *pRes
b4b0: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
b4c0: 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
b4d0: 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a  g worked, or an.
b4e0: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
b4f0: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
b500: 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  wrong..**.** All
b510: 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72   values are stor
b520: 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69  ed on disk as bi
b530: 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61  g-endian..*/.sta
b540: 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69  tic int read32bi
b550: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
b560: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
b570: 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75   u32 *pRes){.  u
b580: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
b590: 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  4];.  int rc = s
b5a0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
b5b0: 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c   ac, sizeof(ac),
b5c0: 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20   offset);.  if( 
b5d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
b5e0: 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c  .    *pRes = sql
b5f0: 69 74 65 33 47 65 74 34 62 79 74 65 28 61 63 29  ite3Get4byte(ac)
b600: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
b610: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
b620: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
b630: 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67  er into a string
b640: 20 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65   buffer in big-e
b650: 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72  ndian byte order
b660: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74  ..*/.#define put
b670: 33 32 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c  32bits(A,B)  sql
b680: 69 74 65 33 50 75 74 34 62 79 74 65 28 28 75 38  ite3Put4byte((u8
b690: 2a 29 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57  *)A,B).../*.** W
b6a0: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
b6b0: 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67  teger into the g
b6c0: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
b6d0: 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ptor.  Return SQ
b6e0: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
b6f0: 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
b700: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
b710: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
b720: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
b730: 69 74 65 33 32 62 69 74 73 28 73 71 6c 69 74 65  ite32bits(sqlite
b740: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
b750: 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29  offset, u32 val)
b760: 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  {.  char ac[4];.
b770: 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20    put32bits(ac, 
b780: 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  val);.  return s
b790: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64  qlite3OsWrite(fd
b7a0: 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29  , ac, 4, offset)
b7b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  ;.}../*.** Unloc
b7c0: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
b7d0: 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f  ile to level eLo
b7e0: 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62  ck, which must b
b7f0: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
b800: 0a 2a 2a 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  .** or SHARED_LO
b810: 43 4b 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  CK. Regardless o
b820: 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  f whether or not
b830: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78 55 6e   the call to xUn
b840: 6c 6f 63 6b 28 29 0a 2a 2a 20 73 75 63 63 65 65  lock().** succee
b850: 64 73 2c 20 73 65 74 20 74 68 65 20 50 61 67 65  ds, set the Page
b860: 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  r.eLock variable
b870: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 28 61   to match the (a
b880: 74 74 65 6d 70 74 65 64 29 20 6e 65 77 20 6c 6f  ttempted) new lo
b890: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  ck..**.** Except
b8a0: 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b  , if Pager.eLock
b8b0: 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   is set to UNKNO
b8c0: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69  WN_LOCK when thi
b8d0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
b8e0: 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20   called, do not 
b8f0: 6d 6f 64 69 66 79 20 69 74 2e 20 53 65 65 20 74  modify it. See t
b900: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
b910: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
b920: 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  .** UNKNOWN_LOCK
b930: 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
b940: 69 6f 6e 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a  ion of this..*/.
b950: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
b960: 55 6e 6c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a  UnlockDb(Pager *
b970: 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63  pPager, int eLoc
b980: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
b990: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
b9a0: 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 65 78  ert( !pPager->ex
b9b0: 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
b9c0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c  Pager->eLock==eL
b9d0: 6f 63 6b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ock );.  assert(
b9e0: 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20   eLock==NO_LOCK 
b9f0: 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  || eLock==SHARED
ba00: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
ba10: 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43  t( eLock!=NO_LOC
ba20: 4b 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c  K || pagerUseWal
ba30: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
ba40: 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
ba50: 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
ba60: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
ba70: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20  Lock>=eLock );. 
ba80: 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
ba90: 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49 54 45 5f  noLock ? SQLITE_
baa0: 4f 4b 20 3a 20 73 71 6c 69 74 65 33 4f 73 55 6e  OK : sqlite3OsUn
bab0: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
bac0: 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   eLock);.    if(
bad0: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d   pPager->eLock!=
bae0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a  UNKNOWN_LOCK ){.
baf0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c        pPager->eL
bb00: 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b  ock = (u8)eLock;
bb10: 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41  .    }.    IOTRA
bb20: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25  CE(("UNLOCK %p %
bb30: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c  d\n", pPager, eL
bb40: 6f 63 6b 29 29 0a 20 20 7d 0a 20 20 72 65 74 75  ock)).  }.  retu
bb50: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
bb60: 4c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  Lock the databas
bb70: 65 20 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20  e file to level 
bb80: 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73  eLock, which mus
bb90: 74 20 62 65 20 65 69 74 68 65 72 20 53 48 41 52  t be either SHAR
bba0: 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45  ED_LOCK,.** RESE
bbb0: 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43  RVED_LOCK or EXC
bbc0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20  LUSIVE_LOCK. If 
bbd0: 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 73 75  the caller is su
bbe0: 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
bbf0: 65 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b  e.** Pager.eLock
bc00: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
bc10: 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61   new locking sta
bc20: 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70  te. .**.** Excep
bc30: 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63  t, if Pager.eLoc
bc40: 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e  k is set to UNKN
bc50: 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68  OWN_LOCK when th
bc60: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a  is function is .
bc70: 2a 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f  ** called, do no
bc80: 74 20 6d 6f 64 69 66 79 20 69 74 20 75 6e 6c 65  t modify it unle
bc90: 73 73 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69  ss the new locki
bca0: 6e 67 20 73 74 61 74 65 20 69 73 20 45 58 43 4c  ng state is EXCL
bcb0: 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20  USIVE_LOCK. .** 
bcc0: 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  See the comment 
bcd0: 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
bce0: 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  e of UNKNOWN_LOC
bcf0: 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  K for an explana
bd00: 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73  tion .** of this
bd10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bd20: 70 61 67 65 72 4c 6f 63 6b 44 62 28 50 61 67 65  pagerLockDb(Page
bd30: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
bd40: 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20  Lock){.  int rc 
bd50: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
bd60: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53  assert( eLock==S
bd70: 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  HARED_LOCK || eL
bd80: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
bd90: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43  CK || eLock==EXC
bda0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
bdb0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f   if( pPager->eLo
bdc0: 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67  ck<eLock || pPag
bdd0: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f  er->eLock==UNKNO
bde0: 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  WN_LOCK ){.    r
bdf0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f  c = pPager->noLo
be00: 63 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ck ? SQLITE_OK :
be10: 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
be20: 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b  Pager->fd, eLock
be30: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
be40: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 61  QLITE_OK && (pPa
be50: 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ger->eLock!=UNKN
be60: 4f 57 4e 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d  OWN_LOCK||eLock=
be70: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
be80: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
be90: 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c  ->eLock = (u8)eL
bea0: 6f 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ock;.      IOTRA
beb0: 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c  CE(("LOCK %p %d\
bec0: 6e 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63  n", pPager, eLoc
bed0: 6b 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  k)).    }.  }.  
bee0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
bef0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
bf00: 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65  n determines whe
bf10: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
bf20: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
bf30: 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e  imization.** can
bf40: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68   be used with th
bf50: 69 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70  is pager. The op
bf60: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
bf70: 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a  e used if:.**.**
bf80: 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20    (a) the value 
bf90: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65  returned by OsDe
bfa0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
bfb0: 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20  ics() indicates 
bfc0: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64  that.**      a d
bfd0: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79  atabase page may
bfe0: 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
bff0: 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20  ically, and.**  
c000: 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (b) the value re
c010: 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74  turned by OsSect
c020: 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73  orSize() is less
c030: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
c040: 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61  *      to the pa
c050: 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54  ge size..**.** T
c060: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
c070: 69 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65  is also always e
c080: 6e 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f  nabled for tempo
c090: 72 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69  rary files. It i
c0a0: 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  s.** an error to
c0b0: 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
c0c0: 69 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73  ion if pPager is
c0d0: 20 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e   opened on an in
c0e0: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62  -memory.** datab
c0f0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
c100: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
c110: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30  annot be used, 0
c120: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
c130: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
c140: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c  .** then the val
c150: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
c160: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
c170: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
c180: 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   it.** contains 
c190: 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f  rollback data fo
c1a0: 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  r exactly one pa
c1b0: 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ge..*/.#ifdef SQ
c1c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
c1d0: 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20  IC_WRITE.static 
c1e0: 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  int jrnlBufferSi
c1f0: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
c200: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  ){.  assert( !ME
c210: 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50  MDB );.  if( !pP
c220: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
c230: 7b 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20  {.    int dc;   
c240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c250: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
c260: 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
c270: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  s */.    int nSe
c280: 63 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  ctor;           
c290: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
c2a0: 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20  ctor size */.   
c2b0: 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20   int szPage;    
c2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2d0: 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20     /* Page size 
c2e0: 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
c2f0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
c300: 64 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73  d) );.    dc = s
c310: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
c320: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
c330: 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e  ager->fd);.    n
c340: 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d  Sector = pPager-
c350: 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
c360: 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
c370: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20  ->pageSize;..   
c380: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
c390: 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
c3a0: 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61  (512>>8));.    a
c3b0: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
c3c0: 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
c3d0: 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69  5536>>8));.    i
c3e0: 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54  f( 0==(dc&(SQLIT
c3f0: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
c400: 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e  szPage>>8)) || n
c410: 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29  Sector>szPage) )
c420: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
c430: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
c440: 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44  eturn JOURNAL_HD
c450: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a  R_SZ(pPager) + J
c460: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
c470: 67 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ger);.}.#endif..
c480: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
c490: 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64  CHECK_PAGES is d
c4a0: 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64  efined then we d
c4b0: 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68  o some sanity ch
c4c0: 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ecking.** on the
c4d0: 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68   cache using a h
c4e0: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ash function.  T
c4f0: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
c500: 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64  testing.** and d
c510: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
c520: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
c530: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a  CHECK_PAGES./*.*
c540: 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69  * Return a 32-bi
c550: 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61  t hash of the pa
c560: 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  ge data for pPag
c570: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  e..*/.static u32
c580: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
c590: 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67  int nByte, unsig
c5a0: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29  ned char *pData)
c5b0: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
c5c0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
c5d0: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
c5e0: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
c5f0: 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44  (hash*1039) + pD
c600: 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ata[i];.  }.  re
c610: 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61  turn hash;.}.sta
c620: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
c630: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
c640: 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  age){.  return p
c650: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
c660: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
c670: 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64  eSize, (unsigned
c680: 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70   char *)pPage->p
c690: 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Data);.}.static 
c6a0: 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70  void pager_set_p
c6b0: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
c6c0: 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e  Page){.  pPage->
c6d0: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
c6e0: 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29  _pagehash(pPage)
c6f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
c700: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
c710: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
c720: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
c730: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
c740: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
c750: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
c760: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
c770: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
c780: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
c790: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
c7a0: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
c7b0: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
c7c0: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
c7d0: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
c7e0: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
c7f0: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
c800: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
c810: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
c820: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
c830: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
c840: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c850: 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
c860: 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
c870: 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  t( (pPg->flags&P
c880: 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70  GHDR_DIRTY) || p
c890: 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61  Pg->pageHash==pa
c8a0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
c8b0: 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64  ) );.}..#else.#d
c8c0: 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61  efine pager_data
c8d0: 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65  hash(X,Y)  0.#de
c8e0: 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68  fine pager_pageh
c8f0: 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e  ash(X)  0.#defin
c900: 65 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  e pager_set_page
c910: 68 61 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20  hash(X).#define 
c920: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
c930: 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ndif  /* SQLITE_
c940: 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a  CHECK_PAGES */..
c950: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
c960: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f  is called the jo
c970: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
c980: 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74  ager pPager must
c990: 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69   be open..** Thi
c9a0: 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
c9b0: 70 74 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61  pts to read a ma
c9c0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
c9d0: 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  e name from the 
c9e0: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66  .** end of the f
c9f0: 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63  ile and, if succ
ca00: 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69  essful, copies i
ca10: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75  t into memory su
ca20: 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68  pplied .** by th
ca30: 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f  e caller. See co
ca40: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69  mments above wri
ca50: 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
ca60: 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74  ) for the format
ca70: 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72  .** used to stor
ca80: 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  e a master journ
ca90: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20  al file name at 
caa0: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
cab0: 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
cac0: 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f   zMaster must po
cad0: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
cae0: 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73  of at least nMas
caf0: 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  ter bytes alloca
cb00: 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61  ted by.** the ca
cb10: 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c  ller. This shoul
cb20: 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73  d be sqlite3_vfs
cb30: 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74  .mxPathname+1 (t
cb40: 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69  o ensure there i
cb50: 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63  s.** enough spac
cb60: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d  e to write the m
cb70: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
cb80: 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74  me). If the mast
cb90: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61  er journal.** na
cba0: 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  me in the journa
cbb0: 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e  l is longer than
cbc0: 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28   nMaster bytes (
cbd0: 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e  including a.** n
cbe0: 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20  ul-terminator), 
cbf0: 74 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e  then this is han
cc00: 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61  dled as if no ma
cc10: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
cc20: 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  e.** were presen
cc30: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
cc40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73  ..**.** If a mas
cc50: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cc60: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
cc70: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
cc80: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
cc90: 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63  le, then it is c
cca0: 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62  opied into the b
ccb0: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
ccc0: 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a   by zMaster. A.*
ccd0: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
cce0: 20 62 79 74 65 20 69 73 20 61 70 70 65 6e 64 65   byte is appende
ccf0: 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
cd00: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61  following the ma
cd10: 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
cd20: 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  file name..**.**
cd30: 20 49 66 20 69 74 20 69 73 20 64 65 74 65 72 6d   If it is determ
cd40: 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73  ined that no mas
cd50: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
cd60: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
cd70: 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20   .** zMaster[0] 
cd80: 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  is set to 0 and 
cd90: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
cda0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
cdb0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
cdc0: 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  le reading from 
cdd0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
cde0: 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65  , an SQLite.** e
cdf0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
ce00: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
ce10: 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a   int readMasterJ
ce20: 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66  ournal(sqlite3_f
ce30: 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72  ile *pJrnl, char
ce40: 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e   *zMaster, u32 n
ce50: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
ce60: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
ce70: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
ce80: 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65  code */.  u32 le
ce90: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
cea0: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69       /* Length i
ceb0: 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65  n bytes of maste
cec0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
ced0: 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  /.  i64 szJ;    
cee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cef0: 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20  * Total size in 
cf00: 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c  bytes of journal
cf10: 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20   file pJrnl */. 
cf20: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
cf40: 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  J checksum value
cf50: 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e   read from journ
cf60: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
cf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf80: 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
cf90: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
cfa0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
cfb0: 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41  Magic[8];   /* A
cfc0: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
cfd0: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
cfe0: 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d   */.  zMaster[0]
cff0: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20   = '\0';..  if( 
d000: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
d010: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
d020: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29  ze(pJrnl, &szJ))
d030: 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20  .   || szJ<16.  
d040: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
d050: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
d060: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26  pJrnl, szJ-16, &
d070: 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e  len)).   || len>
d080: 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20  =nMaster .   || 
d090: 6c 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 53 51  len==0 .   || SQ
d0a0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
d0b0: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
d0c0: 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29   szJ-12, &cksum)
d0d0: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
d0e0: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
d0f0: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d  OsRead(pJrnl, aM
d100: 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29  agic, 8, szJ-8))
d110: 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d  .   || memcmp(aM
d120: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
d130: 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51  gic, 8).   || SQ
d140: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
d150: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
d160: 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  nl, zMaster, len
d170: 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20  , szJ-16-len)). 
d180: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
d190: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65  c;.  }..  /* See
d1a0: 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   if the checksum
d1b0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73   matches the mas
d1c0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
d1d0: 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75   */.  for(u=0; u
d1e0: 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20  <len; u++){.    
d1f0: 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72  cksum -= zMaster
d200: 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  [u];.  }.  if( c
d210: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ksum ){.    /* I
d220: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64  f the checksum d
d230: 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74  oesn't add up, t
d240: 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  hen one or more 
d250: 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74  of the disk sect
d260: 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61  ors.    ** conta
d270: 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  ining the master
d280: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
d290: 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20  e is corrupted. 
d2a0: 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a  This means.    *
d2b0: 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c  * definitely rol
d2c0: 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20  l back, so just 
d2d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d2e0: 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e   and report a (n
d2f0: 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  ul).    ** maste
d300: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r-journal filena
d310: 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c  me..    */.    l
d320: 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d  en = 0;.  }.  zM
d330: 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30  aster[len] = '\0
d340: 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20  ';.   .  return 
d350: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
d360: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f  .** Return the o
d370: 66 66 73 65 74 20 6f 66 20 74 68 65 20 73 65 63  ffset of the sec
d380: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20  tor boundary at 
d390: 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a  or immediately .
d3a0: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
d3b0: 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72   value in pPager
d3c0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73  ->journalOff, as
d3d0: 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20  suming a sector 
d3e0: 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67  .** size of pPag
d3f0: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62  er->sectorSize b
d400: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20  ytes..**.** i.e 
d410: 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a  for a sector siz
d420: 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20  e of 512:.**.** 
d430: 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f    Pager.journalO
d440: 66 66 20 20 20 20 20 20 20 20 20 20 52 65 74 75  ff          Retu
d450: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d  rn value.**   --
d460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d480: 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20  -----.**   0    
d490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4a0: 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20       0.**   512 
d4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4c0: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31        512.**   1
d4d0: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
d4e0: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
d4f0: 20 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20    2000          
d500: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38              2048
d510: 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  .** .*/.static i
d520: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66  64 journalHdrOff
d530: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
d540: 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  r){.  i64 offset
d550: 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20   = 0;.  i64 c = 
d560: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d570: 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20  ff;.  if( c ){. 
d580: 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d     offset = ((c-
d590: 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  1)/JOURNAL_HDR_S
d5a0: 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a  Z(pPager) + 1) *
d5b0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
d5c0: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61  pPager);.  }.  a
d5d0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f  ssert( offset%JO
d5e0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
d5f0: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ger)==0 );.  ass
d600: 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29  ert( offset>=c )
d610: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66  ;.  assert( (off
d620: 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48  set-c)<JOURNAL_H
d630: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
d640: 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74  .  return offset
d650: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
d660: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
d670: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
d680: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
d690: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
d6a0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
d6b0: 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75  no-op if the jou
d6c0: 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f  rnal file has no
d6d0: 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  t been written t
d6e0: 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  o.** within the 
d6f0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
d700: 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67  ion (i.e. if Pag
d710: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  er.journalOff==0
d720: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72  )..**.** If doTr
d730: 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  uncate is non-ze
d740: 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e  ro or the Pager.
d750: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
d760: 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20   variable is.** 
d770: 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74  set to 0, then t
d780: 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72  runcate the jour
d790: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  nal file to zero
d7a0: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
d7b0: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65  Otherwise,.** ze
d7c0: 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65 20 68  ro the 28-byte h
d7d0: 65 61 64 65 72 20 61 74 20 74 68 65 20 73 74 61  eader at the sta
d7e0: 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
d7f0: 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65  l file. In eithe
d800: 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74  r case, .** if t
d810: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
d820: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c  in no-sync mode,
d830: 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
d840: 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65  l file immediate
d850: 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69  ly .** after wri
d860: 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
d870: 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ng it..**.** If 
d880: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
d890: 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f  eLimit is set to
d8a0: 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e   a positive, non
d8b0: 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64  -zero value, and
d8c0: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  .** following th
d8d0: 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20  e truncation or 
d8e0: 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65  zeroing describe
d8f0: 64 20 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65  d above the size
d900: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72   of the .** jour
d910: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
d920: 73 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  s is larger than
d930: 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65   this value, the
d940: 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a  n truncate the.*
d950: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
d960: 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  o Pager.journalS
d970: 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20  izeLimit bytes. 
d980: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
d990: 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65   does.** not nee
d9a0: 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66  d to be synced f
d9b0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
d9c0: 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  eration..**.** I
d9d0: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
d9e0: 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72  curs, abandon pr
d9f0: 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74  ocessing and ret
da00: 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  urn the IO error
da10: 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77   code..** Otherw
da20: 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ise, return SQLI
da30: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
da40: 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c   int zeroJournal
da50: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
da60: 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74  r, int doTruncat
da70: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
da80: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
da90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daa0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
dab0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65  n code */.  asse
dac0: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
dad0: 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28  r->jfd) );.  if(
dae0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
daf0: 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  Off ){.    const
db00: 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50   i64 iLimit = pP
db10: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
db20: 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f  eLimit;    /* Lo
db30: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c  cal cache of jsl
db40: 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45   */..    IOTRACE
db50: 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e  (("JZEROHDR %p\n
db60: 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
db70: 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c  if( doTruncate |
db80: 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20  | iLimit==0 ){. 
db90: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
dba0: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
dbb0: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
dbc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74   }else{.      st
dbd0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
dbe0: 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30  zeroHdr[28] = {0
dbf0: 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  };.      rc = sq
dc00: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
dc10: 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64  ger->jfd, zeroHd
dc20: 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64  r, sizeof(zeroHd
dc30: 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  r), 0);.    }.  
dc40: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
dc50: 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e  _OK && !pPager->
dc60: 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
dc70: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
dc80: 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
dc90: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
dca0: 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e  ONLY|pPager->syn
dcb0: 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a  cFlags);.    }..
dcc0: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
dcd0: 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63  oint the transac
dce0: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
dcf0: 64 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20  d but the write 
dd00: 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20  lock .    ** is 
dd10: 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68  still held on th
dd20: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
dd30: 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74   is a size limit
dd40: 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
dd50: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73  .    ** the pers
dd60: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  istent journal a
dd70: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
dd80: 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ile currently co
dd90: 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20  nsumes more.    
dda0: 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68  ** space than th
ddb0: 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20  at limit allows 
ddc0: 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74  for, truncate it
ddd0: 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e   now. There is n
dde0: 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  o need.    ** to
ddf0: 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66   sync the file f
de00: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
de10: 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  eration..    */.
de20: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
de30: 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e  TE_OK && iLimit>
de40: 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73  0 ){.      i64 s
de50: 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  z;.      rc = sq
de60: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
de70: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
de80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
de90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a  =SQLITE_OK && sz
dea0: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
deb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
dec0: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
ded0: 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a  ->jfd, iLimit);.
dee0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
def0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
df00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
df10: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
df20: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
df30: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
df40: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  d. A journal.** 
df50: 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f  header (JOURNAL_
df60: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
df70: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
df80: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
df90: 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t the.** current
dfa0: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
dfb0: 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20   The format for 
dfc0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
dfd0: 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  er is as follows
dfe0: 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20  :.** - 8 bytes: 
dff0: 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e  Magic identifyin
e000: 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  g journal format
e010: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
e020: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
e030: 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72  s in journal, or
e040: 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   -1 no-sync mode
e050: 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62   is on..** - 4 b
e060: 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d  ytes: Random num
e070: 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67  ber used for pag
e080: 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62  e hash..** - 4 b
e090: 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61  ytes: Initial da
e0a0: 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
e0b0: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
e0c0: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65   Sector size use
e0d0: 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73  d by the process
e0e0: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73   that wrote this
e0f0: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34   journal..** - 4
e100: 20 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65   bytes: Database
e110: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a   page size..** .
e120: 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28  ** Followed by (
e130: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
e140: 20 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e   28) bytes of un
e150: 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  used space..*/.s
e160: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a  tatic int writeJ
e170: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
e180: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
e190: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
e1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1b0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
e1c0: 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65  /.  char *zHeade
e1d0: 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
e1e0: 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f  Space;  /* Tempo
e1f0: 72 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20  rary space used 
e200: 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20  to build header 
e210: 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72  */.  u32 nHeader
e220: 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e   = (u32)pPager->
e230: 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65  pageSize;/* Size
e240: 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74   of buffer point
e250: 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72  ed to by zHeader
e260: 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65   */.  u32 nWrite
e270: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
e290: 65 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63  es of header sec
e2a0: 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  tor written */. 
e2b0: 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
e2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2d0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
e2e0: 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
e2f0: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
e300: 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f  ->jfd) );      /
e310: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * Journal file m
e320: 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a  ust be open. */.
e330: 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a  .  if( nHeader>J
e340: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
e350: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65  ager) ){.    nHe
e360: 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48  ader = JOURNAL_H
e370: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
e380: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
e390: 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76  e are active sav
e3a0: 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20  epoints and any 
e3b0: 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65  of them were cre
e3c0: 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65  ated .  ** since
e3d0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
e3e0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
e3f0: 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64  was written, upd
e400: 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ate the .  ** Pa
e410: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
e420: 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e  rOffset fields n
e430: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ow..  */.  for(i
e440: 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
e450: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
e460: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
e470: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
e480: 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20  ].iHdrOffset==0 
e490: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
e4a0: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
e4b0: 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  iHdrOffset = pPa
e4c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
e4d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
e4e0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
e4f0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
e500: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
e510: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
e520: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72  ;..  /* .  ** Wr
e530: 69 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65  ite the nRec Fie
e540: 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20  ld - the number 
e550: 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
e560: 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73  that follow this
e570: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65  .  ** journal he
e580: 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20  ader. Normally, 
e590: 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20  zero is written 
e5a0: 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74  to this value at
e5b0: 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a   this time..  **
e5c0: 20 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72   After the recor
e5d0: 64 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ds are added to 
e5e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  the journal (and
e5f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e   the journal syn
e600: 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e  ced, .  ** if in
e610: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29   full-sync mode)
e620: 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76  , the zero is ov
e630: 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74  erwritten with t
e640: 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20  he true number. 
e650: 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28   ** of records (
e660: 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  see syncJournal(
e670: 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  ))..  **.  ** A 
e680: 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69  faster alternati
e690: 76 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30  ve is to write 0
e6a0: 78 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65  xFFFFFFFF to the
e6b0: 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65   nRec field. Whe
e6c0: 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74  n.  ** reading t
e6d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20  he journal this 
e6e0: 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69  value tells SQLi
e6f0: 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61  te to assume tha
e700: 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20  t the.  ** rest 
e710: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
e720: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c  ile contains val
e730: 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e  id page records.
e740: 20 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   This assumption
e750: 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f  .  ** is dangero
e760: 75 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c  us, as if a fail
e770: 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69  ure occurred whi
e780: 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  lst writing to t
e790: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
e7a0: 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74  file it may cont
e7b0: 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ain some garbage
e7c0: 20 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65   data. There are
e7d0: 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20   two scenarios. 
e7e0: 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72   ** where this r
e7f0: 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72  isk can be ignor
e800: 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
e810: 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72  * When the pager
e820: 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d   is in no-sync m
e830: 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20  ode. Corruption 
e840: 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a  can follow a.  *
e850: 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c  *     power fail
e860: 75 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ure in this case
e870: 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20   anyway..  **.  
e880: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
e890: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
e8a0: 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73  E_APPEND flag is
e8b0: 20 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61   set. This guara
e8c0: 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74  ntees.  **     t
e8d0: 68 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61  hat garbage data
e8e0: 20 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64   is never append
e8f0: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
e900: 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  l file..  */.  a
e910: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
e920: 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
e930: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20  ger->noSync );. 
e940: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
e950: 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e  ync || (pPager->
e960: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
e970: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
e980: 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71  EMORY).   || (sq
e990: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
e9a0: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
e9b0: 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f  ger->fd)&SQLITE_
e9c0: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
e9d0: 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d  D) .  ){.    mem
e9e0: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
e9f0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
ea00: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
ea10: 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74  ));.    put32bit
ea20: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
ea30: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
ea40: 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a  ], 0xffffffff);.
ea50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
ea60: 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20  set(zHeader, 0, 
ea70: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
ea80: 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20  agic)+4);.  }.. 
ea90: 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63   /* The random c
eaa0: 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61  heck-hash initia
eab0: 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69  lizer */ .  sqli
eac0: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
ead0: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b  izeof(pPager->ck
eae0: 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65  sumInit), &pPage
eaf0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
eb00: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
eb10: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
eb20: 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50  nalMagic)+4], pP
eb30: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
eb40: 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69  ;.  /* The initi
eb50: 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  al database size
eb60: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
eb70: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
eb80: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38  aJournalMagic)+8
eb90: 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  ], pPager->dbOri
eba0: 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65  gSize);.  /* The
ebb0: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
ebc0: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
ebd0: 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32  ocess */.  put32
ebe0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
ebf0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
ec00: 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d  ic)+12], pPager-
ec10: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20  >sectorSize);.. 
ec20: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a   /* The page siz
ec30: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
ec40: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
ec50: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
ec60: 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  16], pPager->pag
ec70: 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e  eSize);..  /* In
ec80: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74  itializing the t
ec90: 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65  ail of the buffe
eca0: 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  r is not necessa
ecb0: 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a  ry.  Everything.
ecc0: 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20    ** works find 
ecd0: 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
ece0: 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69   memset() is omi
ecf0: 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69  tted.  But initi
ed00: 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65  alizing.  ** the
ed10: 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73   memory prevents
ed20: 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63   valgrind from c
ed30: 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77  omplaining, so w
ed40: 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f  e are willing to
ed50: 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70  .  ** take the p
ed60: 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a  erformance hit..
ed70: 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a    */.  memset(&z
ed80: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
ed90: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d  ournalMagic)+20]
eda0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48  , 0,.         nH
edb0: 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a  eader-(sizeof(aJ
edc0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29  ournalMagic)+20)
edd0: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f  );..  /* In theo
ede0: 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e  ry, it is only n
edf0: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
ee00: 65 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74  e the 28 bytes t
ee10: 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f  hat the .  ** jo
ee20: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e  urnal header con
ee30: 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75  sumes to the jou
ee40: 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20  rnal file here. 
ee50: 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74  Then increment t
ee60: 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a  he .  ** Pager.j
ee70: 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62  ournalOff variab
ee80: 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44  le by JOURNAL_HD
ee90: 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65  R_SZ so that the
eea0: 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f   next .  ** reco
eeb0: 72 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  rd is written to
eec0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
eed0: 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61  ector (leaving a
eee0: 20 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65   gap in the file
eef0: 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20  .  ** that will 
ef00: 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69  be implicitly fi
ef10: 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f  lled in by the O
ef20: 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f  S)..  **.  ** Ho
ef30: 77 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65  wever it has bee
ef40: 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  n discovered tha
ef50: 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  t on some system
ef60: 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63  s this pattern c
ef70: 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e  an .  ** be sign
ef80: 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72  ificantly slower
ef90: 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73   than contiguous
efa0: 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20  ly writing data 
efb0: 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a  to the file,.  *
efc0: 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  * even if that m
efd0: 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20  eans explicitly 
efe0: 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20  writing data to 
eff0: 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20  the block of .  
f000: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
f010: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74  SZ - 28) bytes t
f020: 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  hat will not be 
f030: 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73  used. So that is
f040: 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f   what.  ** is do
f050: 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ne. .  **.  ** T
f060: 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69  he loop is requi
f070: 72 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65  red here in case
f080: 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65   the sector-size
f090: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
f0a0: 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61  the .  ** databa
f0b0: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69  se page size. Si
f0c0: 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20  nce the zHeader 
f0d0: 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50  buffer is only P
f0e0: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20  ager.pageSize.  
f0f0: 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
f100: 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  , more than one 
f110: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
f120: 73 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20  sWrite() may be 
f130: 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f  required.  ** to
f140: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e   populate the en
f150: 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tire journal hea
f160: 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f  der sector..  */
f170: 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30   .  for(nWrite=0
f180: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26  ; rc==SQLITE_OK&
f190: 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f  &nWrite<JOURNAL_
f1a0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20  HDR_SZ(pPager); 
f1b0: 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29  nWrite+=nHeader)
f1c0: 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
f1d0: 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
f1e0: 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
f1f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20  er->journalHdr, 
f200: 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63  nHeader)).    rc
f210: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
f220: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
f230: 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c  Header, nHeader,
f240: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f250: 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Off);.    assert
f260: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
f270: 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e  lHdr <= pPager->
f280: 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20  journalOff );.  
f290: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
f2a0: 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b  lOff += nHeader;
f2b0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
f2c0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
f2d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
f2e0: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
f2f0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
f300: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f310: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
f320: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
f330: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
f340: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
f350: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
f360: 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72  ** file. The cur
f370: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
f380: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
f390: 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a  e is given by.**
f3a0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f3b0: 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  Off. See comment
f3c0: 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  s above function
f3d0: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
f3e0: 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63  () for.** a desc
f3f0: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  ription of the j
f400: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f  ournal header fo
f410: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rmat..**.** If t
f420: 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61  he header is rea
f430: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
f440: 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f  *pNRec is set to
f450: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
f460: 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  * page records f
f470: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65  ollowing this he
f480: 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a  ader and *pDbSiz
f490: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
f4a0: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  size of the.** d
f4b0: 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
f4c0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
f4d0: 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20  egan, in pages. 
f4e0: 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b  Also, pPager->ck
f4f0: 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65  sumInit.** is se
f500: 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72  t to the value r
f510: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
f520: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c  rnal header. SQL
f530: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
f540: 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  ed.** in this ca
f550: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
f560: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f570: 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20  file appears to 
f580: 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  be corrupted, SQ
f590: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20  LITE_DONE is.** 
f5a0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e  returned and *pN
f5b0: 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65  Rec and *PDbSize
f5c0: 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20   are undefined. 
f5d0: 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   If JOURNAL_HDR_
f5e0: 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e  SZ bytes.** cann
f5f0: 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ot be read from 
f600: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
f610: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
f620: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
f630: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f  tatic int readJo
f640: 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65  urnalHdr(.  Page
f650: 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
f660: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
f670: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
f680: 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a  t isHot,.  i64 j
f690: 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20  ournalSize,     
f6a0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
f6b0: 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72  of the open jour
f6c0: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
f6d0: 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65  s */.  u32 *pNRe
f6e0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
f6f0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75      /* OUT: Valu
f700: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
f710: 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20  nRec field */.  
f720: 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20  u32 *pDbSize    
f730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f740: 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72  OUT: Value of or
f750: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
f760: 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b  size field */.){
f770: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
f780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f790: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
f7a0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
f7b0: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20  r aMagic[8];    
f7c0: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
f7d0: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
f7e0: 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  eader */.  i64 i
f7f0: 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
f800: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
f810: 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  t of journal hea
f820: 64 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a  der being read *
f830: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
f840: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
f850: 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
f860: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
f870: 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20   open. */..  /* 
f880: 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f  Advance Pager.jo
f890: 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20  urnalOff to the 
f8a0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78  start of the nex
f8b0: 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65  t sector. If the
f8c0: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  .  ** journal fi
f8d0: 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20  le is too small 
f8e0: 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
f8f0: 61 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 20  a header stored 
f900: 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69  at this.  ** poi
f910: 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  nt, return SQLIT
f920: 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70  E_DONE..  */.  p
f930: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f940: 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
f950: 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
f960: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
f970: 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48  nalOff+JOURNAL_H
f980: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20  DR_SZ(pPager) > 
f990: 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20  journalSize ){. 
f9a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f9b0: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64  _DONE;.  }.  iHd
f9c0: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
f9d0: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
f9e0: 20 52 65 61 64 20 69 6e 20 74 68 65 20 66 69 72   Read in the fir
f9f0: 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68  st 8 bytes of th
fa00: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
fa10: 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74  . If they do not
fa20: 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20   match.  ** the 
fa30: 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f   magic string fo
fa40: 75 6e 64 20 61 74 20 74 68 65 20 73 74 61 72 74  und at the start
fa50: 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c   of each journal
fa60: 20 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a   header, return.
fa70: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45    ** SQLITE_DONE
fa80: 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
fa90: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
faa0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f  an error code. O
fab0: 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70  therwise,.  ** p
fac0: 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  roceed..  */.  i
fad0: 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72  f( isHot || iHdr
fae0: 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  Off!=pPager->jou
faf0: 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72  rnalHdr ){.    r
fb00: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
fb10: 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
fb20: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
fb30: 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b  agic), iHdrOff);
fb40: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
fb50: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
fb60: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65      }.    if( me
fb70: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
fb80: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
fb90: 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29  of(aMagic))!=0 )
fba0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
fbb0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
fbc0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  }.  }..  /* Read
fbd0: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65   the first three
fbe0: 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f   32-bit fields o
fbf0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
fc00: 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20  ader: The nRec. 
fc10: 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63   ** field, the c
fc20: 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69  hecksum-initiali
fc30: 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61 74 61  zer and the data
fc40: 62 61 73 65 20 73 69 7a 65 20 61 74 20 74 68 65  base size at the
fc50: 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74   start.  ** of t
fc60: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
fc70: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
fc80: 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
fc90: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a   goes wrong..  *
fca0: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
fcb0: 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
fcc0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
fcd0: 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65   iHdrOff+8, pNRe
fce0: 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  c)).   || SQLITE
fcf0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fd00: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fd10: 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26  d, iHdrOff+12, &
fd20: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
fd30: 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  t)).   || SQLITE
fd40: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fd50: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fd60: 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70  d, iHdrOff+16, p
fd70: 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20  DbSize)).  ){.  
fd80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
fd90: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
fda0: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
fdb0: 0a 20 20 20 20 75 33 32 20 69 50 61 67 65 53 69  .    u32 iPageSi
fdc0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
fdd0: 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66    /* Page-size f
fde0: 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ield of journal 
fdf0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33  header */.    u3
fe00: 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20  2 iSectorSize;  
fe10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
fe20: 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20  ctor-size field 
fe30: 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
fe40: 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61  r */..    /* Rea
fe50: 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  d the page-size 
fe60: 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
fe70: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
fe80: 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66  ields. */.    if
fe90: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
fea0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
feb0: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
fec0: 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53  ff+20, &iSectorS
fed0: 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51  ize)).     || SQ
fee0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
fef0: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
ff00: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32  ->jfd, iHdrOff+2
ff10: 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a  4, &iPageSize)).
ff20: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
ff30: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
ff40: 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f     /* Versions o
ff50: 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74  f SQLite prior t
ff60: 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20  o 3.5.8 set the 
ff70: 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20  page-size field 
ff80: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  of the.    ** jo
ff90: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
ffa0: 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61  zero. In this ca
ffb0: 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  se, assume that 
ffc0: 74 68 65 20 50 61 67 65 72 2e 70 61 67 65 53 69  the Pager.pageSi
ffd0: 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  ze.    ** variab
ffe0: 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 65  le is already se
fff0: 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
10000 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20   page size..    
10010 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  */.    if( iPage
10020 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
10030 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61   iPageSize = pPa
10040 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
10050 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
10060 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
10070 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
10080 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
10090 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64  ector-size field
100a0 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74  s.    ** are wit
100b0 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65  hin range. To be
100c0 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74   'in range', bot
100d0 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f  h values need to
100e0 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20   be a power.    
100f0 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65  ** of two greate
10100 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
10110 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e  to 512 or 32, an
10120 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68  d not greater th
10130 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a  an their .    **
10140 20 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70   respective comp
10150 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d  ile time maximum
10160 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a   limits..    */.
10170 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a      if( iPageSiz
10180 65 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20  e<512           
10190 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f         || iSecto
101a0 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c  rSize<32.     ||
101b0 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54   iPageSize>SQLIT
101c0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
101d0 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d  || iSectorSize>M
101e0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20  AX_SECTOR_SIZE. 
101f0 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69      || ((iPageSi
10200 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29  ze-1)&iPageSize)
10210 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74  !=0   || ((iSect
10220 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f  orSize-1)&iSecto
10230 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29  rSize)!=0 .    )
10240 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
10250 65 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67  e either the pag
10260 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72  e-size or sector
10270 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75  -size in the jou
10280 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a  rnal-header is .
10290 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64        ** invalid
102a0 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65  , then the proce
102b0 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
102c0 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  e journal-header
102d0 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20   must have .    
102e0 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66    ** crashed bef
102f0 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77  ore the header w
10300 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68  as synced. In th
10310 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61  is case stop rea
10320 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74  ding .      ** t
10330 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
10340 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  here..      */. 
10350 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10360 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
10370 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
10380 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d  e page-size to m
10390 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72  atch the value r
103a0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
103b0 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73  rnal. .    ** Us
103c0 65 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d  e a testcase() m
103d0 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72  acro to make sur
103e0 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61  e that malloc fa
103f0 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20  ilure within .  
10400 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67    ** PagerSetPag
10410 65 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65  esize() is teste
10420 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  d..    */.    rc
10430 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
10440 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
10450 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d  r, &iPageSize, -
10460 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
10470 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10480 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74  );..    /* Updat
10490 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
104a0 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
104b0 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
104c0 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65  d by .    ** the
104d0 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72   process that cr
104e0 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e  eated this journ
104f0 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72  al. If this jour
10500 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  nal was.    ** c
10510 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
10520 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ess other than t
10530 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68  his one, then th
10540 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  is routine.    *
10550 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  * is being calle
10560 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61  d from within pa
10570 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20  ger_playback(). 
10580 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a  The local value.
10590 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e      ** of Pager.
105a0 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65  sectorSize is re
105b0 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e  stored at the en
105c0 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e  d of that routin
105d0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  e..    */.    pP
105e0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
105f0 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a   = iSectorSize;.
10600 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
10610 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
10620 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
10630 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
10640 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
10650 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d  e the supplied m
10660 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
10670 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
10680 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
10690 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20  er.** pPager at 
106a0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
106b0 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72  tion. The master
106c0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
106d0 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a  st be the last.*
106e0 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20  * thing written 
106f0 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  to a journal fil
10700 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
10710 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  is in full-sync 
10720 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75  mode, the.** jou
10730 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
10740 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64  ptor is advanced
10750 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
10760 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66  tor boundary bef
10770 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20  ore.** anything 
10780 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20  is written. The 
10790 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a  format is:.**.**
107a0 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41     + 4 bytes: PA
107b0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20  GER_MJ_PGNO..** 
107c0 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73    + N bytes: Mas
107d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
107e0 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a  name in utf-8..*
107f0 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e  *   + 4 bytes: N
10800 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74   (length of mast
10810 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
10820 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c  in bytes, no nul
10830 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a  -terminator)..**
10840 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61     + 4 bytes: Ma
10850 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10860 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  e checksum..**  
10870 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75   + 8 bytes: aJou
10880 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a  rnalMagic[]..**.
10890 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
108a0 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b  urnal page check
108b0 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f  sum is the sum o
108c0 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  f the bytes in t
108d0 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
108e0 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65  rnal name, where
108f0 20 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e   each byte is in
10900 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73  terpreted as a s
10910 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65  igned 8-bit inte
10920 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d  ger..**.** If zM
10930 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20  aster is a NULL 
10940 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20  pointer (occurs 
10950 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74  for a single dat
10960 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
10970 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c  n), .** this cal
10980 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  l is a no-op..*/
10990 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
109a0 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50  eMasterJournal(P
109b0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
109c0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
109d0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
109e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109f0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
10a00 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
10a10 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
10a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
10a30 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20  ength of string 
10a40 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34  zMaster */.  i64
10a50 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
10a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10a70 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
10a80 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  r in journal fil
10a90 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53  e */.  i64 jrnlS
10aa0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
10ab0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
10ac0 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
10ad0 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32  on disk */.  u32
10ae0 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20   cksum = 0;     
10af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10b00 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72   Checksum of str
10b10 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a  ing zMaster */..
10b20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
10b30 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29  ->setMaster==0 )
10b40 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  ;.  assert( !pag
10b50 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
10b60 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73   );..  if( !zMas
10b70 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65  ter .   || pPage
10b80 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
10b90 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
10ba0 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20  E_MEMORY .   || 
10bb0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
10bc0 6a 66 64 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  jfd).  ){.    re
10bd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10be0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65    }.  pPager->se
10bf0 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61  tMaster = 1;.  a
10c00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
10c10 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61  ournalHdr <= pPa
10c20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10c30 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61  );..  /* Calcula
10c40 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e  te the length in
10c50 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63   bytes and the c
10c60 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74  hecksum of zMast
10c70 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73  er */.  for(nMas
10c80 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e  ter=0; zMaster[n
10c90 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72  Master]; nMaster
10ca0 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  ++){.    cksum +
10cb0 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65  = zMaster[nMaste
10cc0 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r];.  }..  /* If
10cd0 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
10ce0 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  de, advance to t
10cf0 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63  he next disk sec
10d00 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69  tor before writi
10d10 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74  ng.  ** the mast
10d20 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
10d30 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65   This is in case
10d40 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   the previous pa
10d50 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ge written to.  
10d60 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
10d70 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
10d80 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  synced..  */.  i
10d90 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
10da0 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
10db0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
10dc0 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
10dd0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
10de0 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  iHdrOff = pPager
10df0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
10e00 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61   /* Write the ma
10e10 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74  ster journal dat
10e20 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  a to the end of 
10e30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
10e40 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72  . If.  ** an err
10e50 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
10e60 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
10e70 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
10e80 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d    */.  if( (0 !=
10e90 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
10ea0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
10eb0 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d  iHdrOff, PAGER_M
10ec0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29  J_PGNO(pPager)))
10ed0 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
10ee0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
10ef0 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
10f00 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72  zMaster, nMaster
10f10 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20  , iHdrOff+4))). 
10f20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
10f30 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
10f40 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
10f50 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61  f+4+nMaster, nMa
10f60 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30  ster))).   || (0
10f70 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33   != (rc = write3
10f80 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
10f90 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  d, iHdrOff+4+nMa
10fa0 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29  ster+4, cksum)))
10fb0 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
10fc0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
10fd0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  e(pPager->jfd, a
10fe0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c  JournalMagic, 8,
10ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11010 20 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73    iHdrOff+4+nMas
11020 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20  ter+8))).  ){.  
11030 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
11040 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
11050 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65  alOff += (nMaste
11060 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  r+20);..  /* If 
11070 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
11080 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61  peristent-journa
11090 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  l mode, then the
110a0 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20   physical .  ** 
110b0 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79  journal-file may
110c0 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65   extend past the
110d0 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74   end of the mast
110e0 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er-journal name.
110f0 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73    ** and 8 bytes
11100 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a   of magic data j
11110 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ust written to t
11120 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  he file. This is
11130 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73   .  ** dangerous
11140 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64   because the cod
11150 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  e to rollback a 
11160 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
11170 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  .  ** will not b
11180 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74  e able to find t
11190 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
111a0 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  l name to determ
111b0 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65  ine .  ** whethe
111c0 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
111d0 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20  rnal is hot. .  
111e0 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20  **.  ** Easiest 
111f0 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74  thing to do in t
11200 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20  his scenario is 
11210 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  to truncate the 
11220 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
11230 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72  le to the requir
11240 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20  ed size..  */ . 
11250 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
11260 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
11270 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
11280 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29  jfd, &jrnlSize))
11290 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e  .   && jrnlSize>
112a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
112b0 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  ff.  ){.    rc =
112c0 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
112d0 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
112e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
112f0 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ff);.  }.  retur
11300 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
11310 69 73 63 61 72 64 20 74 68 65 20 65 6e 74 69 72  iscard the entir
11320 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
11330 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  e in-memory page
11340 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69  -cache..*/.stati
11350 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
11360 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
11370 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 69 44 61  ){.  pPager->iDa
11380 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 0a 20 20 73  taVersion++;.  s
11390 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
113a0 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
113b0 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  kup);.  sqlite3P
113c0 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65  cacheClear(pPage
113d0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a  r->pPCache);.}..
113e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
113f0 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65   pPager->iDataVe
11400 72 73 69 6f 6e 20 76 61 6c 75 65 0a 2a 2f 0a 75  rsion value.*/.u
11410 33 32 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  32 sqlite3PagerD
11420 61 74 61 56 65 72 73 69 6f 6e 28 50 61 67 65 72  ataVersion(Pager
11430 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
11440 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
11450 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 29  ate>PAGER_OPEN )
11460 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
11470 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 3b  r->iDataVersion;
11480 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
11490 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ll structures in
114a0 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
114b0 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e  point[] array an
114c0 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61  d set both.** Pa
114d0 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
114e0 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  nd Pager.nSavepo
114f0 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f  int to zero. Clo
11500 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  se the sub-journ
11510 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f  al.** if it is o
11520 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
11530 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
11540 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73  usive mode..*/.s
11550 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
11560 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
11570 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
11580 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
11590 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
115a0 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20  tor for looping 
115b0 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53  through Pager.aS
115c0 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f  avepoint */.  fo
115d0 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
115e0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
115f0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
11600 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
11610 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
11620 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  t[ii].pInSavepoi
11630 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  nt);.  }.  if( !
11640 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
11650 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33  eMode || sqlite3
11660 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61  IsMemJournal(pPa
11670 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
11680 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
11690 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
116a0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
116b0 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ee(pPager->aSave
116c0 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72  point);.  pPager
116d0 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->aSavepoint = 0
116e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  ;.  pPager->nSav
116f0 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
11700 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20  ager->nSubRec = 
11710 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
11720 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70  the bit number p
11730 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72  gno in the Pager
11740 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
11750 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65  epoint .** bitve
11760 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73  cs of all open s
11770 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72  avepoints. Retur
11780 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
11790 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20  uccessful.** or 
117a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
117b0 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
117c0 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
117d0 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65  ic int addToSave
117e0 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67  pointBitvecs(Pag
117f0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
11800 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69   pgno){.  int ii
11810 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11820 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
11830 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
11840 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
11850 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
11860 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30  e */..  for(ii=0
11870 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
11880 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
11890 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
118a0 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d  nt *p = &pPager-
118b0 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b  >aSavepoint[ii];
118c0 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
118d0 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->nOrig ){.     
118e0 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69   rc |= sqlite3Bi
118f0 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61  tvecSet(p->pInSa
11900 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a  vepoint, pgno);.
11910 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
11920 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
11930 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
11940 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11950 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
11960 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  MEM );.    }.  }
11970 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11980 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
11990 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
119a0 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
119b0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
119c0 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20  e and not.** in 
119d0 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
119e0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 73   Otherwise, it s
119f0 77 69 74 63 68 65 73 20 74 68 65 20 70 61 67 65  witches the page
11a00 72 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a  r to PAGER_OPEN.
11a10 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ** state..**.** 
11a20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
11a30 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
11a40 2d 61 63 63 65 73 73 20 6d 6f 64 65 2c 20 74 68  -access mode, th
11a50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
11a60 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79  is.** completely
11a70 20 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68   unlocked. If th
11a80 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  e file is unlock
11a90 65 64 20 61 6e 64 20 74 68 65 20 66 69 6c 65 2d  ed and the file-
11aa0 73 79 73 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e  system does.** n
11ab0 6f 74 20 65 78 68 69 62 69 74 20 74 68 65 20 55  ot exhibit the U
11ac0 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
11ad0 4f 50 45 4e 20 70 72 6f 70 65 72 74 79 2c 20 74  OPEN property, t
11ae0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
11af0 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66  is.** closed (if
11b00 20 69 74 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a   it is open)..**
11b10 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
11b20 20 69 73 20 69 6e 20 45 52 52 4f 52 20 73 74 61   is in ERROR sta
11b30 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
11b40 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
11b50 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
11b60 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63  s of the pager c
11b70 61 63 68 65 20 61 72 65 20 64 69 73 63 61 72 64  ache are discard
11b80 65 64 20 62 65 66 6f 72 65 20 73 77 69 74 63 68  ed before switch
11b90 69 6e 67 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20  ing back to .** 
11ba0 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20  the OPEN state. 
11bb0 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  Regardless of wh
11bc0 65 74 68 65 72 20 74 68 65 20 70 61 67 65 72 20  ether the pager 
11bd0 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  is in exclusive-
11be0 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20  mode.** or not, 
11bf0 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  any journal file
11c00 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
11c10 65 2d 73 79 73 74 65 6d 20 77 69 6c 6c 20 62 65  e-system will be
11c20 20 74 72 65 61 74 65 64 0a 2a 2a 20 61 73 20 61   treated.** as a
11c30 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
11c40 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
11c50 20 6e 65 78 74 20 74 69 6d 65 20 61 20 72 65 61   next time a rea
11c60 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  d-transaction.**
11c70 20 69 73 20 6f 70 65 6e 65 64 20 28 62 79 20 74   is opened (by t
11c80 68 69 73 20 6f 72 20 62 79 20 61 6e 79 20 6f 74  his or by any ot
11c90 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e  her connection).
11ca0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11cb0 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
11cc0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20  er *pPager){..  
11cd0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
11ce0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
11cf0 41 44 45 52 20 0a 20 20 20 20 20 20 20 7c 7c 20  ADER .       || 
11d00 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
11d10 50 41 47 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20  PAGER_OPEN .    
11d20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
11d30 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
11d40 52 20 0a 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74  R .  );..  sqlit
11d50 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
11d60 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
11d70 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
11d80 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
11d90 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
11da0 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a  oints(pPager);..
11db0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
11dc0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
11dd0 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
11de0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
11df0 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45  .    sqlite3WalE
11e00 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
11e10 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
11e20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
11e30 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
11e40 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70  ;.  }else if( !p
11e50 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
11e60 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Mode ){.    int 
11e70 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
11e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
11e90 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
11ea0 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44   by pagerUnlockD
11eb0 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  b() */.    int i
11ec0 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50 61 67  Dc = isOpen(pPag
11ed0 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f  er->fd)?sqlite3O
11ee0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
11ef0 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
11f00 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  d):0;..    /* If
11f10 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
11f20 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 64 65  ystem support de
11f30 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66  letion of open f
11f40 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a  iles, then.    *
11f50 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72  * close the jour
11f60 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72  nal file when dr
11f70 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62  opping the datab
11f80 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72  ase lock.  Other
11f90 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74  wise.    ** anot
11fa0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  her connection w
11fb0 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  ith journal_mode
11fc0 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20 64 65  =delete might de
11fd0 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20  lete the file.  
11fe0 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e    ** out from un
11ff0 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20  der us..    */. 
12000 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
12010 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
12020 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31 20 29  MORY   & 5)!=1 )
12030 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
12040 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
12050 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29 21 3d  _OFF      & 5)!=
12060 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
12070 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
12080 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26 20 35  ODE_WAL      & 5
12090 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
120a0 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
120b0 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20  ALMODE_DELETE   
120c0 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)!=1 );.    a
120d0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
120e0 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
120f0 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  TE & 5)==1 );.  
12100 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
12110 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
12120 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20 29 3b  SIST  & 5)==1 );
12130 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63  .    if( 0==(iDc
12140 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   & SQLITE_IOCAP_
12150 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
12160 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31  _OPEN).     || 1
12170 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  !=(pPager->journ
12180 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20 20 20  alMode & 5).    
12190 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
121a0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
121b0 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  jfd);.    }..   
121c0 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
121d0 20 69 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52   is in the ERROR
121e0 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 63   state and the c
121f0 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  all to unlock th
12200 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
12210 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 73 65  * file fails, se
12220 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
12230 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ck to UNKNOWN_LO
12240 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  CK. See the comm
12250 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  ent.    ** above
12260 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72   the #define for
12270 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
12280 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
12290 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 20   of why this.   
122a0 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79   ** is necessary
122b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
122c0 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  = pagerUnlockDb(
122d0 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29  pPager, NO_LOCK)
122e0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
122f0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
12300 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
12310 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20  _ERROR ){.      
12320 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
12330 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20  UNKNOWN_LOCK;.  
12340 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
12350 70 61 67 65 72 20 73 74 61 74 65 20 6d 61 79 20  pager state may 
12360 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20  be changed from 
12370 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f 20 50  PAGER_ERROR to P
12380 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20  AGER_OPEN here. 
12390 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c     ** without cl
123a0 65 61 72 69 6e 67 20 74 68 65 20 65 72 72 6f 72  earing the error
123b0 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 69   code. This is i
123c0 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65  ntentional - the
123d0 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f   error.    ** co
123e0 64 65 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e  de is cleared an
123f0 64 20 74 68 65 20 63 61 63 68 65 20 72 65 73 65  d the cache rese
12400 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62  t in the block b
12410 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elow..    */.   
12420 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
12430 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61 67  >errCode || pPag
12440 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
12450 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20 20 70  R_ERROR );.    p
12460 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
12470 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ntDone = 0;.    
12480 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
12490 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d   PAGER_OPEN;.  }
124a0 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e  ..  /* If Pager.
124b0 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20  errCode is set, 
124c0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
124d0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
124e0 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74  cannot be.  ** t
124f0 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74  rusted. Now that
12500 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
12510 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
12520 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
12530 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20 73  r,.  ** it can s
12540 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20  afely move back 
12550 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74  to PAGER_OPEN st
12560 61 74 65 2e 20 54 68 69 73 20 68 61 70 70 65 6e  ate. This happen
12570 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e  s in both.  ** n
12580 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75 73  ormal and exclus
12590 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  ive-locking mode
125a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
125b0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
125c0 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
125d0 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72 5f  DB );.    pager_
125e0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
125f0 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
12600 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61  eCountDone = pPa
12610 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
12620 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
12630 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
12640 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
12650 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ode = SQLITE_OK;
12660 0a 20 20 20 20 69 66 28 20 55 53 45 46 45 54 43  .    if( USEFETC
12670 48 28 70 50 61 67 65 72 29 20 29 20 73 71 6c 69  H(pPager) ) sqli
12680 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
12690 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a  ger->fd, 0, 0);.
126a0 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
126b0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
126c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
126d0 48 64 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Hdr = 0;.  pPage
126e0 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
126f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
12700 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
12710 65 64 20 77 68 65 6e 65 76 65 72 20 61 6e 20 49  ed whenever an I
12720 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20 65 72 72  OERR or FULL err
12730 6f 72 20 74 68 61 74 20 72 65 71 75 69 72 65 73  or that requires
12740 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f  .** the pager to
12750 20 74 72 61 6e 73 69 74 69 6f 6e 20 69 6e 74 6f   transition into
12760 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
12770 20 6d 61 79 20 61 68 76 65 20 6f 63 63 75 72 72   may ahve occurr
12780 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ed..** The first
12790 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
127a0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
127b0 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 74  ger structure, t
127c0 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 74 68  he second .** th
127d0 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f  e error-code abo
127e0 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ut to be returne
127f0 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50 49  d by a pager API
12800 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 0a   function. The .
12810 2a 2a 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  ** value returne
12820 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  d is a copy of t
12830 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
12840 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
12850 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ion. .**.** If t
12860 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
12870 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 46 55 4c  nt is SQLITE_FUL
12880 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  L, SQLITE_IOERR 
12890 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a  or one of the.**
128a0 20 49 4f 45 52 52 20 73 75 62 2d 63 6f 64 65 73   IOERR sub-codes
128b0 2c 20 74 68 65 20 70 61 67 65 72 20 65 6e 74 65  , the pager ente
128c0 72 73 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  rs the ERROR sta
128d0 74 65 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  te and the error
128e0 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73 74 6f 72   code.** is stor
128f0 65 64 20 69 6e 20 50 61 67 65 72 2e 65 72 72 43  ed in Pager.errC
12900 6f 64 65 2e 20 57 68 69 6c 65 20 74 68 65 20 70  ode. While the p
12910 61 67 65 72 20 72 65 6d 61 69 6e 73 20 69 6e 20  ager remains in 
12920 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
12930 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72 20 41 50  .** all major AP
12940 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 65 20 50  I calls on the P
12950 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69  ager will immedi
12960 61 74 65 6c 79 20 72 65 74 75 72 6e 20 50 61 67  ately return Pag
12970 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a 2a 0a 2a  er.errCode..**.*
12980 2a 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74  * The ERROR stat
12990 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  e indicates that
129a0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
129b0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
129c0 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74   .** cannot be t
129d0 72 75 73 74 65 64 2e 20 54 68 69 73 20 73 74 61  rusted. This sta
129e0 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65  te can be cleare
129f0 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20  d by completely 
12a00 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74  discarding .** t
12a10 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
12a20 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20  he pager-cache. 
12a30 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
12a40 20 77 61 73 20 61 63 74 69 76 65 20 77 68 65 6e   was active when
12a50 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65  .** the persiste
12a60 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  nt error occurre
12a70 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  d, then the roll
12a80 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79  back journal may
12a90 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72   need.** to be r
12aa0 65 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f  eplayed to resto
12ab0 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  re the contents 
12ac0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
12ad0 66 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69  file (as if.** i
12ae0 74 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75  t were a hot-jou
12af0 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  rnal)..*/.static
12b00 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72   int pager_error
12b10 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
12b20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72  int rc){.  int r
12b30 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a  c2 = rc & 0xff;.
12b40 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
12b50 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44  LITE_OK || !MEMD
12b60 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20  B );.  assert(. 
12b70 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
12b80 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55  rCode==SQLITE_FU
12b90 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61  LL ||.       pPa
12ba0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
12bb0 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20  LITE_OK ||.     
12bc0 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f    (pPager->errCo
12bd0 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49  de & 0xff)==SQLI
12be0 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20  TE_IOERR.  );.  
12bf0 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  if( rc2==SQLITE_
12c00 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c  FULL || rc2==SQL
12c10 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
12c20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12c30 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65   = rc;.    pPage
12c40 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
12c50 52 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  R_ERROR;.  }.  r
12c60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
12c70 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72  tic int pager_tr
12c80 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
12c90 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
12ca0 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  );../*.** This r
12cb0 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72  outine ends a tr
12cc0 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61  ansaction. A tra
12cd0 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61  nsaction is usua
12ce0 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a  lly ended by .**
12cf0 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54   either a COMMIT
12d00 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f   or a ROLLBACK o
12d10 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72  peration. This r
12d20 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61  outine may be ca
12d30 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72  lled .** after r
12d40 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74  ollback of a hot
12d50 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20  -journal, or if 
12d60 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
12d70 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a  while opening.**
12d80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12d90 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  e or writing the
12da0 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72   very first jour
12db0 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a  nal-header of a.
12dc0 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  ** database tran
12dd0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20  saction..** .** 
12de0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
12df0 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20  never called in 
12e00 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
12e10 65 2e 20 49 66 20 69 74 20 69 73 20 63 61 6c 6c  e. If it is call
12e20 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52 5f 4e  ed.** in PAGER_N
12e30 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53 48 41  ONE or PAGER_SHA
12e40 52 45 44 20 73 74 61 74 65 20 61 6e 64 20 74 68  RED state and th
12e50 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73 20 6c  e lock held is l
12e60 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65  ess.** exclusive
12e70 20 74 68 61 6e 20 61 20 52 45 53 45 52 56 45 44   than a RESERVED
12e80 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61 20 6e   lock, it is a n
12e90 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  o-op..**.** Othe
12ea0 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74 69 76  rwise, any activ
12eb0 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  e savepoints are
12ec0 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a   released..**.**
12ed0 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
12ee0 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20 74 68  file is open, th
12ef0 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61 6c 69  en it is "finali
12f00 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75  zed". Once a jou
12f10 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61  rnal .** file ha
12f20 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64  s been finalized
12f30 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
12f40 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f  ble to use it to
12f50 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a   roll back a .**
12f60 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f   transaction. No
12f70 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e  r will it be con
12f80 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 61 20  sidered to be a 
12f90 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74  hot-journal by t
12fa0 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74  his.** or any ot
12fb0 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
12fc0 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79  nection. Exactly
12fd0 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69   how a journal i
12fe0 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64  s finalized.** d
12ff0 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65  epends on whethe
13000 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70 61 67  r or not the pag
13010 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
13020 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20   exclusive mode 
13030 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  and.** the curre
13040 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  nt journal-mode 
13050 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f  (Pager.journalMo
13060 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20 66 6f  de value), as fo
13070 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a  llows:.**.**   j
13080 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f  ournalMode==MEMO
13090 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  RY.**     Journa
130a0 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
130b0 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73  r is simply clos
130c0 65 64 2e 20 54 68 69 73 20 64 65 73 74 72 6f 79  ed. This destroy
130d0 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d  s an .**     in-
130e0 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a  memory journal..
130f0 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
13100 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a  ode==TRUNCATE.**
13110 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
13120 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74  e is truncated t
13130 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20  o zero bytes in 
13140 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  size..**.**   jo
13150 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49  urnalMode==PERSI
13160 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20 66 69  ST.**     The fi
13170 72 73 74 20 32 38 20 62 79 74 65 73 20 6f 66 20  rst 28 bytes of 
13180 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13190 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54 68 69   are zeroed. Thi
131a0 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a  s invalidates.**
131b0 20 20 20 20 20 74 68 65 20 66 69 72 73 74 20 6a       the first j
131c0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
131d0 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20 68   the file, and h
131e0 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72 65 20  ence the entire 
131f0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66  journal.**     f
13200 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20  ile. An invalid 
13210 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e  journal file can
13220 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  not be rolled ba
13230 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  ck..**.**   jour
13240 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a  nalMode==DELETE.
13250 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  **     The journ
13260 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  al file is close
13270 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20 75 73  d and deleted us
13280 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  ing sqlite3OsDel
13290 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ete()..**.**    
132a0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
132b0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
132c0 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 69 73  usive mode, this
132d0 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c   method of final
132e0 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65  izing.**     the
132f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
13300 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49 6e 73   never used. Ins
13310 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a 6f 75  tead, if the jou
13320 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20  rnalMode is.**  
13330 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68     DELETE and th
13340 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
13350 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
13360 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72 69 62  e method describ
13370 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20  ed under.**     
13380 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
13390 53 49 53 54 20 69 73 20 75 73 65 64 20 69 6e 73  SIST is used ins
133a0 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  tead..**.** Afte
133b0 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
133c0 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20   finalized, the 
133d0 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 50  pager moves to P
133e0 41 47 45 52 5f 52 45 41 44 45 52 20 73 74 61 74  AGER_READER stat
133f0 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69 6e 67  e..** If running
13400 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69 76   in non-exclusiv
13410 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c  e rollback mode,
13420 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
13430 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64 6f 77   file is .** dow
13440 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53 48 41  ngraded to a SHA
13450 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
13460 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
13470 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f  urned if no erro
13480 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20  r occurs. If an 
13490 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
134a0 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74 68  ing.** any of th
134b0 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73 20  e IO operations 
134c0 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  to finalize the 
134d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
134e0 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64 61  unlock the.** da
134f0 74 61 62 61 73 65 20 74 68 65 6e 20 74 68 65 20  tabase then the 
13500 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
13510 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
13520 20 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a 2a   user. If the .*
13530 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 66  * operation to f
13540 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
13550 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c 20  nal file fails, 
13560 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73 74  then the code st
13570 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f 20  ill.** tries to 
13580 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  unlock the datab
13590 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74 20  ase file if not 
135a0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
135b0 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e 6c  e. If the.** unl
135c0 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66 61  ock operation fa
135d0 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68 65  ils as well, the
135e0 6e 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f  n the first erro
135f0 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a 2a  r code related.*
13600 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  * to the first e
13610 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64  rror encountered
13620 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69   (the journal fi
13630 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29 20  nalization one) 
13640 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  is.** returned..
13650 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
13660 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
13670 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
13680 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72  r, int hasMaster
13690 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a  , int bCommit){.
136a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
136b0 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45 72  E_OK;      /* Er
136c0 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a 6f  ror code from jo
136d0 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69  urnal finalizati
136e0 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  on operation */.
136f0 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49    int rc2 = SQLI
13700 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45 72  TE_OK;     /* Er
13710 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64 62  ror code from db
13720 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70 65   file unlock ope
13730 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  ration */..  /* 
13740 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 68  Do nothing if th
13750 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74  e pager does not
13760 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72   have an open wr
13770 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite transaction.
13780 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61 73 74    ** or at least
13790 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
137a0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
137b0 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68  may be called wh
137c0 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  en there.  ** is
137d0 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61   no write-transa
137e0 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62 75 74  ction active but
137f0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67   a RESERVED or g
13800 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 0a 20  reater lock is. 
13810 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72 20 74   ** held under t
13820 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  wo circumstances
13830 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 2e  :.  **.  **   1.
13840 20 41 66 74 65 72 20 61 20 73 75 63 63 65 73 73   After a success
13850 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  ful hot-journal 
13860 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20  rollback, it is 
13870 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20 2a 2a  called with.  **
13880 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d 50 41        eState==PA
13890 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65 4c 6f  GER_NONE and eLo
138a0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
138b0 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  CK..  **.  **   
138c0 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63 74 69  2. If a connecti
138d0 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f  on with locking_
138e0 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 68  mode=exclusive h
138f0 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  olding an EXCLUS
13900 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20 20 6c  IVE .  **      l
13910 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62 61 63  ock switches bac
13920 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  k to locking_mod
13930 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74 68 65  e=normal and the
13940 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20 20 2a  n executes a.  *
13950 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72 61 6e  *      read-tran
13960 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 66 75  saction, this fu
13970 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
13980 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d 50 41   with eState==PA
13990 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 2a 2a  GER_READER .  **
139a0 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63 6b 3d        and eLock=
139b0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
139c0 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d 74 72  when the read-tr
139d0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f  ansaction is clo
139e0 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  sed..  */.  asse
139f0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
13a00 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
13a10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
13a20 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
13a30 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 28  R_ERROR );.  if(
13a40 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c   pPager->eState<
13a50 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
13a60 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e 65  KED && pPager->e
13a70 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f 4c 4f  Lock<RESERVED_LO
13a80 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  CK ){.    return
13a90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13aa0 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  .  releaseAllSav
13ab0 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b  epoints(pPager);
13ac0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
13ad0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
13ae0 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  | pPager->pInJou
13af0 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  rnal==0 );.  if(
13b00 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
13b10 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65  jfd) ){.    asse
13b20 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
13b30 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20  (pPager) );..   
13b40 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65   /* Finalize the
13b50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
13b60 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
13b70 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50  3IsMemJournal(pP
13b80 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
13b90 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
13ba0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
13bb0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
13bc0 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20  DE_MEMORY );.   
13bd0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
13be0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
13bf0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
13c00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
13c10 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
13c20 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b  MODE_TRUNCATE ){
13c30 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
13c40 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
13c50 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
13c60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
13c70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13c80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
13c90 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
13ca0 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  jfd, 0);.       
13cb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13cc0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 66 75  OK && pPager->fu
13cd0 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  llSync ){.      
13ce0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
13cf0 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 73 69   the new file si
13d00 7a 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ze is written in
13d10 74 6f 20 74 68 65 20 69 6e 6f 64 65 20 72 69 67  to the inode rig
13d20 68 74 20 61 77 61 79 2e 0a 20 20 20 20 20 20 20  ht away..       
13d30 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20     ** Otherwise 
13d40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
13d50 74 20 72 65 73 75 72 72 65 63 74 20 66 6f 6c 6c  t resurrect foll
13d60 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 6c 6f  owing a power lo
13d70 73 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  ss and.         
13d80 20 2a 2a 20 63 61 75 73 65 20 74 68 65 20 6c 61   ** cause the la
13d90 73 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  st transaction t
13da0 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20 53 65  o roll back.  Se
13db0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68  e.          ** h
13dc0 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e  ttps://bugzilla.
13dd0 6d 6f 7a 69 6c 6c 61 2e 6f 72 67 2f 73 68 6f 77  mozilla.org/show
13de0 5f 62 75 67 2e 63 67 69 3f 69 64 3d 31 30 37 32  _bug.cgi?id=1072
13df0 37 37 33 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  773.          */
13e00 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
13e10 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
13e20 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
13e30 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
13e40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13e50 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
13e60 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
13e70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
13e80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13e90 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
13ea0 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20  ODE_PERSIST.    
13eb0 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78    || (pPager->ex
13ec0 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70  clusiveMode && p
13ed0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
13ee0 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
13ef0 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20 29  LMODE_WAL).    )
13f00 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72  {.      rc = zer
13f10 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  oJournalHdr(pPag
13f20 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b 0a  er, hasMaster);.
13f30 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
13f40 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
13f50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
13f60 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d 61  * This branch ma
13f70 79 20 62 65 20 65 78 65 63 75 74 65 64 20 77 69  y be executed wi
13f80 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  th Pager.journal
13f90 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66 0a  Mode==MEMORY if.
13fa0 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d 6a        ** a hot-j
13fb0 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74 20  ournal was just 
13fc0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e 20  rolled back. In 
13fd0 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f  this case the jo
13fe0 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 66  urnal.      ** f
13ff0 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c  ile should be cl
14000 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64  osed and deleted
14010 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  . If this connec
14020 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a 20  tion writes to. 
14030 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
14040 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77 69  base file, it wi
14050 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20 61  ll do so using a
14060 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
14070 6e 61 6c 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  nal. .      */. 
14080 20 20 20 20 20 69 6e 74 20 62 44 65 6c 65 74 65       int bDelete
14090 20 3d 20 28 21 70 50 61 67 65 72 2d 3e 74 65 6d   = (!pPager->tem
140a0 70 46 69 6c 65 20 26 26 20 73 71 6c 69 74 65 33  pFile && sqlite3
140b0 4a 6f 75 72 6e 61 6c 45 78 69 73 74 73 28 70 50  JournalExists(pP
140c0 61 67 65 72 2d 3e 6a 66 64 29 29 3b 0a 20 20 20  ager->jfd));.   
140d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
140e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
140f0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
14100 45 5f 44 45 4c 45 54 45 20 0a 20 20 20 20 20 20  E_DELETE .      
14110 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
14120 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
14130 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
14140 45 4d 4f 52 59 20 0a 20 20 20 20 20 20 20 20 20  EMORY .         
14150 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
14160 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
14170 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
14180 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
14190 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
141a0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
141b0 20 20 20 69 66 28 20 62 44 65 6c 65 74 65 20 29     if( bDelete )
141c0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
141d0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
141e0 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
141f0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30  ger->zJournal, 0
14200 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
14210 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
14220 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
14230 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49    sqlite3PcacheI
14240 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67  terateDirty(pPag
14250 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67  er->pPCache, pag
14260 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29  er_set_pagehash)
14270 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
14280 64 62 53 69 7a 65 3d 3d 30 20 26 26 20 73 71 6c  dbSize==0 && sql
14290 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
142a0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
142b0 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 50 67 48  he)>0 ){.    PgH
142c0 64 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 50  dr *p = sqlite3P
142d0 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65  agerLookup(pPage
142e0 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 1);.    if( p
142f0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 61 67   ){.      p->pag
14300 65 48 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 20  eHash = 0;.     
14310 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
14320 65 66 4e 6f 74 4e 75 6c 6c 28 70 29 3b 0a 20 20  efNotNull(p);.  
14330 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
14340 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
14350 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
14360 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
14370 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
14380 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
14390 6e 52 65 63 20 3d 20 30 3b 0a 20 20 73 71 6c 69  nRec = 0;.  sqli
143a0 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  te3PcacheCleanAl
143b0 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  l(pPager->pPCach
143c0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  e);.  sqlite3Pca
143d0 63 68 65 54 72 75 6e 63 61 74 65 28 70 50 61 67  cheTruncate(pPag
143e0 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61  er->pPCache, pPa
143f0 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 0a 20  ger->dbSize);.. 
14400 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
14410 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
14420 2f 2a 20 44 72 6f 70 20 74 68 65 20 57 41 4c 20  /* Drop the WAL 
14430 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69 66 20 61  write-lock, if a
14440 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65  ny. Also, if the
14450 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20   connection was 
14460 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 69  in .    ** locki
14470 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76  ng_mode=exclusiv
14480 65 20 6d 6f 64 65 20 62 75 74 20 69 73 20 6e 6f  e mode but is no
14490 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70 20 74 68   longer, drop th
144a0 65 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20  e EXCLUSIVE .   
144b0 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e   ** lock held on
144c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
144d0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  le..    */.    r
144e0 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 45  c2 = sqlite3WalE
144f0 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 74 69  ndWriteTransacti
14500 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
14510 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
14520 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  2==SQLITE_OK );.
14530 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
14540 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f  SQLITE_OK && bCo
14550 6d 6d 69 74 20 26 26 20 70 50 61 67 65 72 2d 3e  mmit && pPager->
14560 64 62 46 69 6c 65 53 69 7a 65 3e 70 50 61 67 65  dbFileSize>pPage
14570 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
14580 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
14590 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 63 6f  is taken when co
145a0 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
145b0 61 63 74 69 6f 6e 20 69 6e 20 72 6f 6c 6c 62 61  action in rollba
145c0 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  ck-journal.    *
145d0 2a 20 6d 6f 64 65 20 69 66 20 74 68 65 20 64 61  * mode if the da
145e0 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64  tabase file on d
145f0 69 73 6b 20 69 73 20 6c 61 72 67 65 72 20 74 68  isk is larger th
14600 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  an the database 
14610 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 20 41 74  image..    ** At
14620 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
14630 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e  journal has been
14640 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20 74   finalized and t
14650 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  he transaction .
14660 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75      ** successfu
14670 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2c 20 62  lly committed, b
14680 75 74 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  ut the EXCLUSIVE
14690 20 6c 6f 63 6b 20 69 73 20 73 74 69 6c 6c 20 68   lock is still h
146a0 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  eld on the.    *
146b0 2a 20 66 69 6c 65 2e 20 53 6f 20 69 74 20 69 73  * file. So it is
146c0 20 73 61 66 65 20 74 6f 20 74 72 75 6e 63 61 74   safe to truncat
146d0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
146e0 69 6c 65 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d  ile to its minim
146f0 75 6d 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  um.    ** requir
14700 65 64 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20 20  ed size.  */.   
14710 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
14720 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
14730 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63  E_LOCK );.    rc
14740 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
14750 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
14760 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  ->dbSize);.  }..
14770 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14780 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26  _OK && bCommit &
14790 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
147a0 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  >fd) ){.    rc =
147b0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
147c0 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64  ntrol(pPager->fd
147d0 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  , SQLITE_FCNTL_C
147e0 4f 4d 4d 49 54 5f 50 48 41 53 45 54 57 4f 2c 20  OMMIT_PHASETWO, 
147f0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
14800 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
14810 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
14820 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  ;.  }..  if( !pP
14830 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
14840 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70 61 67  ode .   && (!pag
14850 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
14860 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45 78   || sqlite3WalEx
14870 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67  clusiveMode(pPag
14880 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20 20  er->pWal, 0)).  
14890 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67  ){.    rc2 = pag
148a0 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
148b0 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
148c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
148d0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30  ngeCountDone = 0
148e0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
148f0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  eState = PAGER_R
14900 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72 2d  EADER;.  pPager-
14910 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
14920 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
14930 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29  QLITE_OK?rc2:rc)
14940 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  ;.}../*.** Execu
14950 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66  te a rollback if
14960 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
14970 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c  s active and unl
14980 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ock the .** data
14990 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  base file. .**.*
149a0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  * If the pager h
149b0 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72  as already enter
149c0 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
149d0 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d  te, do not attem
149e0 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  pt .** the rollb
149f0 61 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d 65  ack at this time
14a00 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65 72  . Instead, pager
14a10 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c  _unlock() is cal
14a20 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  led. The.** call
14a30 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
14a40 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64 20  () will discard 
14a50 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  all in-memory pa
14a60 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74  ges, unlock.** t
14a70 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14a80 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70 61   and move the pa
14a90 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e  ger back to OPEN
14aa0 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73 20   state. If this 
14ab0 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74  .** means that t
14ac0 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f  here is a hot-jo
14ad0 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74 68  urnal left in th
14ae0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74  e file-system, t
14af0 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e  he next .** conn
14b00 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e  ection to obtain
14b10 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   a shared lock o
14b20 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68 69  n the pager (whi
14b30 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20 6f  ch may be this o
14b40 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c  ne) .** will rol
14b50 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  l it back..**.**
14b60 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61   If the pager ha
14b70 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 6e  s not already en
14b80 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
14b90 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49 4f  state, but an IO
14ba0 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72   or.** malloc er
14bb0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
14bc0 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  g a rollback, th
14bd0 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74 73  en this will its
14be0 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74 68  elf cause .** th
14bf0 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
14c00 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
14c10 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65 20  . Which will be 
14c20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a 2a  cleared by the.*
14c30 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  * call to pager_
14c40 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65 73  unlock(), as des
14c50 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f  cribed above..*/
14c60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
14c70 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
14c80 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
14c90 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
14ca0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
14cb0 45 52 52 4f 52 20 26 26 20 70 50 61 67 65 72 2d  ERROR && pPager-
14cc0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
14cd0 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  PEN ){.    asser
14ce0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
14cf0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
14d00 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
14d10 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
14d20 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a  RITER_LOCKED ){.
14d30 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
14d40 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
14d50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
14d60 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61  agerRollback(pPa
14d70 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ger);.      sqli
14d80 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
14d90 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  oc();.    }else 
14da0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
14db0 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
14dc0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
14dd0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
14de0 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20  R_READER );.    
14df0 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e    pager_end_tran
14e00 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
14e10 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
14e20 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  .  pager_unlock(
14e30 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
14e40 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61 74  * Parameter aDat
14e50 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  a must point to 
14e60 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61 67  a buffer of pPag
14e70 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
14e80 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43  es.** of data. C
14e90 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
14ea0 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73  n a checksum bas
14eb0 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65  ed ont the conte
14ec0 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  nts of the .** p
14ed0 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20  age of data and 
14ee0 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
14ef0 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73  e of pPager->cks
14f00 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  umInit..**.** Th
14f10 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c  is is not a real
14f20 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73   checksum. It is
14f30 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65   really just the
14f40 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20   sum of the .** 
14f50 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76  random initial v
14f60 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b  alue (pPager->ck
14f70 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65  sumInit) and eve
14f80 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a  ry 200th byte.**
14f90 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
14fa0 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  a, starting with
14fb0 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70 50   byte offset (pP
14fc0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32  ager->pageSize%2
14fd0 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74  00)..** Each byt
14fe0 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  e is interpreted
14ff0 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73   as an 8-bit uns
15000 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a  igned integer..*
15010 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68  *.** Changing th
15020 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74  e formula used t
15030 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63  o compute this c
15040 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20  hecksum results 
15050 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61  in an.** incompa
15060 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69  tible journal fi
15070 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  le format..**.**
15080 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72   If journal corr
15090 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75  uption occurs du
150a0 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69  e to a power fai
150b0 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c  lure, the most l
150c0 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72  ikely .** scenar
150d0 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65  io is that one e
150e0 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  nd or the other 
150f0 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69  of the record wi
15100 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a  ll be changed. .
15110 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65  ** It is much le
15120 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74  ss likely that t
15130 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74  he two ends of t
15140 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
15150 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72  d will be.** cor
15160 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64  rect and the mid
15170 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20  dle be corrupt. 
15180 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65   Thus, this "che
15190 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a  cksum" scheme,.*
151a0 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e  * though fast an
151b0 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65  d simple, catche
151c0 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b  s the mostly lik
151d0 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72  ely kind of corr
151e0 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
151f0 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75  c u32 pager_cksu
15200 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  m(Pager *pPager,
15210 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61   const u8 *aData
15220 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ){.  u32 cksum =
15230 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
15240 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  it;         /* C
15250 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f  hecksum value to
15260 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
15270 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67   i = pPager->pag
15280 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20  eSize-200;      
15290 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
152a0 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ter */.  while( 
152b0 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d  i>0 ){.    cksum
152c0 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20   += aData[i];.  
152d0 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a    i -= 200;.  }.
152e0 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
152f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20  }../*.** Report 
15300 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
15310 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72   size and number
15320 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74   of reserved byt
15330 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68  es back.** to th
15340 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64  e codec..*/.#ifd
15350 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
15360 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEC.static void 
15370 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
15380 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
15390 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43    if( pPager->xC
153a0 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a  odecSizeChng ){.
153b0 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64      pPager->xCod
153c0 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67 65  ecSizeChng(pPage
153d0 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67 65  r->pCodec, pPage
153e0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  r->pageSize,.   
153f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15400 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 50 61          (int)pPa
15410 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a  ger->nReserve);.
15420 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
15430 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72 74  fine pagerReport
15440 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20 4e  Size(X)     /* N
15450 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e 6f  o-op if we do no
15460 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64 65  t support a code
15470 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69 66  c */.#endif..#if
15480 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
15490 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ODEC./*.** Make 
154a0 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20  sure the number 
154b0 6f 66 20 72 65 73 65 72 76 65 64 20 62 69 74 73  of reserved bits
154c0 20 69 73 20 74 68 65 20 73 61 6d 65 20 69 6e 20   is the same in 
154d0 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  the destination.
154e0 2a 2a 20 70 61 67 65 72 20 61 73 20 69 74 20 69  ** pager as it i
154f0 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 2e  s in the source.
15500 20 20 54 68 69 73 20 63 6f 6d 65 73 20 75 70 20    This comes up 
15510 77 68 65 6e 20 61 20 56 41 43 55 55 4d 20 63 68  when a VACUUM ch
15520 61 6e 67 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6d  anges the.** num
15530 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
15540 62 69 74 73 20 74 6f 20 74 68 65 20 22 6f 70 74  bits to the "opt
15550 69 6d 61 6c 22 20 61 6d 6f 75 6e 74 2e 0a 2a 2f  imal" amount..*/
15560 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
15570 65 72 41 6c 69 67 6e 52 65 73 65 72 76 65 28 50  erAlignReserve(P
15580 61 67 65 72 20 2a 70 44 65 73 74 2c 20 50 61 67  ager *pDest, Pag
15590 65 72 20 2a 70 53 72 63 29 7b 0a 20 20 69 66 28  er *pSrc){.  if(
155a0 20 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76 65   pDest->nReserve
155b0 21 3d 70 53 72 63 2d 3e 6e 52 65 73 65 72 76 65  !=pSrc->nReserve
155c0 20 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e   ){.    pDest->n
155d0 52 65 73 65 72 76 65 20 3d 20 70 53 72 63 2d 3e  Reserve = pSrc->
155e0 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61  nReserve;.    pa
155f0 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 44  gerReportSize(pD
15600 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  est);.  }.}.#end
15610 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  if../*.** Read a
15620 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f   single page fro
15630 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75  m either the jou
15640 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73  rnal file (if is
15650 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a  MainJrnl==1) or.
15660 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ** from the sub-
15670 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61  journal (if isMa
15680 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70  inJrnl==0) and p
15690 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70 61 67  layback that pag
156a0 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62  e..** The page b
156b0 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20  egins at offset 
156c0 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68  *pOffset into th
156d0 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66  e file. The *pOf
156e0 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73  fset.** value is
156f0 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68   increased to th
15700 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
15710 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
15720 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
15730 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
15740 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20 63 68   journal uses ch
15750 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74  ecksums - the st
15760 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
15770 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a  does .** not..**
15780 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
15790 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  number of the pa
157a0 67 65 20 72 65 63 6f 72 64 20 72 65 61 64 20 66  ge record read f
157b0 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
157c0 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
157d0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
157e0 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
157f0 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  of Pager.dbSize,
15800 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20 69   then playback i
15810 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e 64  s.** skipped and
15820 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
15830 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
15840 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55   pDone is not NU
15850 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61  LL, then it is a
15860 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65 73   record of pages
15870 20 74 68 61 74 20 68 61 76 65 20 61 6c 72 65 61   that have alrea
15880 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65  dy.** been playe
15890 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65 20  d back.  If the 
158a0 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65 74  page at *pOffset
158b0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
158c0 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a  n played back.**
158d0 20 28 69 66 20 74 68 65 20 63 6f 72 72 65 73 70   (if the corresp
158e0 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69 74  onding pDone bit
158f0 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 73 6b   is set) then sk
15900 69 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b 2e  ip the playback.
15910 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
15920 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72 72  e pDone bit corr
15930 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
15940 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20 69   *pOffset page i
15950 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74  s set.** prior t
15960 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  o returning..**.
15970 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 72  ** If the page r
15980 65 63 6f 72 64 20 69 73 20 73 75 63 63 65 73 73  ecord is success
15990 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  fully read from 
159a0 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
159b0 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c  l file.** and pl
159c0 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e 20  ayed back, then 
159d0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
159e0 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
159f0 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20  error occurs.** 
15a00 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74 68  while reading th
15a10 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68  e record from th
15a20 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
15a30 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77 72  file or while wr
15a40 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20  iting.** to the 
15a50 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
15a60 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
15a70 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
15a80 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69 73  d. If data.** is
15a90 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65   successfully re
15aa0 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
15ab0 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62  -)journal file b
15ac0 75 74 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ut appears to be
15ad0 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20 53  .** corrupted, S
15ae0 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65  QLITE_DONE is re
15af0 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73 20  turned. Data is 
15b00 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72 75  considered corru
15b10 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63  pted in.** two c
15b20 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a  ircumstances:.**
15b30 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20   .**   * If the 
15b40 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62  record page-numb
15b50 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28 30  er is illegal (0
15b60 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e   or PAGER_MJ_PGN
15b70 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66  O), or.**   * If
15b80 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 62   the record is b
15b90 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
15ba0 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
15bb0 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20  ournal file.**  
15bc0 20 20 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b     and the check
15bd0 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20 6e  sum field does n
15be0 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72 65 63  ot match the rec
15bf0 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a  ord content..**.
15c00 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74 68  ** Neither of th
15c10 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f  ese two scenario
15c20 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20 64  s are possible d
15c30 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69 6e  uring a savepoin
15c40 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  t rollback..**.*
15c50 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
15c60 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
15c70 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d  k, then memory m
15c80 61 79 20 68 61 76 65 20 74 6f 20 62 65 20 64 79  ay have to be dy
15c90 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c  namically.** all
15ca0 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66  ocated by this f
15cb0 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73  unction. If this
15cc0 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64   is the case and
15cd0 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66   an allocation f
15ce0 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ails,.** SQLITE_
15cf0 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
15d00 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
15d10 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
15d20 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65  one_page(.  Page
15d30 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
15d40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15d50 20 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61   pager being pla
15d60 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 36  yed back */.  i6
15d70 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20 20  4 *pOffset,     
15d80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
15d90 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64 20  ffset of record 
15da0 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20  to playback */. 
15db0 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c 20   Bitvec *pDone, 
15dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15dd0 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61 67 65  * Bitvec of page
15de0 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65 64  s already played
15df0 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69   back */.  int i
15e00 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20  sMainJrnl,      
15e10 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e           /* 1 ->
15e20 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30   main journal. 0
15e30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e   -> sub-journal.
15e40 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65   */.  int isSave
15e50 70 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20  pnt             
15e60 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
15e70 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
15e80 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  back */.){.  int
15e90 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
15ea0 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
15eb0 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
15ec0 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20  ing page in the 
15ed0 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  cache */.  Pgno 
15ee0 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
15ef0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
15f00 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
15f10 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c   page in journal
15f20 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
15f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f40 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
15f50 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20  used for sanity 
15f60 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63 68  checking */.  ch
15f70 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20  ar *aData;      
15f80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15f90 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
15fa0 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f   for the page */
15fb0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
15fc0 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  *jfd;           
15fd0 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
15fe0 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
15ff0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
16000 20 20 69 6e 74 20 69 73 53 79 6e 63 65 64 3b 20    int isSynced; 
16010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16020 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
16030 61 6c 20 70 61 67 65 20 69 73 20 73 79 6e 63 65  al page is synce
16040 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
16050 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d  (isMainJrnl&~1)=
16060 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 69 73  =0 );      /* is
16070 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72  MainJrnl is 0 or
16080 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   1 */.  assert( 
16090 28 69 73 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d  (isSavepnt&~1)==
160a0 30 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 69 73  0 );       /* is
160b0 53 61 76 65 70 6e 74 20 69 73 20 30 20 6f 72 20  Savepnt is 0 or 
160c0 31 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  1 */.  assert( i
160d0 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f  sMainJrnl || pDo
160e0 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f  ne );     /* pDo
160f0 6e 65 20 61 6c 77 61 79 73 20 75 73 65 64 20 6f  ne always used o
16100 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a  n sub-journals *
16110 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 53 61  /.  assert( isSa
16120 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d  vepnt || pDone==
16130 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20  0 );   /* pDone 
16140 6e 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f  never used on no
16150 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a  n-savepoint */..
16160 20 20 61 44 61 74 61 20 3d 20 70 50 61 67 65 72    aData = pPager
16170 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 61  ->pTmpSpace;.  a
16180 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b 20  ssert( aData ); 
16190 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
161a0 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61 76  storage must hav
161b0 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  e already been a
161c0 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 61 73  llocated */.  as
161d0 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
161e0 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20  l(pPager)==0 || 
161f0 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20  (!isMainJrnl && 
16200 69 73 53 61 76 65 70 6e 74 29 20 29 3b 0a 0a 20  isSavepnt) );.. 
16210 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 73   /* Either the s
16220 74 61 74 65 20 69 73 20 67 72 65 61 74 65 72 20  tate is greater 
16230 74 68 61 6e 20 50 41 47 45 52 5f 57 52 49 54 45  than PAGER_WRITE
16240 52 5f 43 41 43 48 45 4d 4f 44 20 28 61 20 74 72  R_CACHEMOD (a tr
16250 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20  ansaction .  ** 
16260 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c  or savepoint rol
16270 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74 20 74 68  lback done at th
16280 65 20 72 65 71 75 65 73 74 20 6f 66 20 74 68 65  e request of the
16290 20 63 61 6c 6c 65 72 29 20 6f 72 20 74 68 69 73   caller) or this
162a0 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a   is.  ** a hot-j
162b0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e  ournal rollback.
162c0 20 49 66 20 69 74 20 69 73 20 61 20 68 6f 74 2d   If it is a hot-
162d0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
162e0 2c 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a  , the pager.  **
162f0 20 69 73 20 69 6e 20 73 74 61 74 65 20 4f 50 45   is in state OPE
16300 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61 6e 20 45  N and holds an E
16310 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 48  XCLUSIVE lock. H
16320 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
16330 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72 65  ack.  ** only re
16340 61 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ads from the mai
16350 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20 74  n journal, not t
16360 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a  he sub-journal..
16370 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
16380 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
16390 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
163a0 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 28  EMOD.       || (
163b0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
163c0 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 70 50  PAGER_OPEN && pP
163d0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
163e0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29  LUSIVE_LOCK).  )
163f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
16400 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
16410 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
16420 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c 20  D || isMainJrnl 
16430 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  );..  /* Read th
16440 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
16450 64 20 70 61 67 65 20 64 61 74 61 20 66 72 6f 6d  d page data from
16460 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20   the journal or 
16470 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  sub-journal.  **
16480 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e   file. Return an
16490 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
164a0 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e 20  he caller if an 
164b0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  IO error occurs.
164c0 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73  .  */.  jfd = is
164d0 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65  MainJrnl ? pPage
164e0 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d  r->jfd : pPager-
164f0 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65  >sjfd;.  rc = re
16500 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a 70  ad32bits(jfd, *p
16510 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a  Offset, &pgno);.
16520 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16530 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
16540 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
16550 73 52 65 61 64 28 6a 66 64 2c 20 28 75 38 2a 29  sRead(jfd, (u8*)
16560 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
16570 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73  ageSize, (*pOffs
16580 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63  et)+4);.  if( rc
16590 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
165a0 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66  turn rc;.  *pOff
165b0 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70  set += pPager->p
165c0 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73  ageSize + 4 + is
165d0 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f  MainJrnl*4;..  /
165e0 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * Sanity checkin
165f0 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20  g on the page.  
16600 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70  This is more imp
16610 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72  ortant that I or
16620 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68  iginally.  ** th
16630 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77  ought.  If a pow
16640 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
16650 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
16660 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69  nal is being wri
16670 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f  tten,.  ** it co
16680 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69  uld cause invali
16690 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69  d data to be wri
166a0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
166b0 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20  urnal.  We need 
166c0 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74  to.  ** detect t
166d0 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61  his invalid data
166e0 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62   (with high prob
166f0 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e  ability) and ign
16700 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  ore it..  */.  i
16710 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  f( pgno==0 || pg
16720 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
16730 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
16740 20 61 73 73 65 72 74 28 20 21 69 73 53 61 76 65   assert( !isSave
16750 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72  pnt );.    retur
16760 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
16770 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50   }.  if( pgno>(P
16780 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69  gno)pPager->dbSi
16790 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74  ze || sqlite3Bit
167a0 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70  vecTest(pDone, p
167b0 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75  gno) ){.    retu
167c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
167d0 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72  }.  if( isMainJr
167e0 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  nl ){.    rc = r
167f0 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28  ead32bits(jfd, (
16800 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b  *pOffset)-4, &ck
16810 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sum);.    if( rc
16820 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
16830 20 20 69 66 28 20 21 69 73 53 61 76 65 70 6e 74    if( !isSavepnt
16840 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28   && pager_cksum(
16850 70 50 61 67 65 72 2c 20 28 75 38 2a 29 61 44 61  pPager, (u8*)aDa
16860 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20  ta)!=cksum ){.  
16870 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16880 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
16890 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
168a0 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79  page has already
168b0 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
168c0 6b 20 62 65 66 6f 72 65 20 64 75 72 69 6e 67 20  k before during 
168d0 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a  the current.  **
168e0 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
168f0 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 74 6f 20  don't bother to 
16900 70 6c 61 79 20 69 74 20 62 61 63 6b 20 61 67 61  play it back aga
16910 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  in..  */.  if( p
16920 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73 71  Done && (rc = sq
16930 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
16940 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53 51  Done, pgno))!=SQ
16950 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
16960 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
16970 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67   /* When playing
16980 20 62 61 63 6b 20 70 61 67 65 20 31 2c 20 72 65   back page 1, re
16990 73 74 6f 72 65 20 74 68 65 20 6e 52 65 73 65 72  store the nReser
169a0 76 65 20 73 65 74 74 69 6e 67 0a 20 20 2a 2f 0a  ve setting.  */.
169b0 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 26 26    if( pgno==1 &&
169c0 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
169d0 65 21 3d 28 28 75 38 2a 29 61 44 61 74 61 29 5b  e!=((u8*)aData)[
169e0 32 30 5d 20 29 7b 0a 20 20 20 20 70 50 61 67 65  20] ){.    pPage
169f0 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 28  r->nReserve = ((
16a00 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 3b 0a  u8*)aData)[20];.
16a10 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53      pagerReportS
16a20 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ize(pPager);.  }
16a30 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
16a40 67 65 72 20 69 73 20 69 6e 20 43 41 43 48 45 4d  ger is in CACHEM
16a50 4f 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74  OD state, then t
16a60 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63  here must be a c
16a70 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a  opy of this.  **
16a80 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67   page in the pag
16a90 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69  er cache. In thi
16aa0 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61  s case just upda
16ab0 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63  te the pager cac
16ac0 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65  he,.  ** not the
16ad0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
16ae0 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74  The page is left
16af0 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e   marked dirty in
16b00 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a   this case..  **
16b10 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69  .  ** An excepti
16b20 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20  on to the above 
16b30 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74  rule: If the dat
16b40 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73  abase is in no-s
16b50 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e  ync mode.  ** an
16b60 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65  d a page is move
16b70 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72  d during an incr
16b80 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74  emental vacuum t
16b90 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79  hen the page may
16ba0 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20  .  ** not be in 
16bb0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
16bc0 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c   Later: if a mal
16bd0 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f  loc() or IO erro
16be0 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75  r occurs.  ** du
16bf0 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28  ring a Movepage(
16c00 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65  ) call, then the
16c10 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65   page may not be
16c20 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20   in the cache.  
16c30 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68  ** either. So th
16c40 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63  e condition desc
16c50 72 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f  ribed in the abo
16c60 76 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20  ve paragraph is 
16c70 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28  not.  ** assert(
16c80 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  )able..  **.  **
16c90 20 49 66 20 69 6e 20 57 52 49 54 45 52 5f 44 42   If in WRITER_DB
16ca0 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46 49 4e 49  MOD, WRITER_FINI
16cb0 53 48 45 44 20 6f 72 20 4f 50 45 4e 20 73 74 61  SHED or OPEN sta
16cc0 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61  te, then we upda
16cd0 74 65 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65  te the.  ** page
16ce0 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78  r cache if it ex
16cf0 69 73 74 73 20 61 6e 64 20 74 68 65 20 6d 61 69  ists and the mai
16d00 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  n file. The page
16d10 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20   is then marked 
16d20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72 74 79 2e  .  ** not dirty.
16d30 20 53 69 6e 63 65 20 74 68 69 73 20 63 6f 64 65   Since this code
16d40 20 69 73 20 6f 6e 6c 79 20 65 78 65 63 75 74 65   is only execute
16d50 64 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20  d in PAGER_OPEN 
16d60 73 74 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 61  state for.  ** a
16d70 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
16d80 6c 62 61 63 6b 2c 20 69 74 20 69 73 20 67 75 61  lback, it is gua
16d90 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65  ranteed that the
16da0 20 70 61 67 65 2d 63 61 63 68 65 20 69 73 20 65   page-cache is e
16db0 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20 74 68 65  mpty.  ** if the
16dc0 20 70 61 67 65 72 20 69 73 20 69 6e 20 4f 50 45   pager is in OPE
16dd0 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a 0a 20 20  N state..  **.  
16de0 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a  ** Ticket #1171:
16df0 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20    The statement 
16e00 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
16e10 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65  ntain page conte
16e20 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  nt that is.  ** 
16e30 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
16e40 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
16e50 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
16e60 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
16e70 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72  .  ** This occur
16e80 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73  s when a page is
16e90 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
16ea0 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  o the start of a
16eb0 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
16ec0 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61  then changed aga
16ed0 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  in within the st
16ee0 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72  atement.  When r
16ef0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68  olling back such
16f00 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e   a.  ** statemen
16f10 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72  t we must not wr
16f20 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69  ite to the origi
16f30 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c  nal database unl
16f40 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a  ess we know.  **
16f50 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61   for certain tha
16f60 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  t original page 
16f70 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e  contents are syn
16f80 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  ced into the mai
16f90 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
16fa0 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77  journal.  Otherw
16fb0 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73  ise, a power los
16fc0 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f  s might leave mo
16fd0 64 69 66 69 65 64 20 64 61 74 61 20 69 6e 20 74  dified data in t
16fe0 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
16ff0 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e   file without an
17000 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f   entry in the ro
17010 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74  llback journal t
17020 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73  hat can.  ** res
17030 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
17040 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  e to its origina
17050 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e  l form.  Two con
17060 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a  ditions must be.
17070 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20    ** met before 
17080 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
17090 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28  atabase files. (
170a0 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  1) the database 
170b0 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63  must be.  ** loc
170c0 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f  ked.  (2) we kno
170d0 77 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  w that the origi
170e0 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
170f0 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64   is fully synced
17100 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69  .  ** in the mai
17110 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72  n journal either
17120 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67   because the pag
17130 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
17140 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74  e or else.  ** t
17150 68 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  he page is marke
17160 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30  d as needSync==0
17170 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38  ..  **.  ** 2008
17180 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20 61 74  -04-14:  When at
17190 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61 63 75  tempting to vacu
171a0 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  um a corrupt dat
171b0 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 0a 20  abase file, it. 
171c0 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20   ** is possible 
171d0 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74 65 6d  to fail a statem
171e0 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62 61 73  ent on a databas
171f0 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
17200 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20  yet exist..  ** 
17210 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  Do not attempt t
17220 6f 20 77 72 69 74 65 20 69 66 20 64 61 74 61 62  o write if datab
17230 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 65 76  ase file has nev
17240 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a  er been opened..
17250 20 20 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72    */.  if( pager
17260 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
17270 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20  {.    pPg = 0;. 
17280 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 20   }else{.    pPg 
17290 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
172a0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
172b0 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  o);.  }.  assert
172c0 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20  ( pPg || !MEMDB 
172d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
172e0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
172f0 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 67 3d 3d  ER_OPEN || pPg==
17300 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  0 );.  PAGERTRAC
17310 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20  E(("PLAYBACK %d 
17320 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
17330 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  x) %s\n",.      
17340 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
17350 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
17360 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
17370 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38  r->pageSize, (u8
17380 2a 29 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20  *)aData),.      
17390 20 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c       (isMainJrnl
173a0 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a  ?"main-journal":
173b0 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20  "sub-journal"). 
173c0 20 29 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69   ));.  if( isMai
173d0 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53  nJrnl ){.    isS
173e0 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e  ynced = pPager->
173f0 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66  noSync || (*pOff
17400 73 65 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  set <= pPager->j
17410 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65  ournalHdr);.  }e
17420 6c 73 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65  lse{.    isSynce
17430 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30  d = (pPg==0 || 0
17440 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20  ==(pPg->flags & 
17450 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
17460 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f  );.  }.  if( isO
17470 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a  pen(pPager->fd).
17480 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
17490 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
174a0 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61  TER_DBMOD || pPa
174b0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
174c0 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69  ER_OPEN).   && i
174d0 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20  sSynced.  ){.   
174e0 20 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e   i64 ofst = (pgn
174f0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
17500 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
17510 74 65 73 74 63 61 73 65 28 20 21 69 73 53 61 76  testcase( !isSav
17520 65 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26  epnt && pPg!=0 &
17530 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  & (pPg->flags&PG
17540 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d  HDR_NEED_SYNC)!=
17550 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
17560 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
17570 61 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20  ager) );.    rc 
17580 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
17590 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38  (pPager->fd, (u8
175a0 20 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72   *)aData, pPager
175b0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74  ->pageSize, ofst
175c0 29 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  );.    if( pgno>
175d0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
175e0 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  ze ){.      pPag
175f0 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
17600 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20   pgno;.    }.   
17610 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61   if( pPager->pBa
17620 63 6b 75 70 20 29 7b 0a 20 20 20 20 20 20 43 4f  ckup ){.      CO
17630 44 45 43 31 28 70 50 61 67 65 72 2c 20 61 44 61  DEC1(pPager, aDa
17640 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d  ta, pgno, 3, rc=
17650 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
17660 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b       sqlite3Back
17670 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d  upUpdate(pPager-
17680 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20  >pBackup, pgno, 
17690 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20  (u8*)aData);.   
176a0 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
176b0 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37  , aData, pgno, 7
176c0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
176d0 4d 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20 7d  M, aData);.    }
176e0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73  .  }else if( !is
176f0 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d  MainJrnl && pPg=
17700 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
17710 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61  this is a rollba
17720 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e  ck of a savepoin
17730 74 20 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e  t and data was n
17740 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ot written to.  
17750 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
17760 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  e and the page i
17770 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c  s not in-memory,
17780 20 74 68 65 72 65 20 69 73 20 61 20 70 6f 74 65   there is a pote
17790 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f  ntial.    ** pro
177a0 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70  blem. When the p
177b0 61 67 65 20 69 73 20 6e 65 78 74 20 66 65 74 63  age is next fetc
177c0 68 65 64 20 62 79 20 74 68 65 20 62 2d 74 72 65  hed by the b-tre
177d0 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20  e layer, it .   
177e0 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64   ** will be read
177f0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
17800 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d  se file, which m
17810 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
17820 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74   .    ** current
17830 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
17840 20 54 68 65 72 65 20 61 72 65 20 61 20 63 6f 75   There are a cou
17850 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74  ple of different
17860 20 77 61 79 73 20 74 68 69 73 20 63 61 6e 20 68   ways this can h
17870 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71  appen. All are q
17880 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63  uite.    ** obsc
17890 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e  ure. When runnin
178a0 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  g in synchronous
178b0 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20   mode, this can 
178c0 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20  only happen .   
178d0 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20   ** if the page 
178e0 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  is on the free-l
178f0 69 73 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ist at the start
17900 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
17910 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
17920 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e   populated, then
17930 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c   moved using sql
17940 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
17950 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
17960 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20  ** The solution 
17970 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d  is to add an in-
17980 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74  memory page to t
17990 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e  he cache contain
179a0 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64  ing.    ** the d
179b0 61 74 61 20 6a 75 73 74 20 72 65 61 64 20 66 72  ata just read fr
179c0 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
179d0 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67  al. Mark the pag
179e0 65 20 61 73 20 64 69 72 74 79 20 0a 20 20 20 20  e as dirty .    
179f0 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70 61  ** and if the pa
17a00 67 65 72 20 72 65 71 75 69 72 65 73 20 61 20 6a  ger requires a j
17a10 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65  ournal-sync, the
17a20 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  n mark the page 
17a30 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69  as .    ** requi
17a40 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73  ring a journal-s
17a50 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69 73  ync before it is
17a60 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f   written..    */
17a70 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 53  .    assert( isS
17a80 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 61 73  avepnt );.    as
17a90 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64  sert( (pPager->d
17aa0 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c  oNotSpill & SPIL
17ab0 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 3d  LFLAG_ROLLBACK)=
17ac0 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
17ad0 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20  ->doNotSpill |= 
17ae0 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41  SPILLFLAG_ROLLBA
17af0 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  CK;.    rc = sql
17b00 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
17b10 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26  (pPager, pgno, &
17b20 70 50 67 2c 20 31 29 3b 0a 20 20 20 20 61 73 73  pPg, 1);.    ass
17b30 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f  ert( (pPager->do
17b40 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c  NotSpill & SPILL
17b50 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 21 3d  FLAG_ROLLBACK)!=
17b60 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
17b70 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e  >doNotSpill &= ~
17b80 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41  SPILLFLAG_ROLLBA
17b90 43 4b 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  CK;.    if( rc!=
17ba0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
17bb0 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 67 2d 3e  rn rc;.    pPg->
17bc0 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f  flags &= ~PGHDR_
17bd0 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 73  NEED_READ;.    s
17be0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
17bf0 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a  Dirty(pPg);.  }.
17c00 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
17c10 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75   /* No page shou
17c20 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69  ld ever be expli
17c30 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63  citly rolled bac
17c40 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65  k that is in use
17c50 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20  , except.    ** 
17c60 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68  for page 1 which
17c70 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20   is held in use 
17c80 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70  in order to keep
17c90 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
17ca0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
17cb0 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72   active. However
17cc0 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79   such a page may
17cd0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
17ce0 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20  as a result.    
17cf0 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61  ** of an interna
17d00 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e  l error resultin
17d10 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69  g in an automati
17d20 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  c call to.    **
17d30 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
17d40 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a  lback()..    */.
17d50 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b      void *pData;
17d60 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70 50 67  .    pData = pPg
17d70 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d  ->pData;.    mem
17d80 63 70 79 28 70 44 61 74 61 2c 20 28 75 38 2a 29  cpy(pData, (u8*)
17d90 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
17da0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50  ageSize);.    pP
17db0 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28  ager->xReiniter(
17dc0 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 69 73  pPg);.    if( is
17dd0 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73  MainJrnl && (!is
17de0 53 61 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66 66  Savepnt || *pOff
17df0 73 65 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  set<=pPager->jou
17e00 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20 20 20  rnalHdr) ){.    
17e10 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 74    /* If the cont
17e20 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67  ents of this pag
17e30 65 20 77 65 72 65 20 6a 75 73 74 20 72 65 73 74  e were just rest
17e40 6f 72 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61  ored from the ma
17e50 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  in .      ** jou
17e60 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
17e70 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74  its content must
17e80 20 62 65 20 61 73 20 74 68 65 79 20 77 65 72 65   be as they were
17e90 20 77 68 65 6e 20 74 68 65 20 0a 20 20 20 20 20   when the .     
17ea0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
17eb0 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64  was first opened
17ec0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77  . In this case w
17ed0 65 20 63 61 6e 20 6d 61 72 6b 20 74 68 65 20 70  e can mark the p
17ee0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20  age.      ** as 
17ef0 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74 68 65  clean, since the
17f00 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65  re will be no ne
17f10 65 64 20 74 6f 20 77 72 69 74 65 20 69 74 20 6f  ed to write it o
17f20 75 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ut to the.      
17f30 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  ** database..   
17f40 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
17f50 68 65 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65  here is one exce
17f60 70 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75  ption to this ru
17f70 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  le. If the page 
17f80 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a  is being rolled.
17f90 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73        ** back as
17fa0 20 70 61 72 74 20 6f 66 20 61 20 73 61 76 65 70   part of a savep
17fb0 6f 69 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65  oint (or stateme
17fc0 6e 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f  nt) rollback fro
17fd0 6d 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75  m an .      ** u
17fe0 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20  nsynced portion 
17ff0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
18000 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  nal file, then i
18010 74 20 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20  t is not safe.  
18020 20 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74      ** to mark t
18030 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
18040 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
18050 65 20 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61  e marking the pa
18060 67 65 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63  ge as.      ** c
18070 6c 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20  lean will clear 
18080 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
18090 59 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20  YNC flag. Since 
180a0 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 20 20  the page is.    
180b0 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20    ** already in 
180c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
180d0 20 28 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61   (recorded in Pa
180e0 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20  ger.pInJournal) 
180f0 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  and.      ** the
18100 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
18110 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64   flag is cleared
18120 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  , if the page is
18130 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20   written to.    
18140 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69    ** again withi
18150 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
18160 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d  on, it will be m
18170 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 62  arked as dirty b
18180 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ut.      ** the 
18190 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
181a0 66 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65  flag will not be
181b0 20 73 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74   set. It could t
181c0 68 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a  hen potentially.
181d0 20 20 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74        ** be writ
181e0 74 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65  ten out into the
181f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
18200 65 66 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61  efore its journa
18210 6c 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  l file.      ** 
18220 73 65 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65  segment is synce
18230 64 2e 20 49 66 20 61 20 63 72 61 73 68 20 6f 63  d. If a crash oc
18240 63 75 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66  curs during or f
18250 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20  ollowing this,. 
18260 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
18270 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20   corruption may 
18280 65 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  ensue..      */.
18290 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
182a0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
182b0 72 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r) );.      sqli
182c0 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
182d0 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  an(pPg);.    }. 
182e0 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67     pager_set_pag
182f0 65 68 61 73 68 28 70 50 67 29 3b 0a 0a 20 20 20  ehash(pPg);..   
18300 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
18310 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73  page 1, then res
18320 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f  tore the value o
18330 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  f Pager.dbFileVe
18340 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68  rs..    ** Do th
18350 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65  is before any de
18360 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69  coding. */.    i
18370 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
18380 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
18390 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
183a0 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34  &((u8*)pData)[24
183b0 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  ],sizeof(pPager-
183c0 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
183d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63     }..    /* Dec
183e0 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73  ode the page jus
183f0 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b  t read from disk
18400 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70   */.    CODEC1(p
18410 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
18420 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53  g->pgno, 3, rc=S
18430 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20  QLITE_NOMEM);.  
18440 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
18450 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d  elease(pPg);.  }
18460 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18470 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
18480 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20   zMaster is the 
18490 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
184a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
184b0 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a   single journal.
184c0 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66  ** file that ref
184d0 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73  erred to the mas
184e0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
184f0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72   has just been r
18500 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54  olled back..** T
18510 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
18520 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ks if it is poss
18530 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
18540 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
18550 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64  l file,.** and d
18560 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e  oes so if it is.
18570 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
18580 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e  zMaster may poin
18590 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53  t to Pager.pTmpS
185a0 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75  pace. So that bu
185b0 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20  ffer is not .** 
185c0 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
185d0 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75  e within this fu
185e0 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68  nction..**.** Wh
185f0 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  en a master jour
18600 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61  nal file is crea
18610 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c  ted, it is popul
18620 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61  ated with the na
18630 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f  mes .** of all o
18640 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72  f its child jour
18650 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20  nals, one after 
18660 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74  another, formatt
18670 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20  ed as utf-8 .** 
18680 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68  encoded text. Th
18690 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68  e end of each ch
186a0 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ild journal file
186b0 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
186c0 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e  a .** nul-termin
186d0 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30 29  ator byte (0x00)
186e0 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72  . i.e. the entir
186f0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
18700 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
18710 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61  * file for a tra
18720 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69  nsaction involvi
18730 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65 73  ng two databases
18740 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a   might be:.**.**
18750 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61     "/home/bill/a
18760 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f  .db-journal\x00/
18770 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a  home/bill/b.db-j
18780 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a  ournal\x00".**.*
18790 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  * A master journ
187a0 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79  al file may only
187b0 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65   be deleted once
187c0 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c   all of its chil
187d0 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68  d .** journals h
187e0 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ave been rolled 
187f0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  back..**.** This
18800 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20   function reads 
18810 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
18820 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
18830 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a  al file into .**
18840 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70   memory and loop
18850 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f  s through each o
18860 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
18870 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a  nal names. For.*
18880 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75  * each child jou
18890 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20  rnal, it checks 
188a0 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66  if:.**.**   * if
188b0 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e   the child journ
188c0 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69  al exists, and i
188d0 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74  f so.**   * if t
188e0 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  he child journal
188f0 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65   contains a refe
18900 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20  rence to master 
18910 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20  journal .**     
18920 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a  file zMaster.**.
18930 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f  ** If a child jo
18940 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75  urnal can be fou
18950 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  nd that matches 
18960 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69 74  both of the crit
18970 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74  eria.** above, t
18980 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
18990 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69  urns without doi
189a0 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68  ng anything. Oth
189b0 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f  erwise, if.** no
189c0 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   such child jour
189d0 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  nal can be found
189e0 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69  , file zMaster i
189f0 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a  s deleted from.*
18a00 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  * the file-syste
18a10 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  m using sqlite3O
18a20 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a  sDelete()..**.**
18a30 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
18a40 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
18a50 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63  tion, an error c
18a60 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
18a70 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
18a80 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f  n allocates memo
18a90 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71  ry by calling sq
18aa0 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49  lite3Malloc(). I
18ab0 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  f an allocation.
18ac0 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45  ** fails, SQLITE
18ad0 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
18ae0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
18af0 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f  f no IO or mallo
18b00 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63  c errors .** occ
18b10 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ur, SQLITE_OK is
18b20 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
18b30 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63   TODO: This func
18b40 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61  tion allocates a
18b50 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66   single block of
18b60 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a   memory to load.
18b70 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  ** the entire co
18b80 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61  ntents of the ma
18b90 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18ba0 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65  e. This could be
18bb0 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20  .** a couple of 
18bc0 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20  kilobytes or so 
18bd0 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61  - potentially la
18be0 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 61  rger than the pa
18bf0 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a  ge .** size..*/.
18c00 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
18c10 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72  _delmaster(Pager
18c20 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
18c30 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
18c40 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
18c50 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
18c60 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  fs;.  int rc;   
18c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c80 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
18c90 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
18ca0 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a   *pMaster;    /*
18cb0 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72   Malloc'd master
18cc0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
18cd0 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71  scriptor */.  sq
18ce0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75  lite3_file *pJou
18cf0 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f  rnal;   /* Mallo
18d00 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61  c'd child-journa
18d10 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
18d20 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  r */.  char *zMa
18d30 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  sterJournal = 0;
18d40 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20   /* Contents of 
18d50 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
18d60 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61  ile */.  i64 nMa
18d70 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  sterJournal;    
18d80 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61     /* Size of ma
18d90 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18da0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f  e */.  char *zJo
18db0 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
18dc0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f   /* Pointer to o
18dd0 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 69  ne journal withi
18de0 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20 63  n MJ file */.  c
18df0 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 3b  har *zMasterPtr;
18e00 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
18e10 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69 6c  e to hold MJ fil
18e20 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f 75  ename from a jou
18e30 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
18e40 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20 20  nt nMasterPtr;  
18e50 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f 75           /* Amou
18e60 6e 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  nt of space allo
18e70 63 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65 72  cated to zMaster
18e80 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41  Ptr[] */..  /* A
18e90 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
18ea0 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75 72  r both the pJour
18eb0 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72 20  nal and pMaster 
18ec0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
18ed0 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65 73  ..  ** If succes
18ee0 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d  sful, open the m
18ef0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
18f00 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a  le for reading..
18f10 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d    */.  pMaster =
18f20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
18f30 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
18f40 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  ro(pVfs->szOsFil
18f50 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e  e * 2);.  pJourn
18f60 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  al = (sqlite3_fi
18f70 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61  le *)(((u8 *)pMa
18f80 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a  ster) + pVfs->sz
18f90 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21  OsFile);.  if( !
18fa0 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72  pMaster ){.    r
18fb0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
18fc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
18fd0 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
18fe0 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
18ff0 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
19000 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
19010 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  L);.    rc = sql
19020 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
19030 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65   zMaster, pMaste
19040 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  r, flags, 0);.  
19050 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
19060 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
19070 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f  master_out;..  /
19080 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  * Load the entir
19090 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
190a0 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65   file into space
190b0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20   obtained from. 
190c0 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   ** sqlite3_mall
190d0 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64  oc() and pointed
190e0 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f   to by zMasterJo
190f0 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62  urnal.   Also ob
19100 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63  tain.  ** suffic
19110 69 65 6e 74 20 73 70 61 63 65 20 28 69 6e 20 7a  ient space (in z
19120 4d 61 73 74 65 72 50 74 72 29 20 74 6f 20 68 6f  MasterPtr) to ho
19130 6c 64 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ld the names of 
19140 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72  master.  ** jour
19150 6e 61 6c 20 66 69 6c 65 73 20 65 78 74 72 61 63  nal files extrac
19160 74 65 64 20 66 72 6f 6d 20 72 65 67 75 6c 61 72  ted from regular
19170 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61   rollback-journa
19180 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ls..  */.  rc = 
19190 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
191a0 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73  e(pMaster, &nMas
191b0 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
191c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
191d0 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
191e0 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72  r_out;.  nMaster
191f0 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  Ptr = pVfs->mxPa
19200 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73  thname+1;.  zMas
19210 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  terJournal = sql
19220 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74  ite3Malloc(nMast
19230 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73  erJournal + nMas
19240 74 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 69  terPtr + 1);.  i
19250 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  f( !zMasterJourn
19260 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  al ){.    rc = S
19270 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
19280 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
19290 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  out;.  }.  zMast
192a0 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72  erPtr = &zMaster
192b0 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
192c0 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20  ournal+1];.  rc 
192d0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
192e0 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72  pMaster, zMaster
192f0 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d  Journal, (int)nM
19300 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29  asterJournal, 0)
19310 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
19320 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
19330 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d  master_out;.  zM
19340 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61  asterJournal[nMa
19350 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30  sterJournal] = 0
19360 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20  ;..  zJournal = 
19370 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a  zMasterJournal;.
19380 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e    while( (zJourn
19390 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al-zMasterJourna
193a0 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l)<nMasterJourna
193b0 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 78 69  l ){.    int exi
193c0 73 74 73 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  sts;.    rc = sq
193d0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
193e0 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  fs, zJournal, SQ
193f0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
19400 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20  TS, &exists);.  
19410 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19420 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
19430 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
19440 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
19450 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 2f  xists ){.      /
19460 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * One of the jou
19470 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f  rnals pointed to
19480 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a   by the master j
19490 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20  ournal exists.. 
194a0 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20       ** Open it 
194b0 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20  and check if it 
194c0 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61  points at the ma
194d0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
194e0 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65  .      ** so, re
194f0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c  turn without del
19500 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  eting the master
19510 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
19520 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
19530 74 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 66  t c;.      int f
19540 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
19550 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
19560 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
19570 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72 63  URNAL);.      rc
19580 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
19590 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
195a0 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73   pJournal, flags
195b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
195c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
195d0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
195e0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
195f0 20 20 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d     }..      rc =
19600 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
19610 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61  al(pJournal, zMa
19620 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72  sterPtr, nMaster
19630 50 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Ptr);.      sqli
19640 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72  te3OsClose(pJour
19650 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nal);.      if( 
19660 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19670 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
19680 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
19690 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20     }..      c = 
196a0 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30  zMasterPtr[0]!=0
196b0 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74   && strcmp(zMast
196c0 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d  erPtr, zMaster)=
196d0 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20 63 20  =0;.      if( c 
196e0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ){.        /* We
196f0 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44   have a match. D
19700 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
19710 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19720 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
19730 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
19740 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
19750 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20   }.    zJournal 
19760 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65  += (sqlite3Strle
19770 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29  n30(zJournal)+1)
19780 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65  ;.  }. .  sqlite
19790 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72  3OsClose(pMaster
197a0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
197b0 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
197c0 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65  zMaster, 0);..de
197d0 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73  lmaster_out:.  s
197e0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73  qlite3_free(zMas
197f0 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
19800 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  f( pMaster ){.  
19810 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
19820 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (pMaster);.    a
19830 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
19840 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20  Journal) );.    
19850 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61  sqlite3_free(pMa
19860 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ster);.  }.  ret
19870 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
19880 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
19890 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67  is used to chang
198a0 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a  e the actual siz
198b0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
198c0 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68  e .** file in th
198d0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54  e file-system. T
198e0 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  his only happens
198f0 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
19900 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a   a transaction,.
19910 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61  ** or rolling ba
19920 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
19930 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c   (including roll
19940 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a  ing back a hot-j
19950 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49  ournal)..**.** I
19960 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
19970 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  ase file is not 
19980 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20 70 61 67  open, or the pag
19990 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 69 74  er is not in eit
199a0 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72 20  her.** DBMOD or 
199b0 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 69 73  OPEN state, this
199c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
199d0 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
199e0 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f 66   the size .** of
199f0 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 68 61   the file is cha
19a00 6e 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61  nged to nPage pa
19a10 67 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65  ges (nPage*pPage
19a20 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
19a30 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 66  s). .** If the f
19a40 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 63  ile on disk is c
19a50 75 72 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20  urrently larger 
19a60 74 68 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73  than nPage pages
19a70 2c 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 56  , then use the V
19a80 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28  FS.** xTruncate(
19a90 29 20 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e  ) method to trun
19aa0 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f  cate it..**.** O
19ab0 72 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 74  r, it might be t
19ac0 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65  he case that the
19ad0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
19ae0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a   smaller than .*
19af0 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53  * nPage pages. S
19b00 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ome operating sy
19b10 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74  stem implementat
19b20 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e  ions can get con
19b30 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75  fused if .** you
19b40 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65   try to truncate
19b50 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20   a file to some 
19b60 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72  size that is lar
19b70 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20  ger than it .** 
19b80 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f  currently is, so
19b90 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61 73   detect this cas
19ba0 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73 69  e and write a si
19bb0 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74  ngle zero byte t
19bc0 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  o .** the end of
19bd0 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e   the new file in
19be0 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  stead..**.** If 
19bf0 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
19c00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  rn SQLITE_OK. If
19c10 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
19c20 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79  urs while modify
19c30 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ing.** the datab
19c40 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e  ase file, return
19c50 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
19c60 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
19c70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
19c80 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
19c90 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
19ca0 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  nPage){.  int rc
19cb0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
19cc0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
19cd0 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
19ce0 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ROR );.  assert(
19cf0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
19d00 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
19d10 0a 20 20 0a 20 20 69 66 28 20 69 73 4f 70 65 6e  .  .  if( isOpen
19d20 28 70 50 61 67 65 72 2d 3e 66 64 29 20 0a 20 20  (pPager->fd) .  
19d30 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
19d40 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
19d50 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65  R_DBMOD || pPage
19d60 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
19d70 5f 4f 50 45 4e 29 20 0a 20 20 29 7b 0a 20 20 20  _OPEN) .  ){.   
19d80 20 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65   i64 currentSize
19d90 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 69  , newSize;.    i
19da0 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67  nt szPage = pPag
19db0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
19dc0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19dd0 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
19de0 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 2f  VE_LOCK );.    /
19df0 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61  * TODO: Is it sa
19e00 66 65 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e  fe to use Pager.
19e10 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f  dbFileSize here?
19e20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
19e30 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
19e40 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72  Pager->fd, &curr
19e50 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65  entSize);.    ne
19e60 77 53 69 7a 65 20 3d 20 73 7a 50 61 67 65 2a 28  wSize = szPage*(
19e70 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69  i64)nPage;.    i
19e80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19e90 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21   && currentSize!
19ea0 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20  =newSize ){.    
19eb0 20 20 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a    if( currentSiz
19ec0 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  e>newSize ){.   
19ed0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
19ee0 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
19ef0 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29  er->fd, newSize)
19f00 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
19f10 28 20 28 63 75 72 72 65 6e 74 53 69 7a 65 2b 73  ( (currentSize+s
19f20 7a 50 61 67 65 29 3c 3d 6e 65 77 53 69 7a 65 20  zPage)<=newSize 
19f30 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
19f40 2a 70 54 6d 70 20 3d 20 70 50 61 67 65 72 2d 3e  *pTmp = pPager->
19f50 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 20  pTmpSpace;.     
19f60 20 20 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c 20     memset(pTmp, 
19f70 30 2c 20 73 7a 50 61 67 65 29 3b 0a 20 20 20 20  0, szPage);.    
19f80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e      testcase( (n
19f90 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3d  ewSize-szPage) =
19fa0 3d 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b  = currentSize );
19fb0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
19fc0 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61  e( (newSize-szPa
19fd0 67 65 29 20 3e 20 20 63 75 72 72 65 6e 74 53 69  ge) >  currentSi
19fe0 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ze );.        rc
19ff0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
1a000 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 54  e(pPager->fd, pT
1a010 6d 70 2c 20 73 7a 50 61 67 65 2c 20 6e 65 77 53  mp, szPage, newS
1a020 69 7a 65 2d 73 7a 50 61 67 65 29 3b 0a 20 20 20  ize-szPage);.   
1a030 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
1a040 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a050 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1a060 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61  dbFileSize = nPa
1a070 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ge;.      }.    
1a080 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1a090 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
1a0a0 72 6e 20 61 20 73 61 6e 69 74 69 7a 65 64 20 76  rn a sanitized v
1a0b0 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 65  ersion of the se
1a0c0 63 74 6f 72 2d 73 69 7a 65 20 6f 66 20 4f 53 20  ctor-size of OS 
1a0d0 66 69 6c 65 20 70 46 69 6c 65 2e 20 54 68 65 0a  file pFile. The.
1a0e0 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
1a0f0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
1a100 20 6c 69 65 20 62 65 74 77 65 65 6e 20 33 32 20   lie between 32 
1a110 61 6e 64 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  and MAX_SECTOR_S
1a120 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  IZE..*/.int sqli
1a130 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28 73 71  te3SectorSize(sq
1a140 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
1a150 65 29 7b 0a 20 20 69 6e 74 20 69 52 65 74 20 3d  e){.  int iRet =
1a160 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
1a170 53 69 7a 65 28 70 46 69 6c 65 29 3b 0a 20 20 69  Size(pFile);.  i
1a180 66 28 20 69 52 65 74 3c 33 32 20 29 7b 0a 20 20  f( iRet<32 ){.  
1a190 20 20 69 52 65 74 20 3d 20 35 31 32 3b 0a 20 20    iRet = 512;.  
1a1a0 7d 65 6c 73 65 20 69 66 28 20 69 52 65 74 3e 4d  }else if( iRet>M
1a1b0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 29  AX_SECTOR_SIZE )
1a1c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d 41  {.    assert( MA
1a1d0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35  X_SECTOR_SIZE>=5
1a1e0 31 32 20 29 3b 0a 20 20 20 20 69 52 65 74 20 3d  12 );.    iRet =
1a1f0 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
1a200 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
1a210 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  Ret;.}../*.** Se
1a220 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
1a230 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  he Pager.sectorS
1a240 69 7a 65 20 76 61 72 69 61 62 6c 65 20 66 6f 72  ize variable for
1a250 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61   the given.** pa
1a260 67 65 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ger based on the
1a270 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
1a280 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69  by the xSectorSi
1a290 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20  ze method.** of 
1a2a0 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
1a2b0 65 20 66 69 6c 65 2e 20 54 68 65 20 73 65 63 74  e file. The sect
1a2c0 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
1a2d0 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65  used .** to dete
1a2e0 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61  rmine the size a
1a2f0 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  nd alignment of 
1a300 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61  journal header a
1a310 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  nd .** master jo
1a320 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77  urnal pointers w
1a330 69 74 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f  ithin created jo
1a340 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  urnal files..**.
1a350 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  ** For temporary
1a360 20 66 69 6c 65 73 20 74 68 65 20 65 66 66 65 63   files the effec
1a370 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
1a380 20 69 73 20 61 6c 77 61 79 73 20 35 31 32 20 62   is always 512 b
1a390 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ytes..**.** Othe
1a3a0 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74  rwise, for non-t
1a3b0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20  emporary files, 
1a3c0 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
1a3d0 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20  ctor size is.** 
1a3e0 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
1a3f0 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74 6f  ed by the xSecto
1a400 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72  rSize() method r
1a410 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 33 32 20  ounded up to 32 
1a420 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73  if.** it is less
1a430 20 74 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75   than 32, or rou
1a440 6e 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58  nded down to MAX
1a450 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20  _SECTOR_SIZE if 
1a460 69 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  it.** is greater
1a470 20 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52   than MAX_SECTOR
1a480 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _SIZE..**.** If 
1a490 74 68 65 20 66 69 6c 65 20 68 61 73 20 74 68 65  the file has the
1a4a0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
1a4b0 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1a4c0 45 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e  E property, then
1a4d0 20 73 65 74 0a 2a 2a 20 74 68 65 20 65 66 66 65   set.** the effe
1a4e0 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
1a4f0 65 20 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d  e to its minimum
1a500 20 76 61 6c 75 65 20 28 35 31 32 29 2e 20 20 54   value (512).  T
1a510 68 65 20 70 75 72 70 6f 73 65 20 6f 66 0a 2a 2a  he purpose of.**
1a520 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
1a530 69 7a 65 20 69 73 20 74 6f 20 64 65 66 69 6e 65  ize is to define
1a540 20 74 68 65 20 22 62 6c 61 73 74 20 72 61 64 69   the "blast radi
1a550 75 73 22 20 6f 66 20 62 79 74 65 73 20 74 68 61  us" of bytes tha
1a560 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67  t.** might chang
1a570 65 20 69 66 20 61 20 63 72 61 73 68 20 6f 63 63  e if a crash occ
1a580 75 72 73 20 77 68 69 6c 65 20 77 72 69 74 69 6e  urs while writin
1a590 67 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 79  g to a single by
1a5a0 74 65 20 69 6e 0a 2a 2a 20 74 68 61 74 20 72 61  te in.** that ra
1a5b0 6e 67 65 2e 20 20 42 75 74 20 77 69 74 68 20 50  nge.  But with P
1a5c0 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1a5d0 54 45 2c 20 74 68 65 20 62 6c 61 73 74 20 72 61  TE, the blast ra
1a5e0 64 69 75 73 20 69 73 20 7a 65 72 6f 0a 2a 2a 20  dius is zero.** 
1a5f0 28 74 68 61 74 20 69 73 20 77 68 61 74 20 50 4f  (that is what PO
1a600 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1a610 45 20 6d 65 61 6e 73 29 2c 20 73 6f 20 77 65 20  E means), so we 
1a620 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 73 65 63  minimize the sec
1a630 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e 20 20 46 6f  tor.** size.  Fo
1a640 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  r backwards comp
1a650 61 74 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  atibility of the
1a660 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1a670 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2c 0a 2a  l file format,.*
1a680 2a 20 77 65 20 63 61 6e 6e 6f 74 20 72 65 64 75  * we cannot redu
1a690 63 65 20 74 68 65 20 65 66 66 65 63 74 69 76 65  ce the effective
1a6a0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 62 65 6c   sector size bel
1a6b0 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73 74 61 74 69  ow 512..*/.stati
1a6c0 63 20 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72  c void setSector
1a6d0 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  Size(Pager *pPag
1a6e0 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  er){.  assert( i
1a6f0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1a700 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  ) || pPager->tem
1a710 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20  pFile );..  if( 
1a720 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1a730 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f  .   || (sqlite3O
1a740 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
1a750 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
1a760 64 29 20 26 20 0a 20 20 20 20 20 20 20 20 20 20  d) & .          
1a770 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1a780 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
1a790 52 49 54 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20  RITE)!=0.  ){.  
1a7a0 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65    /* Sector size
1a7b0 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
1a7c0 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  for temporary fi
1a7d0 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66  les. Also, the f
1a7e0 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e  ile.    ** may n
1a7f0 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ot have been ope
1a800 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63  ned yet, in whic
1a810 68 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63  h case the OsSec
1a820 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a  torSize().    **
1a830 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61   call will segfa
1a840 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67  ult. */.    pPag
1a850 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
1a860 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   512;.  }else{. 
1a870 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
1a880 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 53  rSize = sqlite3S
1a890 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
1a8a0 2d 3e 66 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ->fd);.  }.}../*
1a8b0 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
1a8c0 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75   journal and thu
1a8d0 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  s restore the da
1a8e0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a  tabase file to.*
1a8f0 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  * the state it w
1a900 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20  as in before we 
1a910 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63  started making c
1a920 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  hanges.  .**.** 
1a930 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
1a940 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f   format is as fo
1a950 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28  llows: .**.**  (
1a960 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69  1)  8 byte prefi
1a970 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a  x.  A copy of aJ
1a980 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
1a990 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62  *  (2)  4 byte b
1a9a0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
1a9b0 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
1a9c0 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70  umber of valid p
1a9d0 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20  age records.**  
1a9e0 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72       in the jour
1a9f0 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61  nal.  If this va
1aa00 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
1aa10 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20  f, then compute 
1aa20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d  the.**       num
1aa30 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
1aa40 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  rds from the jou
1aa50 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  rnal size..**  (
1aa60 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  3)  4 byte big-e
1aa70 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
1aa80 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69  ich is the initi
1aa90 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  al value for the
1aaa0 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74   .**       sanit
1aab0 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  y checksum..**  
1aac0 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (4)  4 byte inte
1aad0 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
1aae0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1aaf0 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
1ab00 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
1ab10 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72  se to during a r
1ab20 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29  ollback..**  (5)
1ab30 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
1ab40 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
1ab50 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72 20  h is the sector 
1ab60 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65  size.  The heade
1ab70 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68  r.**       is th
1ab80 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e  is many bytes in
1ab90 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20   size..**  (6)  
1aba0 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
1abb0 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
1abc0 69 73 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  is the page size
1abd0 2e 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f 20  ..**  (7)  zero 
1abe0 70 61 64 64 69 6e 67 20 6f 75 74 20 74 6f 20 74  padding out to t
1abf0 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 73  he next sector s
1ac00 69 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65  ize..**  (8)  Ze
1ac10 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73  ro or more pages
1ac20 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68   instances, each
1ac30 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
1ac40 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65         +  4 byte
1ac50 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a   page number..**
1ac60 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67 65          +  pPage
1ac70 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
1ac80 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20  s of data..**   
1ac90 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 63       +  4 byte c
1aca0 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68  hecksum.**.** Wh
1acb0 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74  en we speak of t
1acc0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
1acd0 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66  r, we mean the f
1ace0 69 72 73 74 20 37 20 69 74 65 6d 73 20 61 62 6f  irst 7 items abo
1acf0 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72  ve..** Each entr
1ad00 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
1ad10 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
1ad20 6f 66 20 74 68 65 20 38 74 68 20 69 74 65 6d 2e  of the 8th item.
1ad30 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20  .**.** Call the 
1ad40 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73  value from the s
1ad50 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52  econd bullet "nR
1ad60 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68  ec".  nRec is th
1ad70 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76  e number of.** v
1ad80 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69 65  alid page entrie
1ad90 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
1ada0 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73  .  In most cases
1adb0 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74  , you can comput
1adc0 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  e the.** value o
1add0 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20  f nRec from the 
1ade0 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
1adf0 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69  nal file.  But i
1ae00 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69  f a power.** fai
1ae10 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68  lure occurred wh
1ae20 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
1ae30 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74 65  was being writte
1ae40 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74  n, it could be t
1ae50 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20  he.** case that 
1ae60 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1ae70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64  journal file had
1ae80 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e   already been in
1ae90 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74  creased but.** t
1aea0 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65 73  he extra entries
1aeb0 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64   had not yet mad
1aec0 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64  e it safely to d
1aed0 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20  isk.  In such a 
1aee0 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c  case,.** the val
1aef0 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75  ue of nRec compu
1af00 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  ted from the fil
1af10 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20  e size would be 
1af20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a  too large.  For.
1af30 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20  ** that reason, 
1af40 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  we always use th
1af50 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20  e nRec value in 
1af60 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a  the header..**.*
1af70 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76 61  * If the nRec va
1af80 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
1af90 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  f it means that 
1afa0 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63  nRec should be c
1afb0 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20  omputed.** from 
1afc0 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20  the file size.  
1afd0 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75 73  This value is us
1afe0 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72  ed when the user
1aff0 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20   selects the.** 
1b000 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66  no-sync option f
1b010 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  or the journal. 
1b020 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   A power failure
1b030 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63   could lead to c
1b040 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20  orruption.** in 
1b050 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74 20  this case.  But 
1b060 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20  for things like 
1b070 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
1b080 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a  (which will be.*
1b090 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74  * deleted when t
1b0a0 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  he power is rest
1b0b0 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63  ored) we don't c
1b0c0 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20  are.  .**.** If 
1b0d0 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  the file opened 
1b0e0 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
1b0f0 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c  ile is not a wel
1b100 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72  l-formed.** jour
1b110 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c  nal file then al
1b120 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74 68  l pages up to th
1b130 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74 65  e first corrupte
1b140 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65  d page are rolle
1b150 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f  d.** back (or no
1b160 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f   pages if the jo
1b170 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
1b180 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65 20  corrupted). The 
1b190 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
1b1a0 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20  is then deleted 
1b1b0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
1b1c0 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20  turned, just as 
1b1d0 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e  if no corruption
1b1e0 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63   had.** been enc
1b1f0 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  ountered..**.** 
1b200 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c  If an I/O or mal
1b210 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75  loc() error occu
1b220 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  rs, the journal-
1b230 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65  file is not dele
1b240 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72  ted.** and an er
1b250 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1b260 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rned..**.** The 
1b270 69 73 48 6f 74 20 70 61 72 61 6d 65 74 65 72 20  isHot parameter 
1b280 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 77  indicates that w
1b290 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20  e are trying to 
1b2a0 72 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e  rollback a journ
1b2b0 61 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68 74  al.** that might
1b2c0 20 62 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   be a hot journa
1b2d0 6c 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64  l.  Or, it could
1b2e0 20 62 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75   be that the jou
1b2f0 72 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73  rnal is .** pres
1b300 65 72 76 65 64 20 62 65 63 61 75 73 65 20 6f 66  erved because of
1b310 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52   JOURNALMODE_PER
1b320 53 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d  SIST or JOURNALM
1b330 4f 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a  ODE_TRUNCATE..**
1b340 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
1b350 72 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72  really is hot, r
1b360 65 73 65 74 20 74 68 65 20 70 61 67 65 72 20 63  eset the pager c
1b370 61 63 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69  ache prior rolli
1b380 6e 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63  ng.** back any c
1b390 6f 6e 74 65 6e 74 2e 20 20 49 66 20 74 68 65 20  ontent.  If the 
1b3a0 6a 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c  journal is merel
1b3b0 79 20 70 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f  y persistent, no
1b3c0 20 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65   reset is.** nee
1b3d0 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ded..*/.static i
1b3e0 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
1b3f0 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
1b400 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73   int isHot){.  s
1b410 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1b420 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
1b430 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
1b440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1b450 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
1b460 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
1b470 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20   */.  u32 nRec; 
1b480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b490 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f  * Number of Reco
1b4a0 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  rds in the journ
1b4b0 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
1b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4d0 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
1b4e0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50  p counter */.  P
1b4f0 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20  gno mxPg = 0;   
1b500 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1b510 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
1b520 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f  file in pages */
1b530 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1b540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1b550 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20  esult code of a 
1b560 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
1b570 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20  int res = 1;    
1b580 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
1b590 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
1b5a0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20  lite3OsAccess() 
1b5b0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
1b5c0 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
1b5d0 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20   Name of master 
1b5e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
1b5f0 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65  any */.  int nee
1b600 64 50 61 67 65 72 52 65 73 65 74 3b 20 20 20 20  dPagerReset;    
1b610 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73    /* True to res
1b620 65 74 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f  et page prior to
1b630 20 66 69 72 73 74 20 70 61 67 65 20 72 6f 6c 6c   first page roll
1b640 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  back */.  int nP
1b650 6c 61 79 62 61 63 6b 20 3d 20 30 3b 20 20 20 20  layback = 0;    
1b660 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
1b670 65 72 20 6f 66 20 70 61 67 65 73 20 72 65 73 74  er of pages rest
1b680 6f 72 65 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61  ored from journa
1b690 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  l */..  /* Figur
1b6a0 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
1b6b0 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
1b6c0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72  e journal.  Abor
1b6d0 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20  t early if.  ** 
1b6e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65  the journal is e
1b6f0 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mpty..  */.  ass
1b700 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
1b710 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63  er->jfd) );.  rc
1b720 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
1b730 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
1b740 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72  , &szJ);.  if( r
1b750 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1b760 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1b770 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  yback;.  }..  /*
1b780 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72   Read the master
1b790 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72   journal name fr
1b7a0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
1b7b0 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74  if it is present
1b7c0 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74  ..  ** If a mast
1b7d0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1b7e0 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65  name is specifie
1b7f0 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20  d, but the file 
1b800 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73  is not.  ** pres
1b810 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65  ent on disk, the
1b820 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
1b830 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65   not hot and doe
1b840 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
1b850 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63  .  ** played bac
1b860 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44  k..  **.  ** TOD
1b870 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74  O: Technically t
1b880 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
1b890 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73 65  an error because
1b8a0 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74   it assumes that
1b8b0 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61 67  .  ** buffer Pag
1b8c0 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73 20  er.pTmpSpace is 
1b8d0 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20 62  (mxPathname+1) b
1b8e0 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e 20  ytes or larger. 
1b8f0 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28  i.e. that.  ** (
1b900 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1b910 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73   >= pPager->pVfs
1b920 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e  ->mxPathname+1).
1b930 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63   Using os_unix.c
1b940 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e 61  ,.  **  mxPathna
1b950 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69 63 68  me is 512, which
1b960 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
1b970 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f  the minimum allo
1b980 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a  wable value.  **
1b990 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a 20   for pageSize.. 
1b9a0 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20   */.  zMaster = 
1b9b0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
1b9c0 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61  e;.  rc = readMa
1b9d0 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
1b9e0 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
1b9f0 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
1ba00 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
1ba10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ba20 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d  OK && zMaster[0]
1ba30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1ba40 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
1ba50 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49  s, zMaster, SQLI
1ba60 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
1ba70 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a  , &res);.  }.  z
1ba80 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66  Master = 0;.  if
1ba90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1baa0 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67  || !res ){.    g
1bab0 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1bac0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1bad0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
1bae0 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74    needPagerReset
1baf0 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20   = isHot;..  /* 
1bb00 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  This loop termin
1bb10 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e  ates either when
1bb20 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   a readJournalHd
1bb30 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67  r() or .  ** pag
1bb40 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
1bb50 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74 75  page() call retu
1bb60 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rns SQLITE_DONE 
1bb70 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  or an IO error .
1bb80 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20    ** occurs. .  
1bb90 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  */.  while( 1 ){
1bba0 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
1bbb0 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
1bbc0 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ader from the jo
1bbd0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20  urnal file.  If 
1bbe0 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a  there are.    **
1bbf0 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65   not enough byte
1bc00 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f  s left in the jo
1bc10 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61  urnal file for a
1bc20 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72   complete header
1bc30 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69  , or.    ** it i
1bc40 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65  s corrupted, the
1bc50 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74  n a process must
1bc60 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 68 69   have failed whi
1bc70 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20  le writing it.. 
1bc80 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63     ** This indic
1bc90 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72  ates nothing mor
1bca0 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  e needs to be ro
1bcb0 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a  lled back..    *
1bcc0 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  /.    rc = readJ
1bcd0 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
1bce0 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e  , isHot, szJ, &n
1bcf0 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20  Rec, &mxPg);.   
1bd00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1bd10 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28  OK ){ .      if(
1bd20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1bd30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1bd40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1bd50 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
1bd60 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
1bd70 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
1bd80 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ec is 0xffffffff
1bd90 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72  , then this jour
1bda0 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  nal was created 
1bdb0 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20  by a process.   
1bdc0 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e   ** working in n
1bdd0 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69  o-sync mode. Thi
1bde0 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
1bdf0 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
1be00 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
1be10 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67   consists of pag
1be20 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f  es, there are no
1be30 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65   more journal he
1be40 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20  aders. Compute. 
1be50 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
1be60 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e  of nRec based on
1be70 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   this assumption
1be80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1be90 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66   nRec==0xfffffff
1bea0 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
1beb0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
1bec0 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
1bed0 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
1bee0 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69  .      nRec = (i
1bef0 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e  nt)((szJ - JOURN
1bf00 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1bf10 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ))/JOURNAL_PG_SZ
1bf20 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
1bf30 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
1bf40 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72   is 0 and this r
1bf50 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20  ollback is of a 
1bf60 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61  transaction crea
1bf70 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20  ted by this.    
1bf80 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69  ** process and i
1bf90 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
1bfa0 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68  nal header in th
1bfb0 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20  e journal, then 
1bfc0 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  it means.    ** 
1bfd0 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f  that this part o
1bfe0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  f the journal wa
1bff0 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62  s being filled b
1c000 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  ut has not yet b
1c010 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65  een.    ** synce
1c020 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70  d to disk.  Comp
1c030 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ute the number o
1c040 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e  f pages based on
1c050 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20   the remaining. 
1c060 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68     ** size of th
1c070 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
1c080 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20     ** The third 
1c090 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74  term of the test
1c0a0 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69   was added to fi
1c0b0 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a  x ticket #2565..
1c0c0 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c      ** When roll
1c0d0 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a  ing back a hot j
1c0e0 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20  ournal, nRec==0 
1c0f0 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61  always means tha
1c100 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a  t the next.    *
1c110 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a  * chunk of the j
1c120 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20  ournal contains 
1c130 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65  zero pages to be
1c140 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42   rolled back.  B
1c150 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64  ut.    ** when d
1c160 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20  oing a ROLLBACK 
1c170 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20  and the nRec==0 
1c180 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73  chunk is the las
1c190 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a  t chunk in.    *
1c1a0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69  * the journal, i
1c1b0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
1c1c0 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
1c1d0 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61  ontain additiona
1c1e0 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74  l.    ** pages t
1c1f0 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72  hat need to be r
1c200 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74  olled back and t
1c210 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hat the number o
1c220 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  f pages .    ** 
1c230 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
1c240 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ed based on the 
1c250 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a  journal file siz
1c260 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1c270 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73  ( nRec==0 && !is
1c280 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70  Hot &&.        p
1c290 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
1c2a0 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
1c2b0 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
1c2c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a  ->journalOff ){.
1c2d0 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e        nRec = (in
1c2e0 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72  t)((szJ - pPager
1c2f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20  ->journalOff) / 
1c300 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
1c310 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  ager));.    }.. 
1c320 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
1c330 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65   the first heade
1c340 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  r read from the 
1c350 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74  journal, truncat
1c360 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
1c370 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20  abase file back 
1c380 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
1c390 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
1c3a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1c3b0 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
1c3c0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
1c3d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
1c3e0 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
1c3f0 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20  ger, mxPg);.    
1c400 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c410 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
1c420 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1c430 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c440 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1c450 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20   mxPg;.    }..  
1c460 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
1c470 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
1c480 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
1c490 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20  back into the . 
1c4a0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1c4b0 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20  ile and/or page 
1c4c0 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cache..    */.  
1c4d0 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65    for(u=0; u<nRe
1c4e0 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69  c; u++){.      i
1c4f0 66 28 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  f( needPagerRese
1c500 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67  t ){.        pag
1c510 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
1c520 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50 61  ;.        needPa
1c530 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20  gerReset = 0;.  
1c540 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
1c550 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
1c560 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
1c570 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
1c580 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20  Off,0,1,0);.    
1c590 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c5a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  _OK ){.        n
1c5b0 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20 20 20 20  Playback++;.    
1c5c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c5d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c5e0 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
1c5f0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1c600 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
1c610 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c620 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
1c630 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
1c640 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
1c650 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
1c660 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
1c670 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69  en truncated, si
1c680 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e  mply stop readin
1c690 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  g and.          
1c6a0 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68  ** processing th
1c6b0 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20  e journal. This 
1c6c0 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69 66 20  might happen if 
1c6d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a  the journal was.
1c6e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74            ** not
1c6f0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74   completely writ
1c700 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70  ten and synced p
1c710 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e  rior to a crash.
1c720 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20    In that.      
1c730 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65      ** case, the
1c740 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64   database should
1c750 20 68 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e   have never been
1c760 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a   written in the.
1c770 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72            ** fir
1c780 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69  st place so it i
1c790 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61  s OK to simply a
1c7a0 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62  bandon the rollb
1c7b0 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ack. */.        
1c7c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1c7d0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
1c7e0 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1c7f0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1c800 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
1c810 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72   are unable to r
1c820 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e  ollback, quit an
1c830 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  d return the err
1c840 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  or.          ** 
1c850 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  code.  This will
1c860 20 63 61 75 73 65 20 74 68 65 20 70 61 67 65 72   cause the pager
1c870 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72   to enter the er
1c880 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20 20  ror state.      
1c890 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e      ** so that n
1c8a0 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d 20 77  o further harm w
1c8b0 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65  ill be done.  Pe
1c8c0 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20  rhaps the next. 
1c8d0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
1c8e0 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e  ess to come alon
1c8f0 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74  g will be able t
1c900 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64  o rollback the d
1c910 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20  atabase..       
1c920 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1c930 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1c940 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
1c950 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1c960 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a   /*NOTREACHED*/.
1c970 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a    assert( 0 );..
1c980 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  end_playback:.  
1c990 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72  /* Following a r
1c9a0 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74  ollback, the dat
1c9b0 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
1c9c0 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73  d be back in its
1c9d0 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73   original.  ** s
1c9e0 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68  tate prior to th
1c9f0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
1ca00 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69  ransaction, so i
1ca10 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53  nvoke the.  ** S
1ca20 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
1ca30 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f  NCHANGED file-co
1ca40 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20  ntrol method to 
1ca50 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a  disable the.  **
1ca60 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20   assertion that 
1ca70 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1ca80 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69  counter was modi
1ca90 66 69 65 64 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  fied..  */.#ifde
1caa0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1cab0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d   if( pPager->fd-
1cac0 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
1cad0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
1cae0 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72  ntrolHint(pPager
1caf0 2d 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54  ->fd,SQLITE_FCNT
1cb00 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30  L_DB_UNCHANGED,0
1cb10 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
1cb20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79   /* If this play
1cb30 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e  back is happenin
1cb40 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  g automatically 
1cb50 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61  as a result of a
1cb60 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61  n IO or .  ** ma
1cb70 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20  lloc error that 
1cb80 6f 63 63 75 72 72 65 64 20 61 66 74 65 72 20 74  occurred after t
1cb90 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1cba0 72 20 77 61 73 20 75 70 64 61 74 65 64 20 62 75  r was updated bu
1cbb0 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74  t .  ** before t
1cbc0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
1cbd0 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68  as committed, th
1cbe0 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  en the change-co
1cbf0 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69  unter .  ** modi
1cc00 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73  fication may jus
1cc10 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 76 65  t have been reve
1cc20 72 74 65 64 2e 20 49 66 20 74 68 69 73 20 68 61  rted. If this ha
1cc30 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69  ppens in exclusi
1cc40 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74  ve .  ** mode, t
1cc50 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74  hen subsequent t
1cc60 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66  ransactions perf
1cc70 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e  ormed by the con
1cc80 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74  nection will not
1cc90 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65  .  ** update the
1cca0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1ccb0 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79  at all. This may
1ccc0 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20 69   lead to cache i
1ccd0 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a  nconsistency.  *
1cce0 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f  * problems for o
1ccf0 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61  ther processes a
1cd00 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20  t some point in 
1cd10 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20  the future. So, 
1cd20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73  just.  ** in cas
1cd30 65 20 74 68 69 73 20 68 61 73 20 68 61 70 70 65  e this has happe
1cd40 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63  ned, clear the c
1cd50 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
1cd60 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20  lag now..  */.  
1cd70 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
1cd80 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
1cd90 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69  ->tempFile;..  i
1cda0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1cdb0 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20   ){.    zMaster 
1cdc0 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
1cdd0 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  ace;.    rc = re
1cde0 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
1cdf0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
1ce00 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
1ce10 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
1ce20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1ce30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1ce40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1ce50 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20  SQLITE_OK.   && 
1ce60 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e  (pPager->eState>
1ce70 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
1ce80 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  MOD || pPager->e
1ce90 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
1cea0 4e 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  N).  ){.    rc =
1ceb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e   sqlite3PagerSyn
1cec0 63 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  c(pPager, 0);.  
1ced0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1cee0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1cef0 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
1cf00 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
1cf10 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27  zMaster[0]!='\0'
1cf20 2c 20 30 29 3b 0a 20 20 20 20 74 65 73 74 63 61  , 0);.    testca
1cf30 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
1cf40 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  K );.  }.  if( r
1cf50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1cf60 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65  zMaster[0] && re
1cf70 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  s ){.    /* If t
1cf80 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65  here was a maste
1cf90 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  r journal and th
1cfa0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
1cfb0 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a  return success,.
1cfc0 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
1cfd0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
1cfe0 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
1cff0 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  r journal..    *
1d000 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
1d010 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65  _delmaster(pPage
1d020 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  r, zMaster);.   
1d030 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
1d040 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
1d050 20 20 69 66 28 20 69 73 48 6f 74 20 26 26 20 6e    if( isHot && n
1d060 50 6c 61 79 62 61 63 6b 20 29 7b 0a 20 20 20 20  Playback ){.    
1d070 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
1d080 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45  TE_NOTICE_RECOVE
1d090 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20 22 72 65 63  R_ROLLBACK, "rec
1d0a0 6f 76 65 72 65 64 20 25 64 20 70 61 67 65 73 20  overed %d pages 
1d0b0 66 72 6f 6d 20 25 73 22 2c 0a 20 20 20 20 20 20  from %s",.      
1d0c0 20 20 20 20 20 20 20 20 20 20 6e 50 6c 61 79 62            nPlayb
1d0d0 61 63 6b 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  ack, pPager->zJo
1d0e0 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f  urnal);.  }..  /
1d0f0 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74  * The Pager.sect
1d100 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
1d110 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70  may have been up
1d120 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c  dated while roll
1d130 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20  ing.  ** back a 
1d140 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
1d150 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74  by a process wit
1d160 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65  h a different se
1d170 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76  ctor size.  ** v
1d180 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74  alue. Reset it t
1d190 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61  o the correct va
1d1a0 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  lue for this pro
1d1b0 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74  cess..  */.  set
1d1c0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
1d1d0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
1d1e0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  .}.../*.** Read 
1d1f0 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20  the content for 
1d200 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20  page pPg out of 
1d210 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1d220 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70  e and into .** p
1d230 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61  Pg->pData. A sha
1d240 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61  red lock or grea
1d250 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ter must be held
1d260 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1d270 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20  .** file before 
1d280 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1d290 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
1d2a0 66 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64  f page 1 is read
1d2b0 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
1d2c0 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65   of Pager.dbFile
1d2d0 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f  Vers[] is set to
1d2e0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65  .** the value re
1d2f0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
1d300 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
1d310 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
1d320 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
1d330 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74   IO error is ret
1d340 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
1d350 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ler..** Otherwis
1d360 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  e, SQLITE_OK is 
1d370 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1d380 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61  tic int readDbPa
1d390 67 65 28 50 67 48 64 72 20 2a 70 50 67 2c 20 75  ge(PgHdr *pPg, u
1d3a0 33 32 20 69 46 72 61 6d 65 29 7b 0a 20 20 50 61  32 iFrame){.  Pa
1d3b0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1d3c0 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61  g->pPager; /* Pa
1d3d0 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ger object assoc
1d3e0 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20  iated with page 
1d3f0 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  pPg */.  Pgno pg
1d400 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20  no = pPg->pgno; 
1d410 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
1d420 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a  mber to read */.
1d430 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1d440 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f  E_OK;          /
1d450 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1d460 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 50  .  int pgsz = pP
1d470 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20  ager->pageSize; 
1d480 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1d490 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20  es to read */.. 
1d4a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1d4b0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
1d4c0 45 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42 20  EADER && !MEMDB 
1d4d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
1d4e0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1d4f0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
1d500 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 69 66  TE_OMIT_WAL.  if
1d510 28 20 69 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ( iFrame ){.    
1d520 2f 2a 20 54 72 79 20 74 6f 20 70 75 6c 6c 20 74  /* Try to pull t
1d530 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
1d540 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
1d550 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
1d560 6c 69 74 65 33 57 61 6c 52 65 61 64 46 72 61 6d  lite3WalReadFram
1d570 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
1d580 69 46 72 61 6d 65 2c 20 70 67 73 7a 2c 20 70 50  iFrame, pgsz, pP
1d590 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 65 6c  g->pData);.  }el
1d5a0 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20  se.#endif.  {.  
1d5b0 20 20 69 36 34 20 69 4f 66 66 73 65 74 20 3d 20    i64 iOffset = 
1d5c0 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
1d5d0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
1d5e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d5f0 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
1d600 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  d, pPg->pData, p
1d610 67 73 7a 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  gsz, iOffset);. 
1d620 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d630 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1d640 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  AD ){.      rc =
1d650 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1d660 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 67 6e  }.  }..  if( pgn
1d670 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20  o==1 ){.    if( 
1d680 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  rc ){.      /* I
1d690 66 20 74 68 65 20 72 65 61 64 20 69 73 20 75 6e  f the read is un
1d6a0 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
1d6b0 74 68 65 20 64 62 46 69 6c 65 56 65 72 73 5b 5d  the dbFileVers[]
1d6c0 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20   to something.  
1d6d0 20 20 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c      ** that will
1d6e0 20 6e 65 76 65 72 20 62 65 20 61 20 76 61 6c 69   never be a vali
1d6f0 64 20 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20  d file version. 
1d700 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73   dbFileVers[] is
1d710 20 61 20 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a   a copy.      **
1d720 20 6f 66 20 62 79 74 65 73 20 32 34 2e 2e 33 39   of bytes 24..39
1d730 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1d740 2e 20 20 42 79 74 65 73 20 32 38 2e 2e 33 31 20  .  Bytes 28..31 
1d750 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
1d760 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f  .      ** zero o
1d770 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  r the size of th
1d780 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61  e database in pa
1d790 67 65 2e 20 42 79 74 65 73 20 33 32 2e 2e 33 35  ge. Bytes 32..35
1d7a0 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20 20 20 20   and 35..39.    
1d7b0 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 70    ** should be p
1d7c0 61 67 65 20 6e 75 6d 62 65 72 73 20 77 68 69 63  age numbers whic
1d7d0 68 20 61 72 65 20 6e 65 76 65 72 20 30 78 66 66  h are never 0xff
1d7e0 66 66 66 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c  ffffff.  So fill
1d7f0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 50 61  ing.      ** pPa
1d800 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b  ger->dbFileVers[
1d810 5d 20 77 69 74 68 20 61 6c 6c 20 30 78 66 66 20  ] with all 0xff 
1d820 62 79 74 65 73 20 73 68 6f 75 6c 64 20 73 75 66  bytes should suf
1d830 66 69 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  fice..      **. 
1d840 20 20 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65       ** For an e
1d850 6e 63 72 79 70 74 65 64 20 64 61 74 61 62 61 73  ncrypted databas
1d860 65 2c 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e  e, the situation
1d870 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78   is more complex
1d880 3a 20 20 62 79 74 65 73 0a 20 20 20 20 20 20 2a  :  bytes.      *
1d890 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20  * 24..39 of the 
1d8a0 64 61 74 61 62 61 73 65 20 61 72 65 20 77 68 69  database are whi
1d8b0 74 65 20 6e 6f 69 73 65 2e 20 20 42 75 74 20 74  te noise.  But t
1d8c0 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  he probability o
1d8d0 66 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 74 65  f.      ** white
1d8e0 20 6e 6f 69 73 65 20 65 71 75 61 6c 69 6e 67 20   noise equaling 
1d8f0 31 36 20 62 79 74 65 73 20 6f 66 20 30 78 66 66  16 bytes of 0xff
1d900 20 69 73 20 76 61 6e 69 73 68 69 6e 67 6c 79 20   is vanishingly 
1d910 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a  small so.      *
1d920 2a 20 77 65 20 73 68 6f 75 6c 64 20 73 74 69 6c  * we should stil
1d930 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a  l be ok..      *
1d940 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  /.      memset(p
1d950 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1d960 73 2c 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28  s, 0xff, sizeof(
1d970 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1d980 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rs));.    }else{
1d990 0a 20 20 20 20 20 20 75 38 20 2a 64 62 46 69 6c  .      u8 *dbFil
1d9a0 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70  eVers = &((u8*)p
1d9b0 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a  Pg->pData)[24];.
1d9c0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
1d9d0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1d9e0 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69  , dbFileVers, si
1d9f0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
1da00 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
1da10 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50  .  }.  CODEC1(pP
1da20 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61  ager, pPg->pData
1da30 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20  , pgno, 3, rc = 
1da40 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a  SQLITE_NOMEM);..
1da50 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
1da60 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
1da70 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45  b_count);.  PAGE
1da80 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
1da90 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45  Read);.  IOTRACE
1daa0 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22  (("PGIN %p %d\n"
1dab0 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
1dac0 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
1dad0 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25  "FETCH %d page %
1dae0 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
1daf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1db00 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1db10 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67   pgno, pager_pag
1db20 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20  ehash(pPg)));.. 
1db30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1db40 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20  *.** Update the 
1db50 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 68 61  value of the cha
1db60 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 6f  nge-counter at o
1db70 66 66 73 65 74 73 20 32 34 20 61 6e 64 20 39 32  ffsets 24 and 92
1db80 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61 64 65   in.** the heade
1db90 72 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74 65  r and the sqlite
1dba0 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20   version number 
1dbb0 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a 2a 2a  at offset 96..**
1dbc0 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 75  .** This is an u
1dbd0 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64  nconditional upd
1dbe0 61 74 65 2e 20 20 53 65 65 20 61 6c 73 6f 20 74  ate.  See also t
1dbf0 68 65 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  he pager_incr_ch
1dc00 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a 2a 2a  angecounter().**
1dc10 20 72 6f 75 74 69 6e 65 20 77 68 69 63 68 20 6f   routine which o
1dc20 6e 6c 79 20 75 70 64 61 74 65 73 20 74 68 65 20  nly updates the 
1dc30 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69  change-counter i
1dc40 66 20 74 68 65 20 75 70 64 61 74 65 20 69 73 20  f the update is 
1dc50 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64  actually.** need
1dc60 65 64 2c 20 61 73 20 64 65 74 65 72 6d 69 6e 65  ed, as determine
1dc70 64 20 62 79 20 74 68 65 20 70 50 61 67 65 72 2d  d by the pPager-
1dc80 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
1dc90 20 73 74 61 74 65 20 76 61 72 69 61 62 6c 65 2e   state variable.
1dca0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1dcb0 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e  pager_write_chan
1dcc0 67 65 63 6f 75 6e 74 65 72 28 50 67 48 64 72 20  gecounter(PgHdr 
1dcd0 2a 70 50 67 29 7b 0a 20 20 75 33 32 20 63 68 61  *pPg){.  u32 cha
1dce0 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20 20  nge_counter;..  
1dcf0 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
1dd00 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64   value just read
1dd10 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61   and write it ba
1dd20 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a  ck to byte 24. *
1dd30 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  /.  change_count
1dd40 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  er = sqlite3Get4
1dd50 62 79 74 65 28 28 75 38 2a 29 70 50 67 2d 3e 70  byte((u8*)pPg->p
1dd60 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1dd70 73 29 2b 31 3b 0a 20 20 70 75 74 33 32 62 69 74  s)+1;.  put32bit
1dd80 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70  s(((char*)pPg->p
1dd90 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65  Data)+24, change
1dda0 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a  _counter);..  /*
1ddb0 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65 20   Also store the 
1ddc0 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20 6e  SQLite version n
1ddd0 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20 39  umber in bytes 9
1dde0 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20 20 2a  6..99 and in.  *
1ddf0 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35 20 73  * bytes 92..95 s
1de00 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67 65 20  tore the change 
1de10 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68 69 63  counter for whic
1de20 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75  h the version nu
1de30 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20 76 61 6c  mber.  ** is val
1de40 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  id. */.  put32bi
1de50 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e  ts(((char*)pPg->
1de60 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61 6e 67  pData)+92, chang
1de70 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 70 75  e_counter);.  pu
1de80 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
1de90 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20  pPg->pData)+96, 
1dea0 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e  SQLITE_VERSION_N
1deb0 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64  UMBER);.}..#ifnd
1dec0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1ded0 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  AL./*.** This fu
1dee0 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65  nction is invoke
1def0 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
1df00 70 61 67 65 20 74 68 61 74 20 68 61 73 20 61 6c  page that has al
1df10 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77  ready been .** w
1df20 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1df30 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20  log file when a 
1df40 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  WAL transaction 
1df50 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
1df60 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50 67  ** Parameter iPg
1df70 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d   is the page num
1df80 62 65 72 20 6f 66 20 73 61 69 64 20 70 61 67 65  ber of said page
1df90 2e 20 54 68 65 20 70 43 74 78 20 61 72 67 75 6d  . The pCtx argum
1dfa0 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75 61  ent .** is actua
1dfb0 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  lly a pointer to
1dfc0 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
1dfd0 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ture..**.** If p
1dfe0 61 67 65 20 69 50 67 20 69 73 20 70 72 65 73 65  age iPg is prese
1dff0 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  nt in the cache,
1e000 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74 73   and has no outs
1e010 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
1e020 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69 73  es,.** it is dis
1e030 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69 73  carded. Otherwis
1e040 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 20  e, if there are 
1e050 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73  one or more outs
1e060 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72  tanding.** refer
1e070 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65 20  ences, the page 
1e080 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f 61  content is reloa
1e090 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ded from the dat
1e0a0 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a  abase. If the.**
1e0b0 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f   attempt to relo
1e0c0 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ad content from 
1e0d0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1e0e0 72 65 71 75 69 72 65 64 20 61 6e 64 20 66 61 69  required and fai
1e0f0 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61  ls, .** return a
1e100 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1e110 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ode. Otherwise, 
1e120 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
1e130 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e  atic int pagerUn
1e140 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  doCallback(void 
1e150 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67 29  *pCtx, Pgno iPg)
1e160 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1e170 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
1e180 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72  *pPager = (Pager
1e190 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64 72   *)pCtx;.  PgHdr
1e1a0 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74   *pPg;..  assert
1e1b0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
1e1c0 61 67 65 72 29 20 29 3b 0a 20 20 70 50 67 20 3d  ager) );.  pPg =
1e1d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
1e1e0 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67 29  kup(pPager, iPg)
1e1f0 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  ;.  if( pPg ){. 
1e200 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 63     if( sqlite3Pc
1e210 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74  achePageRefcount
1e220 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20  (pPg)==1 ){.    
1e230 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44    sqlite3PcacheD
1e240 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d 65  rop(pPg);.    }e
1e250 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32 20 69  lse{.      u32 i
1e260 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  Frame = 0;.     
1e270 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
1e280 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72  FindFrame(pPager
1e290 2d 3e 70 57 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ->pWal, pPg->pgn
1e2a0 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20  o, &iFrame);.   
1e2b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1e2c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1e2d0 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28  rc = readDbPage(
1e2e0 70 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a 20 20  pPg, iFrame);.  
1e2f0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1e300 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e310 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1e320 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b  >xReiniter(pPg);
1e330 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1e340 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1e350 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a 20 20  NotNull(pPg);.  
1e360 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f    }.  }..  /* No
1e370 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74 72 61  rmally, if a tra
1e380 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
1e390 65 64 20 62 61 63 6b 2c 20 61 6e 79 20 62 61 63  ed back, any bac
1e3a0 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 61 72  kup processes ar
1e3b0 65 0a 20 20 2a 2a 20 75 70 64 61 74 65 64 20 61  e.  ** updated a
1e3c0 73 20 64 61 74 61 20 69 73 20 63 6f 70 69 65 64  s data is copied
1e3d0 20 6f 75 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c   out of the roll
1e3e0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  back journal and
1e3f0 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64   into the.  ** d
1e400 61 74 61 62 61 73 65 2e 20 54 68 69 73 20 69 73  atabase. This is
1e410 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79 20 70   not generally p
1e420 6f 73 73 69 62 6c 65 20 77 69 74 68 20 61 20 57  ossible with a W
1e430 41 4c 20 64 61 74 61 62 61 73 65 2c 20 61 73 0a  AL database, as.
1e440 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e    ** rollback in
1e450 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20 74 72  volves simply tr
1e460 75 6e 63 61 74 69 6e 67 20 74 68 65 20 6c 6f 67  uncating the log
1e470 20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72 65   file. Therefore
1e480 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72  , if one.  ** or
1e490 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 68 61 76   more frames hav
1e4a0 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  e already been w
1e4b0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f  ritten to the lo
1e4c0 67 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65  g (and therefore
1e4d0 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69   .  ** also copi
1e4e0 65 64 20 69 6e 74 6f 20 74 68 65 20 62 61 63 6b  ed into the back
1e4f0 75 70 20 64 61 74 61 62 61 73 65 73 29 20 61 73  up databases) as
1e500 20 70 61 72 74 20 6f 66 20 74 68 69 73 20 74 72   part of this tr
1e510 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20  ansaction,.  ** 
1e520 74 68 65 20 62 61 63 6b 75 70 73 20 6d 75 73 74  the backups must
1e530 20 62 65 20 72 65 73 74 61 72 74 65 64 2e 0a 20   be restarted.. 
1e540 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 61 63   */.  sqlite3Bac
1e550 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65  kupRestart(pPage
1e560 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20  r->pBackup);..  
1e570 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e580 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1e590 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  n is called to r
1e5a0 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61  ollback a transa
1e5b0 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64  ction on a WAL d
1e5c0 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
1e5d0 69 63 20 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c  ic int pagerRoll
1e5e0 62 61 63 6b 57 61 6c 28 50 61 67 65 72 20 2a 70  backWal(Pager *p
1e5f0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1e600 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1e620 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67  urn Code */.  Pg
1e630 48 64 72 20 2a 70 4c 69 73 74 3b 20 20 20 20 20  Hdr *pList;     
1e640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e650 20 4c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70   List of dirty p
1e660 61 67 65 73 20 74 6f 20 72 65 76 65 72 74 20 2a  ages to revert *
1e670 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20  /..  /* For all 
1e680 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
1e690 68 65 20 74 68 61 74 20 61 72 65 20 63 75 72 72  he that are curr
1e6a0 65 6e 74 6c 79 20 64 69 72 74 79 20 6f 72 20 68  ently dirty or h
1e6b0 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  ave already.  **
1e6c0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 28 62   been written (b
1e6d0 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64  ut not committed
1e6e0 29 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c  ) to the log fil
1e6f0 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65  e, do one of the
1e700 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67   .  ** following
1e710 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20  :.  **.  **   + 
1e720 44 69 73 63 61 72 64 20 74 68 65 20 63 61 63 68  Discard the cach
1e730 65 64 20 70 61 67 65 20 28 69 66 20 72 65 66 63  ed page (if refc
1e740 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a  ount==0), or.  *
1e750 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20 70 61 67  *   + Reload pag
1e760 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74  e content from t
1e770 68 65 20 64 61 74 61 62 61 73 65 20 28 69 66 20  he database (if 
1e780 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a  refcount>0)..  *
1e790 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
1e7a0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f  ze = pPager->dbO
1e7b0 72 69 67 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20  rigSize;.  rc = 
1e7c0 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f 28 70  sqlite3WalUndo(p
1e7d0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67  Pager->pWal, pag
1e7e0 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20  erUndoCallback, 
1e7f0 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 29 3b  (void *)pPager);
1e800 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  .  pList = sqlit
1e810 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73  e3PcacheDirtyLis
1e820 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
1e830 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69  e);.  while( pLi
1e840 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  st && rc==SQLITE
1e850 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48 64 72  _OK ){.    PgHdr
1e860 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d   *pNext = pList-
1e870 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 72 63 20  >pDirty;.    rc 
1e880 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  = pagerUndoCallb
1e890 61 63 6b 28 28 76 6f 69 64 20 2a 29 70 50 61 67  ack((void *)pPag
1e8a0 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29  er, pList->pgno)
1e8b0 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e  ;.    pList = pN
1e8c0 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ext;.  }..  retu
1e8d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e8e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1e8f0 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
1e900 64 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d  d sqlite3WalFram
1e910 65 73 28 29 2e 20 41 73 20 77 65 6c 6c 20 61 73  es(). As well as
1e920 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68 65 20   logging.** the 
1e930 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1e940 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 68 65  list of pages he
1e950 61 64 65 64 20 62 79 20 70 4c 69 73 74 20 28 63  aded by pList (c
1e960 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72  onnected by pDir
1e970 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e  ty),.** this fun
1e980 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61  ction notifies a
1e990 6e 79 20 61 63 74 69 76 65 20 62 61 63 6b 75 70  ny active backup
1e9a0 20 70 72 6f 63 65 73 73 65 73 20 74 68 61 74 20   processes that 
1e9b0 74 68 65 20 70 61 67 65 73 20 68 61 76 65 0a 2a  the pages have.*
1e9c0 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a  * changed. .**.*
1e9d0 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20 70 61  * The list of pa
1e9e0 67 65 73 20 70 61 73 73 65 64 20 69 6e 74 6f 20  ges passed into 
1e9f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1ea00 61 6c 77 61 79 73 20 73 6f 72 74 65 64 20 62 79  always sorted by
1ea10 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a   page number..**
1ea20 20 48 65 6e 63 65 2c 20 69 66 20 70 61 67 65 20   Hence, if page 
1ea30 31 20 61 70 70 65 61 72 73 20 61 6e 79 77 68 65  1 appears anywhe
1ea40 72 65 20 6f 6e 20 74 68 65 20 6c 69 73 74 2c 20  re on the list, 
1ea50 69 74 20 77 69 6c 6c 20 62 65 20 74 68 65 20 66  it will be the f
1ea60 69 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20 0a 73  irst page..*/ .s
1ea70 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 57  tatic int pagerW
1ea80 61 6c 46 72 61 6d 65 73 28 0a 20 20 50 61 67 65  alFrames(.  Page
1ea90 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
1eaa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1eab0 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
1eac0 20 50 67 48 64 72 20 2a 70 4c 69 73 74 2c 20 20   PgHdr *pList,  
1ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eae0 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 61 6d   /* List of fram
1eaf0 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50  es to log */.  P
1eb00 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c 20 20  gno nTruncate,  
1eb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1eb20 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20  * Database size 
1eb30 61 66 74 65 72 20 74 68 69 73 20 63 6f 6d 6d 69  after this commi
1eb40 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d  t */.  int isCom
1eb50 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  mit             
1eb60 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1eb70 66 20 74 68 69 73 20 69 73 20 61 20 63 6f 6d 6d  f this is a comm
1eb80 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  it */.){.  int r
1eb90 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1eba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1ebb0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1ebc0 6e 74 20 6e 4c 69 73 74 3b 20 20 20 20 20 20 20  nt nList;       
1ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ebe0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1ebf0 73 20 69 6e 20 70 4c 69 73 74 20 2a 2f 0a 20 20  s in pList */.  
1ec00 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20  PgHdr *p;       
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
1ec30 76 65 72 20 70 61 67 65 73 20 2a 2f 0a 0a 20 20  ver pages */..  
1ec40 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1ec50 70 57 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  pWal );.  assert
1ec60 28 20 70 4c 69 73 74 20 29 3b 0a 23 69 66 64 65  ( pList );.#ifde
1ec70 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1ec80 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
1ec90 74 68 65 20 70 61 67 65 20 6c 69 73 74 20 69 73  the page list is
1eca0 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72   in accending or
1ecb0 64 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70  der */.  for(p=p
1ecc0 4c 69 73 74 3b 20 70 20 26 26 20 70 2d 3e 70 44  List; p && p->pD
1ecd0 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69 72 74  irty; p=p->pDirt
1ece0 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y){.    assert( 
1ecf0 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70 44 69  p->pgno < p->pDi
1ed00 72 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d  rty->pgno );.  }
1ed10 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
1ed20 74 28 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79  t( pList->pDirty
1ed30 3d 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d 69 74 20  ==0 || isCommit 
1ed40 29 3b 0a 20 20 69 66 28 20 69 73 43 6f 6d 6d 69  );.  if( isCommi
1ed50 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  t ){.    /* If a
1ed60 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   WAL transaction
1ed70 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74   is being commit
1ed80 74 65 64 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ted, there is no
1ed90 20 70 6f 69 6e 74 20 69 6e 20 77 72 69 74 69 6e   point in writin
1eda0 67 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70 61 67  g.    ** any pag
1edb0 65 73 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  es with page num
1edc0 62 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61  bers greater tha
1edd0 6e 20 6e 54 72 75 6e 63 61 74 65 20 69 6e 74 6f  n nTruncate into
1ede0 20 74 68 65 20 57 41 4c 20 66 69 6c 65 2e 0a 20   the WAL file.. 
1edf0 20 20 20 2a 2a 20 54 68 65 79 20 77 69 6c 6c 20     ** They will 
1ee00 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 62 79  never be read by
1ee10 20 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53 6f 20   any client. So 
1ee20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d  remove them from
1ee30 20 74 68 65 20 70 44 69 72 74 79 0a 20 20 20 20   the pDirty.    
1ee40 2a 2a 20 6c 69 73 74 20 68 65 72 65 2e 20 2a 2f  ** list here. */
1ee50 0a 20 20 20 20 50 67 48 64 72 20 2a 2a 70 70 4e  .    PgHdr **ppN
1ee60 65 78 74 20 3d 20 26 70 4c 69 73 74 3b 0a 20 20  ext = &pList;.  
1ee70 20 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20    nList = 0;.   
1ee80 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 28 2a   for(p=pList; (*
1ee90 70 70 4e 65 78 74 20 3d 20 70 29 21 3d 30 3b 20  ppNext = p)!=0; 
1eea0 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
1eeb0 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 3c      if( p->pgno<
1eec0 3d 6e 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20  =nTruncate ){.  
1eed0 20 20 20 20 20 20 70 70 4e 65 78 74 20 3d 20 26        ppNext = &
1eee0 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 20  p->pDirty;.     
1eef0 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20 20     nList++;.    
1ef00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
1ef10 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 20  sert( pList );. 
1ef20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 69 73   }else{.    nLis
1ef30 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61  t = 1;.  }.  pPa
1ef40 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52  ger->aStat[PAGER
1ef50 5f 53 54 41 54 5f 57 52 49 54 45 5d 20 2b 3d 20  _STAT_WRITE] += 
1ef60 6e 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20 70 4c  nList;..  if( pL
1ef70 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70  ist->pgno==1 ) p
1ef80 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67  ager_write_chang
1ef90 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b  ecounter(pList);
1efa0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
1efb0 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2d  alFrames(pPager-
1efc0 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20 20 70 50  >pWal, .      pP
1efd0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
1efe0 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61 74 65  pList, nTruncate
1eff0 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 70 50 61 67  , isCommit, pPag
1f000 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
1f010 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  .  );.  if( rc==
1f020 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
1f030 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a  ger->pBackup ){.
1f040 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b      for(p=pList;
1f050 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29   p; p=p->pDirty)
1f060 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
1f070 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
1f080 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e  er->pBackup, p->
1f090 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70  pgno, (u8 *)p->p
1f0a0 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
1f0b0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1f0c0 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 70 4c  CHECK_PAGES.  pL
1f0d0 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ist = sqlite3Pca
1f0e0 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
1f0f0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
1f100 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b   for(p=pList; p;
1f110 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20   p=p->pDirty){. 
1f120 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67     pager_set_pag
1f130 65 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23 65  ehash(p);.  }.#e
1f140 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
1f150 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  c;.}../*.** Begi
1f160 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73 61 63  n a read transac
1f170 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e  tion on the WAL.
1f180 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1f190 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65 20 63  ine used to be c
1f1a0 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70 65 6e  alled "pagerOpen
1f1b0 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65 63 61  Snapshot()" beca
1f1c0 75 73 65 20 69 74 20 65 73 73 65 6e 74 69 61 6c  use it essential
1f1d0 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e  ly.** makes a sn
1f1e0 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20 64 61  apshot of the da
1f1f0 74 61 62 61 73 65 20 61 74 20 74 68 65 20 63 75  tabase at the cu
1f200 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74  rrent point in t
1f210 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72 76 65  ime and preserve
1f220 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70 73 68  s.** that snapsh
1f230 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  ot for use by th
1f240 65 20 72 65 61 64 65 72 20 69 6e 20 73 70 69 74  e reader in spit
1f250 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c  e of concurrentl
1f260 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20  y changes by.** 
1f270 6f 74 68 65 72 20 77 72 69 74 65 72 73 20 6f 72  other writers or
1f280 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a   checkpointers..
1f290 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1f2a0 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e  gerBeginReadTran
1f2b0 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70  saction(Pager *p
1f2c0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1f2d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f2e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1f2f0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
1f300 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20 20  t changed = 0;  
1f310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f320 20 54 72 75 65 20 69 66 20 63 61 63 68 65 20 6d   True if cache m
1f330 75 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f 0a  ust be reset */.
1f340 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
1f350 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
1f360 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1f370 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1f380 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72  R_OPEN || pPager
1f390 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
1f3a0 52 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a 20  READER );..  /* 
1f3b0 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
1f3c0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 77  dTransaction() w
1f3d0 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f  as not called fo
1f3e0 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 20  r the previous. 
1f3f0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
1f400 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  in locking_mode=
1f410 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20 63  EXCLUSIVE.  So c
1f420 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66 20  all it now.  If 
1f430 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c  we.  ** are in l
1f440 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d  ocking_mode=NORM
1f450 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28 29  AL and EndRead()
1f460 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
1f470 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65  called,.  ** the
1f480 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c 20   duplicate call 
1f490 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a  is harmless..  *
1f4a0 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e  /.  sqlite3WalEn
1f4b0 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  dReadTransaction
1f4c0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
1f4d0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
1f4e0 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  alBeginReadTrans
1f4f0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70  action(pPager->p
1f500 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a  Wal, &changed);.
1f510 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f520 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20 29  _OK || changed )
1f530 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  {.    pager_rese
1f540 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  t(pPager);.    i
1f550 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67  f( USEFETCH(pPag
1f560 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73 55  er) ) sqlite3OsU
1f570 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
1f580 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  d, 0, 0);.  }.. 
1f590 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
1f5a0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
1f5b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1f5c0 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  led as part of t
1f5d0 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 66 72  he transition fr
1f5e0 6f 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a  om PAGER_OPEN.**
1f5f0 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52   to PAGER_READER
1f600 20 73 74 61 74 65 20 74 6f 20 64 65 74 65 72 6d   state to determ
1f610 69 6e 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ine the size of 
1f620 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1f630 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 28 61  e.** in pages (a
1f640 73 73 75 6d 69 6e 67 20 74 68 65 20 70 61 67 65  ssuming the page
1f650 20 73 69 7a 65 20 63 75 72 72 65 6e 74 6c 79 20   size currently 
1f660 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e  stored in Pager.
1f670 70 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a  pageSize)..**.**
1f680 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
1f690 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urs, SQLITE_OK i
1f6a0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
1f6b0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
1f6c0 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 70 61  atabase.** in pa
1f6d0 67 65 73 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ges is stored in
1f6e0 20 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65 72 77   *pnPage. Otherw
1f6f0 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  ise, an error co
1f700 64 65 20 28 70 65 72 68 61 70 73 0a 2a 2a 20 53  de (perhaps.** S
1f710 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
1f720 54 29 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  T) is returned a
1f730 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65  nd *pnPage is le
1f740 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a  ft unmodified..*
1f750 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1f760 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65  erPagecount(Page
1f770 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
1f780 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f  *pnPage){.  Pgno
1f790 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
1f7a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1f7b0 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76  alue to return v
1f7c0 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20  ia *pnPage */.. 
1f7d0 20 2f 2a 20 51 75 65 72 79 20 74 68 65 20 57 41   /* Query the WA
1f7e0 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 66 6f 72  L sub-system for
1f7f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
1f800 7a 65 2e 20 54 68 65 20 57 61 6c 44 62 73 69 7a  ze. The WalDbsiz
1f810 65 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  e().  ** functio
1f820 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 69  n returns zero i
1f830 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e 6f 74  f the WAL is not
1f840 20 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61 67 65   open (i.e. Page
1f850 72 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20  r.pWal==0), or. 
1f860 20 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62   ** if the datab
1f870 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20  ase size is not 
1f880 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65 20 64  available. The d
1f890 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
1f8a0 6e 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62  not.  ** availab
1f8b0 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c 20  le from the WAL 
1f8c0 73 75 62 2d 73 79 73 74 65 6d 20 69 66 20 74 68  sub-system if th
1f8d0 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 65 6d  e log file is em
1f8e0 70 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74  pty or.  ** cont
1f8f0 61 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20 63 6f  ains no valid co
1f900 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63 74  mmitted transact
1f910 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  ions..  */.  ass
1f920 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1f930 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
1f940 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1f950 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52  ger->eLock>=SHAR
1f960 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 6e 50 61  ED_LOCK );.  nPa
1f970 67 65 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 44  ge = sqlite3WalD
1f980 62 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 57  bsize(pPager->pW
1f990 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  al);..  /* If th
1f9a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1f9b0 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
1f9c0 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  e is not availab
1f9d0 6c 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a  le from the.  **
1f9e0 20 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c   WAL sub-system,
1f9f0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 70   determine the p
1fa00 61 67 65 20 63 6f 75 6e 74 65 20 62 61 73 65 64  age counte based
1fa10 20 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 0a   on the size of.
1fa20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
1fa30 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 20  e file.  If the 
1fa40 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1fa50 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
1fa60 20 61 6e 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72   an.  ** integer
1fa70 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65   multiple of the
1fa80 20 70 61 67 65 2d 73 69 7a 65 2c 20 72 6f 75 6e   page-size, roun
1fa90 64 20 75 70 20 74 68 65 20 72 65 73 75 6c 74 2e  d up the result.
1faa0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67  .  */.  if( nPag
1fab0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 36 34 20  e==0 ){.    i64 
1fac0 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
1fad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1fae0 65 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e 20  e of db file in 
1faf0 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 61 73 73  bytes */.    ass
1fb00 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
1fb10 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65  er->fd) || pPage
1fb20 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
1fb30 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
1fb40 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
1fb50 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
1fb60 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
1fb70 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20  ager->fd, &n);. 
1fb80 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1fb90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1fba0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1fbb0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e     }.    }.    n
1fbc0 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e  Page = (Pgno)((n
1fbd0 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
1fbe0 65 2d 31 29 20 2f 20 70 50 61 67 65 72 2d 3e 70  e-1) / pPager->p
1fbf0 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  ageSize);.  }.. 
1fc00 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65   /* If the curre
1fc10 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  nt number of pag
1fc20 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69  es in the file i
1fc30 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
1fc40 68 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72  he.  ** configur
1fc50 65 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72  ed maximum pager
1fc60 20 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73   number, increas
1fc70 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69  e the allowed li
1fc80 6d 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  mit so.  ** that
1fc90 20 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65   the file can be
1fca0 20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66   read..  */.  if
1fcb0 28 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e  ( nPage>pPager->
1fcc0 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  mxPgno ){.    pP
1fcd0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28  ager->mxPgno = (
1fce0 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a  Pgno)nPage;.  }.
1fcf0 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61  .  *pnPage = nPa
1fd00 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ge;.  return SQL
1fd10 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
1fd20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1fd30 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69  AL./*.** Check i
1fd40 66 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  f the *-wal file
1fd50 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
1fd60 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1fd70 65 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67  e opened by pPag
1fd80 65 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66 20  er.** exists if 
1fd90 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1fda0 6e 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65 72  not empy, or ver
1fdb0 69 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d 77  ify that the *-w
1fdc0 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20  al file does.** 
1fdd0 6e 6f 74 20 65 78 69 73 74 20 28 62 79 20 64 65  not exist (by de
1fde0 6c 65 74 69 6e 67 20 69 74 29 20 69 66 20 74 68  leting it) if th
1fdf0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1fe00 69 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20  is empty..**.** 
1fe10 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1fe20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64  is not empty and
1fe30 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
1fe40 65 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65  exists, open the
1fe50 20 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c   pager.** in WAL
1fe60 20 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64   mode.  If the d
1fe70 61 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79  atabase is empty
1fe80 20 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20   or if no *-wal 
1fe90 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0a  file exists and.
1fea0 2a 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ** if no error o
1feb0 63 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65  ccurs, make sure
1fec0 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f   Pager.journalMo
1fed0 64 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f  de is not set to
1fee0 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  .** PAGER_JOURNA
1fef0 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a  LMODE_WAL..**.**
1ff00 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1ff10 4b 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  K or an error co
1ff20 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  de..**.** The ca
1ff30 6c 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61  ller must hold a
1ff40 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20   SHARED lock on 
1ff50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ff60 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a  e to call this.*
1ff70 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61  * function. Beca
1ff80 75 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  use an EXCLUSIVE
1ff90 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20   lock on the db 
1ffa0 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  file is required
1ffb0 20 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61   to delete .** a
1ffc0 20 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65   WAL on a none-e
1ffd0 6d 70 74 79 20 64 61 74 61 62 61 73 65 2c 20 74  mpty database, t
1ffe0 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 65 72  his ensures ther
1fff0 65 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e  e is no race con
20000 64 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65  dition .** betwe
20010 65 6e 20 74 68 65 20 78 41 63 63 65 73 73 28 29  en the xAccess()
20020 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44   below and an xD
20030 65 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65 78  elete() being ex
20040 65 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a  ecuted by some .
20050 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
20060 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
20070 6e 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49  nt pagerOpenWalI
20080 66 50 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a  fPresent(Pager *
20090 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
200a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
200b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
200c0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
200d0 50 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PEN );.  assert(
200e0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d   pPager->eLock>=
200f0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a  SHARED_LOCK );..
20100 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
20110 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69  empFile ){.    i
20120 6e 74 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20  nt isWal;       
20130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20140 54 72 75 65 20 69 66 20 57 41 4c 20 66 69 6c 65  True if WAL file
20150 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 50   exists */.    P
20160 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20  gno nPage;      
20170 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20180 53 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  Size of the data
20190 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
201a0 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65    rc = pagerPage
201b0 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
201c0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
201d0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
201e0 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
201f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
20200 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
20210 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
20220 65 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20  er->zWal, 0);.  
20230 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
20240 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f  TE_IOERR_DELETE_
20250 4e 4f 45 4e 54 20 29 20 72 63 20 3d 20 53 51 4c  NOENT ) rc = SQL
20260 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 73  ITE_OK;.      is
20270 57 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Wal = 0;.    }el
20280 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
20290 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a  qlite3OsAccess(.
202a0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
202b0 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
202c0 7a 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  zWal, SQLITE_ACC
202d0 45 53 53 5f 45 58 49 53 54 53 2c 20 26 69 73 57  ESS_EXISTS, &isW
202e0 61 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  al.      );.    
202f0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
20300 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20310 20 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20   if( isWal ){.  
20320 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20330 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
20340 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  ecount(pPager->p
20350 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20  PCache)==0 );.  
20360 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
20370 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70  e3PagerOpenWal(p
20380 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
20390 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
203a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
203b0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
203c0 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  E_WAL ){.       
203d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
203e0 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
203f0 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b  RNALMODE_DELETE;
20400 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20410 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
20420 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
20430 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69  Playback savepoi
20440 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f  nt pSavepoint. O
20450 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74  r, if pSavepoint
20460 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61  ==NULL, then pla
20470 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74  yback.** the ent
20480 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
20490 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73  al file. The cas
204a0 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  e pSavepoint==NU
204b0 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a  LL occurs when .
204c0 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f  ** a ROLLBACK TO
204d0 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f   command is invo
204e0 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49  ked on a SAVEPOI
204f0 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61  NT that is a tra
20500 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76  nsaction .** sav
20510 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68  epoint..**.** Wh
20520 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73  en pSavepoint is
20530 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69   not NULL (meani
20540 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63  ng a non-transac
20550 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
20560 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c  s .** being roll
20570 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74  ed back), then t
20580 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73  he rollback cons
20590 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68  ists of up to th
205a0 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70  ree stages,.** p
205b0 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20  erformed in the 
205c0 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a  order specified:
205d0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
205e0 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b   are played back
205f0 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
20600 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
20610 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f  at byte.**     o
20620 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70  ffset PagerSavep
20630 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64  oint.iOffset and
20640 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a   continuing to .
20650 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
20660 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
20670 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20  , or to the end 
20680 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
20690 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  nal.**     file 
206a0 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  if PagerSavepoin
206b0 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
206c0 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  zero..**.**   * 
206d0 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  If PagerSavepoin
206e0 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
206f0 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70  not zero, then p
20700 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a  ages are played.
20710 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72  **     back star
20720 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ting from the jo
20730 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d  urnal header imm
20740 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
20750 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72  ng .**     Pager
20760 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
20770 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20  fset to the end 
20780 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
20790 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
207a0 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68    * Pages are th
207b0 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  en played back f
207c0 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
207d0 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69  nal file, starti
207e0 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74  ng.**     with t
207f0 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
20800 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f  t.iSubRec and co
20810 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
20820 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68  end of.**     th
20830 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
20840 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74  **.** Throughout
20850 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72   the rollback pr
20860 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65  ocess, each time
20870 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65   a page is rolle
20880 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63  d back, the.** c
20890 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
208a0 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74   is set in a bit
208b0 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76  vec structure (v
208c0 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e  ariable pDone in
208d0 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e   the.** implemen
208e0 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54  tation below). T
208f0 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65  his is used to e
20900 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67  nsure that a pag
20910 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c  e is only.** rol
20920 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72  led back the fir
20930 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e  st time it is en
20940 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74  countered in eit
20950 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  her journal..**.
20960 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74  ** If pSavepoint
20970 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70   is NULL, then p
20980 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c  ages are only pl
20990 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
209a0 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e  he main.** journ
209b0 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69  al file. There i
209c0 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20  s no need for a 
209d0 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63  bitvec in this c
209e0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69  ase..**.** In ei
209f0 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72  ther case, befor
20a00 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65  e playback comme
20a10 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64  nces the Pager.d
20a20 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a  bSize variable.*
20a30 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68  * is reset to th
20a40 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20  e value that it 
20a50 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72  held at the star
20a60 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69  t of the savepoi
20a70 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73  nt .** (or trans
20a80 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65  action). No page
20a90 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d   with a page-num
20aa0 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
20ab0 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69   this value.** i
20ac0 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49  s played back. I
20ad0 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74  f one is encount
20ae0 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c  ered it is simpl
20af0 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74  y skipped..*/.st
20b00 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c  atic int pagerPl
20b10 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28  aybackSavepoint(
20b20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
20b30 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
20b40 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36  Savepoint){.  i6
20b50 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
20b60 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74         /* Effect
20b70 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
20b80 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  main journal */.
20b90 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
20ba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
20bb0 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65  d of first segme
20bc0 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e  nt of main-journ
20bd0 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al records */.  
20be0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
20bf0 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  OK;      /* Retu
20c00 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74  rn code */.  Bit
20c10 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20  vec *pDone = 0; 
20c20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
20c30 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20  to ensure pages 
20c40 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79  played back only
20c50 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65   once */..  asse
20c60 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
20c70 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
20c80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
20c90 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
20ca0 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
20cb0 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
20cc0 74 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75  te a bitvec to u
20cd0 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  se to store the 
20ce0 73 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c  set of pages rol
20cf0 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66  led back */.  if
20d00 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ( pSavepoint ){.
20d10 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69      pDone = sqli
20d20 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
20d30 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69  pSavepoint->nOri
20d40 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f  g);.    if( !pDo
20d50 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ne ){.      retu
20d60 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
20d70 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
20d80 20 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73   Set the databas
20d90 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74  e size back to t
20da0 68 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20  he value it was 
20db0 62 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70  before the savep
20dc0 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67  oint .  ** being
20dd0 20 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70   reverted was op
20de0 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  ened..  */.  pPa
20df0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53  ger->dbSize = pS
20e00 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65  avepoint ? pSave
20e10 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70  point->nOrig : p
20e20 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
20e30 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  e;.  pPager->cha
20e40 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
20e50 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
20e60 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65 70 6f  ..  if( !pSavepo
20e70 69 6e 74 20 26 26 20 70 61 67 65 72 55 73 65 57  int && pagerUseW
20e80 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
20e90 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 52 6f    return pagerRo
20ea0 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65 72  llbackWal(pPager
20eb0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65  );.  }..  /* Use
20ec0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20ed0 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65 63  Off as the effec
20ee0 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65  tive size of the
20ef0 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
20f00 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68   ** journal.  Th
20f10 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69  e actual file mi
20f20 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68  ght be larger th
20f30 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20  an this in.  ** 
20f40 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
20f50 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41  E_TRUNCATE or PA
20f60 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
20f70 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e  PERSIST.  But an
20f80 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74  ything.  ** past
20f90 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20fa0 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74  Off is off-limit
20fb0 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20  s to us..  */.  
20fc0 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ = pPager->jo
20fd0 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65  urnalOff;.  asse
20fe0 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
20ff0 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a  pPager)==0 || sz
21000 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65  J==0 );..  /* Be
21010 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62  gin by rolling b
21020 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  ack records from
21030 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
21040 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
21050 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  ** PagerSavepoin
21060 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f  t.iOffset and co
21070 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
21080 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  next journal hea
21090 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20  der..  ** There 
210a0 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64 73  might be records
210b0 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   in the main jou
210c0 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20 61  rnal that have a
210d0 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
210e0 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  * greater than t
210f0 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 62  he current datab
21100 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65 72  ase size (pPager
21110 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74 68  ->dbSize) but th
21120 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ose.  ** will be
21130 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74   skipped automat
21140 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61  ically.  Pages a
21150 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e  re added to pDon
21160 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61  e as they.  ** a
21170 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  re played back..
21180 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65    */.  if( pSave
21190 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72 55  point && !pagerU
211a0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
211b0 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70  .    iHdrOff = p
211c0 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f  Savepoint->iHdrO
211d0 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69  ffset ? pSavepoi
211e0 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a  nt->iHdrOffset :
211f0 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72   szJ;.    pPager
21200 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70  ->journalOff = p
21210 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73  Savepoint->iOffs
21220 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72  et;.    while( r
21230 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
21240 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21250 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20  ff<iHdrOff ){.  
21260 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
21270 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
21280 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
21290 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44  ->journalOff, pD
212a0 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  one, 1, 1);.    
212b0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
212c0 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
212d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
212e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
212f0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
21300 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67  Continue rolling
21310 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75   back records ou
21320 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  t of the main jo
21330 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
21340 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  t.  ** the first
21350 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
21360 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75  seen and continu
21370 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66  ing until the ef
21380 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a  fective end.  **
21390 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
213a0 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74  rnal file.  Cont
213b0 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74  inue to skip out
213c0 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
213d0 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75  and.  ** continu
213e0 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20 72  e adding pages r
213f0 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44  olled back to pD
21400 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  one..  */.  whil
21410 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
21420 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
21430 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20  nalOff<szJ ){.  
21440 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
21450 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
21460 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20  nter */.    u32 
21470 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f  nJRec = 0;     /
21480 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72  * Number of Jour
21490 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20  nal Records */. 
214a0 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
214b0 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
214c0 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c  alHdr(pPager, 0,
214d0 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64   szJ, &nJRec, &d
214e0 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72  ummy);.    asser
214f0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
21500 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  NE );..    /*.  
21510 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72    ** The "pPager
21520 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
21530 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
21540 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
21550 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20  rnalOff".    ** 
21560 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20  test is related 
21570 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  to ticket #2565.
21580 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73    See the discus
21590 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  sion in the.    
215a0 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  ** pager_playbac
215b0 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  k() function for
215c0 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
215d0 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  rmation..    */.
215e0 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30      if( nJRec==0
215f0 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72   .     && pPager
21600 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
21610 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
21620 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
21630 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20  rnalOff.    ){. 
21640 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33       nJRec = (u3
21650 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72  2)((szJ - pPager
21660 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f  ->journalOff)/JO
21670 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
21680 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  er));.    }.    
21690 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51  for(ii=0; rc==SQ
216a0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a  LITE_OK && ii<nJ
216b0 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  Rec && pPager->j
216c0 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69  ournalOff<szJ; i
216d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
216e0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
216f0 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
21700 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
21710 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20  lOff, pDone, 1, 
21720 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
21730 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
21740 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61  _DONE );.  }.  a
21750 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
21760 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
21770 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20  journalOff>=szJ 
21780 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79  );..  /* Finally
21790 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65  ,  rollback page
217a0 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  s from the sub-j
217b0 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68  ournal.  Page th
217c0 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65  at were.  ** pre
217d0 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62  viously rolled b
217e0 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  ack out of the m
217f0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  ain journal (and
21800 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44   are hence in pD
21810 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  one).  ** will b
21820 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d  e skipped.  Out-
21830 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61  of-range pages a
21840 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e  re also skipped.
21850 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  .  */.  if( pSav
21860 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33  epoint ){.    u3
21870 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  2 ii;           
21880 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
21890 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73   */.    i64 offs
218a0 65 74 20 3d 20 28 69 36 34 29 70 53 61 76 65 70  et = (i64)pSavep
218b0 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34  oint->iSubRec*(4
218c0 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
218d0 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67  e);..    if( pag
218e0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
218f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
21900 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69  qlite3WalSavepoi
21910 6e 74 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70  ntUndo(pPager->p
21920 57 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d  Wal, pSavepoint-
21930 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20  >aWalData);.    
21940 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61  }.    for(ii=pSa
21950 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63  vepoint->iSubRec
21960 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
21970 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  && ii<pPager->nS
21980 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20  ubRec; ii++){.  
21990 20 20 20 20 61 73 73 65 72 74 28 20 6f 66 66 73      assert( offs
219a0 65 74 3d 3d 28 69 36 34 29 69 69 2a 28 34 2b 70  et==(i64)ii*(4+p
219b0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
219c0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
219d0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
219e0 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
219f0 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30  offset, pDone, 0
21a00 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
21a10 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
21a20 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a  TE_DONE );.  }..
21a30 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
21a40 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20  estroy(pDone);. 
21a50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21a60 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
21a70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
21a80 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  zJ;.  }..  retur
21a90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
21aa0 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
21ab0 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
21ac0 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
21ad0 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f   are allowed..*/
21ae0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
21af0 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50  erSetCachesize(P
21b00 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
21b10 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c  t mxPage){.  sql
21b20 69 74 65 33 50 63 61 63 68 65 53 65 74 43 61 63  ite3PcacheSetCac
21b30 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70  hesize(pPager->p
21b40 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b  PCache, mxPage);
21b50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
21b60 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d   SQLITE_FCNTL_MM
21b70 41 50 5f 53 49 5a 45 20 62 61 73 65 64 20 6f 6e  AP_SIZE based on
21b80 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
21b90 75 65 20 6f 66 20 73 7a 4d 6d 61 70 2e 0a 2a 2f  ue of szMmap..*/
21ba0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
21bb0 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 50 61  erFixMaplimit(Pa
21bc0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69  ger *pPager){.#i
21bd0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
21be0 50 5f 53 49 5a 45 3e 30 0a 20 20 73 71 6c 69 74  P_SIZE>0.  sqlit
21bf0 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50  e3_file *fd = pP
21c00 61 67 65 72 2d 3e 66 64 3b 0a 20 20 69 66 28 20  ager->fd;.  if( 
21c10 69 73 4f 70 65 6e 28 66 64 29 20 26 26 20 66 64  isOpen(fd) && fd
21c20 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72  ->pMethods->iVer
21c30 73 69 6f 6e 3e 3d 33 20 29 7b 0a 20 20 20 20 73  sion>=3 ){.    s
21c40 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b  qlite3_int64 sz;
21c50 0a 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65 72  .    sz = pPager
21c60 2d 3e 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 70 50  ->szMmap;.    pP
21c70 61 67 65 72 2d 3e 62 55 73 65 46 65 74 63 68 20  ager->bUseFetch 
21c80 3d 20 28 73 7a 3e 30 29 3b 0a 20 20 20 20 73 71  = (sz>0);.    sq
21c90 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
21ca0 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66  olHint(pPager->f
21cb0 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  d, SQLITE_FCNTL_
21cc0 4d 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29 3b  MMAP_SIZE, &sz);
21cd0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
21ce0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
21cf0 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20  maximum size of 
21d00 61 6e 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  any memory mappi
21d10 6e 67 20 6d 61 64 65 20 6f 66 20 74 68 65 20 64  ng made of the d
21d20 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
21d30 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
21d40 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 50  erSetMmapLimit(P
21d50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73 71  ager *pPager, sq
21d60 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d  lite3_int64 szMm
21d70 61 70 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 73  ap){.  pPager->s
21d80 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a  zMmap = szMmap;.
21d90 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d    pagerFixMaplim
21da0 69 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  it(pPager);.}../
21db0 2a 0a 2a 2a 20 46 72 65 65 20 61 73 20 6d 75 63  *.** Free as muc
21dc0 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73  h memory as poss
21dd0 69 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 70 61  ible from the pa
21de0 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ger..*/.void sql
21df0 69 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b 28  ite3PagerShrink(
21e00 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
21e10 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
21e20 68 72 69 6e 6b 28 70 50 61 67 65 72 2d 3e 70 50  hrink(pPager->pP
21e30 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Cache);.}../*.**
21e40 20 41 64 6a 75 73 74 20 73 65 74 74 69 6e 67 73   Adjust settings
21e50 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 74 6f   of the pager to
21e60 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
21e70 20 69 6e 20 74 68 65 20 70 67 46 6c 61 67 73 20   in the pgFlags 
21e80 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
21e90 20 54 68 65 20 22 6c 65 76 65 6c 22 20 69 6e 20   The "level" in 
21ea0 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f  pgFlags & PAGER_
21eb0 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b  SYNCHRONOUS_MASK
21ec0 20 73 65 74 73 20 74 68 65 20 72 6f 62 75 73 74   sets the robust
21ed0 6e 65 73 73 0a 2a 2a 20 6f 66 20 74 68 65 20 64  ness.** of the d
21ee0 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67  atabase to damag
21ef0 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
21f00 68 65 73 20 6f 72 20 70 6f 77 65 72 20 66 61 69  hes or power fai
21f10 6c 75 72 65 73 20 62 79 0a 2a 2a 20 63 68 61 6e  lures by.** chan
21f20 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ging the number 
21f30 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e  of syncs()s when
21f40 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75   writing the jou
21f50 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 72 65 20  rnals..** There 
21f60 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73  are three levels
21f70 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20  :.**.**    OFF  
21f80 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79       sqlite3OsSy
21f90 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
21fa0 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
21fb0 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
21fc0 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
21fd0 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
21fe0 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
21ff0 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
22000 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
22010 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
22020 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
22030 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
22040 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
22050 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
22060 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
22070 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
22080 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
22090 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
220a0 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
220b0 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
220c0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
220d0 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
220e0 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
220f0 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
22100 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
22110 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
22120 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
22130 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
22140 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
22150 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
22160 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
22170 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
22180 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
22190 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
221a0 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
221b0 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
221c0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
221d0 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
221e0 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
221f0 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20  formation - the 
22200 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20  nRec field.**   
22210 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
22220 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
22230 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e   - being written
22240 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
22250 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  two.**          
22260 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20      syncs).  If 
22270 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  we assume that w
22280 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  riting a.**     
22290 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20           single 
222a0 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61  disk sector is a
222b0 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73  tomic, then this
222c0 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a   mode provides.*
222d0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
222e0 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68  ssurance that th
222f0 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e  e journal will n
22300 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
22310 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
22320 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20         point of 
22330 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74  causing damage t
22340 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
22350 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a  uring rollback..
22360 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20  **.** The above 
22370 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61 63  is for a rollbac
22380 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20  k-journal mode. 
22390 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20 4f   For WAL mode, O
223a0 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20  FF continues.** 
223b0 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f 20  to mean that no 
223c0 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63 75 72  syncs ever occur
223d0 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20  .  NORMAL means 
223e0 74 68 61 74 20 74 68 65 20 57 41 4c 20 69 73 20  that the WAL is 
223f0 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72 20  synced.** prior 
22400 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
22410 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20 74  checkpoint and t
22420 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
22430 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 0a   file is synced.
22440 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ** at the conclu
22450 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 65 63  sion of the chec
22460 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 65 6e  kpoint if the en
22470 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  tire content of 
22480 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20 77  the WAL.** was w
22490 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f  ritten back into
224a0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
224b0 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65 72  But no sync oper
224c0 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f 72  ations occur for
224d0 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20  .** an ordinary 
224e0 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41 4c  commit in NORMAL
224f0 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c 2e 20   mode with WAL. 
22500 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74   FULL means that
22510 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c 65   the WAL.** file
22520 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f   is synced follo
22530 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69 74  wing each commit
22540 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20 61   operation, in a
22550 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a 2a  ddition to the.*
22560 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69 61 74  * syncs associat
22570 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e 0a  ed with NORMAL..
22580 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e  **.** Do not con
22590 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73  fuse synchronous
225a0 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49 54  =FULL with SQLIT
225b0 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54 68  E_SYNC_FULL.  Th
225c0 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e 43  e.** SQLITE_SYNC
225d0 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61 6e  _FULL macro mean
225e0 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61 63  s to use the Mac
225f0 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d 66  OSX-style full-f
22600 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66 63  sync.** using fc
22610 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43 29  ntl(F_FULLFSYNC)
22620 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  .  SQLITE_SYNC_N
22630 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20 64  ORMAL means to d
22640 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79  o an.** ordinary
22650 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20 20   fsync() call.  
22660 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66  There is no diff
22670 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 53  erence between S
22680 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a  QLITE_SYNC_FULL.
22690 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 53 59  ** and SQLITE_SY
226a0 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61  NC_NORMAL on pla
226b0 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74 68 61  tforms other tha
226c0 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74 20 74  n MacOSX.  But t
226d0 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75  he.** synchronou
226e0 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20 73 79  s=FULL versus sy
226f0 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c  nchronous=NORMAL
22700 20 73 65 74 74 69 6e 67 20 64 65 74 65 72 6d 69   setting determi
22710 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  nes when.** the 
22720 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76 65 20  xSync primitive 
22730 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 69 73  is called and is
22740 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c 6c   relevant to all
22750 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a   platforms..**.*
22760 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73  * Numeric values
22770 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
22780 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72   these states ar
22790 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c  e OFF==1, NORMAL
227a0 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d  =2,.** and FULL=
227b0 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  3..*/.#ifndef SQ
227c0 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
227d0 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c  PRAGMAS.void sql
227e0 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67  ite3PagerSetFlag
227f0 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  s(.  Pager *pPag
22800 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  er,        /* Th
22810 65 20 70 61 67 65 72 20 74 6f 20 73 65 74 20 73  e pager to set s
22820 61 66 65 74 79 20 6c 65 76 65 6c 20 66 6f 72 20  afety level for 
22830 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67  */.  unsigned pg
22840 46 6c 61 67 73 20 20 20 20 20 20 2f 2a 20 56 61  Flags      /* Va
22850 72 69 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a 29  rious flags */.)
22860 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 65 76  {.  unsigned lev
22870 65 6c 20 3d 20 70 67 46 6c 61 67 73 20 26 20 50  el = pgFlags & P
22880 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
22890 5f 4d 41 53 4b 3b 0a 20 20 61 73 73 65 72 74 28  _MASK;.  assert(
228a0 20 6c 65 76 65 6c 3e 3d 31 20 26 26 20 6c 65 76   level>=1 && lev
228b0 65 6c 3c 3d 33 20 29 3b 0a 20 20 70 50 61 67 65  el<=3 );.  pPage
228c0 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65  r->noSync =  (le
228d0 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72  vel==1 || pPager
228e0 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30  ->tempFile) ?1:0
228f0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
22900 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33  Sync = (level==3
22910 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
22920 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 69  pFile) ?1:0;.  i
22930 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
22940 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
22950 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a  >syncFlags = 0;.
22960 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74      pPager->ckpt
22970 53 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20  SyncFlags = 0;. 
22980 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c 61   }else if( pgFla
22990 67 73 20 26 20 50 41 47 45 52 5f 46 55 4c 4c 46  gs & PAGER_FULLF
229a0 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50 61 67  SYNC ){.    pPag
229b0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
229c0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
229d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
229e0 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
229f0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
22a00 20 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c    }else if( pgFl
22a10 61 67 73 20 26 20 50 41 47 45 52 5f 43 4b 50 54  ags & PAGER_CKPT
22a20 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20  _FULLFSYNC ){.  
22a30 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
22a40 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
22a50 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50  C_NORMAL;.    pP
22a60 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c  ager->ckptSyncFl
22a70 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
22a80 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  C_FULL;.  }else{
22a90 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
22aa0 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
22ab0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  SYNC_NORMAL;.   
22ac0 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e   pPager->ckptSyn
22ad0 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
22ae0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d  SYNC_NORMAL;.  }
22af0 0a 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79  .  pPager->walSy
22b00 6e 63 46 6c 61 67 73 20 3d 20 70 50 61 67 65 72  ncFlags = pPager
22b10 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20 69  ->syncFlags;.  i
22b20 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
22b30 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
22b40 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20  r->walSyncFlags 
22b50 7c 3d 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e  |= WAL_SYNC_TRAN
22b60 53 41 43 54 49 4f 4e 53 3b 0a 20 20 7d 0a 20 20  SACTIONS;.  }.  
22b70 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50 41  if( pgFlags & PA
22b80 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 20 29  GER_CACHESPILL )
22b90 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  {.    pPager->do
22ba0 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49  NotSpill &= ~SPI
22bb0 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 65  LLFLAG_OFF;.  }e
22bc0 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
22bd0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53  >doNotSpill |= S
22be0 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20  PILLFLAG_OFF;.  
22bf0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
22c00 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
22c10 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
22c20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
22c30 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72  henever the libr
22c40 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ary.** attempts 
22c50 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
22c60 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ary file.  This 
22c70 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
22c80 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
22c90 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
22ca0 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65  only.  .*/.#ifde
22cb0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
22cc0 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65  t sqlite3_opente
22cd0 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  mp_count = 0;.#e
22ce0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  ndif../*.** Open
22cf0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
22d00 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  e..**.** Write t
22d10 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
22d20 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20  or into *pFile. 
22d30 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
22d40 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20   on success .** 
22d50 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
22d60 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66  ror code if we f
22d70 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c  ail. The OS will
22d80 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
22d90 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  ** delete the te
22da0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65  mporary file whe
22db0 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
22dc0 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
22dd0 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 56 46  passed to the VF
22de0 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20  S layer xOpen() 
22df0 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73  call are those s
22e00 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70  pecified.** by p
22e10 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67  arameter vfsFlag
22e20 73 20 4f 52 65 64 20 77 69 74 68 20 74 68 65 20  s ORed with the 
22e30 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
22e40 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
22e50 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20  _READWRITE.**   
22e60 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
22e70 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  EATE.**     SQLI
22e80 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
22e90 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
22ea0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
22eb0 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  SE.*/.static int
22ec0 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a   pagerOpentemp(.
22ed0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
22ee0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
22ef0 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
22f00 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
22f10 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20  File,  /* Write 
22f20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
22f30 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  tor here */.  in
22f40 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
22f50 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
22f60 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74  sed through to t
22f70 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69  he VFS */.){.  i
22f80 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
22f90 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
22fa0 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  ode */..#ifdef S
22fb0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
22fc0 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
22fd0 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20  unt++;  /* Used 
22fe0 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
22ff0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f  analysis only */
23000 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c  .#endif..  vfsFl
23010 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f  ags |=  SQLITE_O
23020 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
23030 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
23040 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  TE |.           
23050 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
23060 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f  LUSIVE | SQLITE_
23070 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
23080 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  SE;.  rc = sqlit
23090 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  e3OsOpen(pPager-
230a0 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c  >pVfs, 0, pFile,
230b0 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20   vfsFlags, 0);. 
230c0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
230d0 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
230e0 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74  (pFile) );.  ret
230f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
23100 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61   Set the busy ha
23110 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a  ndler function..
23120 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
23130 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79  invokes the busy
23140 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69  -handler if sqli
23150 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75  te3OsLock() retu
23160 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  rns .** SQLITE_B
23170 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20  USY when trying 
23180 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
23190 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41  no-lock to a SHA
231a0 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20  RED lock,.** or 
231b0 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75  when trying to u
231c0 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45  pgrade from a RE
231d0 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61  SERVED lock to a
231e0 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20  n EXCLUSIVE .** 
231f0 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e  lock. It does *n
23200 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  ot* invoke the b
23210 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e  usy handler when
23220 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a   upgrading from.
23230 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45 53  ** SHARED to RES
23240 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75  ERVED, or when u
23250 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48  pgrading from SH
23260 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56  ARED to EXCLUSIV
23270 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75  E.** (which occu
23280 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f  rs during hot-jo
23290 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e  urnal rollback).
232a0 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20   Summary:.**.** 
232b0 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20    Transition    
232c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232d0 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42      | Invokes xB
232e0 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20  usyHandler.**   
232f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23320 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f  --------.**   NO
23330 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53  _LOCK       -> S
23340 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20  HARED_LOCK      
23350 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45  | Yes.**   SHARE
23360 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45  D_LOCK   -> RESE
23370 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e  RVED_LOCK    | N
23380 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f  o.**   SHARED_LO
23390 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56  CK   -> EXCLUSIV
233a0 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a  E_LOCK   | No.**
233b0 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b     RESERVED_LOCK
233c0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   -> EXCLUSIVE_LO
233d0 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a  CK   | Yes.**.**
233e0 20 49 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e   If the busy-han
233f0 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65  dler callback re
23400 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
23410 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  the lock is .** 
23420 72 65 74 72 69 65 64 2e 20 49 66 20 69 74 20 72  retried. If it r
23430 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65  eturns zero, the
23440 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53  n the SQLITE_BUS
23450 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65  Y error is.** re
23460 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
23470 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  ller of the page
23480 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a  r API function..
23490 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
234a0 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
234b0 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  er(.  Pager *pPa
234c0 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
234d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
234e0 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
234f0 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
23500 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20  er)(void *),    
23510 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
23520 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  to busy-handler 
23530 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  function */.  vo
23540 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
23550 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
23560 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
23570 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73 79 48  o pass to xBusyH
23580 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 0a 20 20 70  andler */.){.  p
23590 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
235a0 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c  ler = xBusyHandl
235b0 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42  er;.  pPager->pB
235c0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20  usyHandlerArg = 
235d0 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b  pBusyHandlerArg;
235e0 0a 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  ..  if( isOpen(p
235f0 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
23600 20 20 76 6f 69 64 20 2a 2a 61 70 20 3d 20 28 76    void **ap = (v
23610 6f 69 64 20 2a 2a 29 26 70 50 61 67 65 72 2d 3e  oid **)&pPager->
23620 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20  xBusyHandler;.  
23630 20 20 61 73 73 65 72 74 28 20 28 28 69 6e 74 28    assert( ((int(
23640 2a 29 28 76 6f 69 64 20 2a 29 29 28 61 70 5b 30  *)(void *))(ap[0
23650 5d 29 29 3d 3d 78 42 75 73 79 48 61 6e 64 6c 65  ]))==xBusyHandle
23660 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
23670 20 61 70 5b 31 5d 3d 3d 70 42 75 73 79 48 61 6e   ap[1]==pBusyHan
23680 64 6c 65 72 41 72 67 20 29 3b 0a 20 20 20 20 73  dlerArg );.    s
23690 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
236a0 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e  rolHint(pPager->
236b0 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
236c0 5f 42 55 53 59 48 41 4e 44 4c 45 52 2c 20 28 76  _BUSYHANDLER, (v
236d0 6f 69 64 20 2a 29 61 70 29 3b 0a 20 20 7d 0a 7d  oid *)ap);.  }.}
236e0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
236f0 68 65 20 70 61 67 65 20 73 69 7a 65 20 75 73 65  he page size use
23700 64 20 62 79 20 74 68 65 20 50 61 67 65 72 20 6f  d by the Pager o
23710 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77 20 70  bject. The new p
23720 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20  age size .** is 
23730 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61 67 65  passed in *pPage
23740 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Size..**.** If t
23750 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
23760 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 77  he error state w
23770 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
23780 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a  n is called, it.
23790 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54  ** is a no-op. T
237a0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
237b0 64 20 69 73 20 74 68 65 20 65 72 72 6f 72 20 73  d is the error s
237c0 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  tate error code 
237d0 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66  (i.e. .** one of
237e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 61   SQLITE_IOERR, a
237f0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 78  n SQLITE_IOERR_x
23800 78 78 20 73 75 62 2d 63 6f 64 65 20 6f 72 20 53  xx sub-code or S
23810 51 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a  QLITE_FULL)..**.
23820 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
23830 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
23840 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
23850 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65  **.**   * the ne
23860 77 20 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c  w page size (val
23870 75 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65  ue of *pPageSize
23880 29 20 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f  ) is valid (a po
23890 77 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74  wer .**     of t
238a0 77 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20 61  wo between 512 a
238b0 6e 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  nd SQLITE_MAX_PA
238c0 47 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69  GE_SIZE, inclusi
238d0 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ve), and.**.**  
238e0 20 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20   * there are no 
238f0 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
23900 20 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64   references, and
23910 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64  .**.**   * the d
23920 61 74 61 62 61 73 65 20 69 73 20 65 69 74 68 65  atabase is eithe
23930 72 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f  r not an in-memo
23940 72 79 20 64 61 74 61 62 61 73 65 20 6f 72 20 69  ry database or i
23950 74 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69  t is.**     an i
23960 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
23970 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79  e that currently
23980 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72   consists of zer
23990 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74  o pages..**.** t
239a0 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62  hen the pager ob
239b0 6a 65 63 74 20 70 61 67 65 20 73 69 7a 65 20 69  ject page size i
239c0 73 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53  s set to *pPageS
239d0 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ize..**.** If th
239e0 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 63  e page size is c
239f0 68 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69  hanged, then thi
23a00 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20  s function uses 
23a10 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c  sqlite3PagerMall
23a20 6f 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61  oc() .** to obta
23a30 69 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70  in a new Pager.p
23a40 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  TmpSpace buffer.
23a50 20 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74   If this allocat
23a60 69 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20  ion attempt .** 
23a70 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  fails, SQLITE_NO
23a80 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20  MEM is returned 
23a90 61 6e 64 20 74 68 65 20 70 61 67 65 20 73 69 7a  and the page siz
23aa0 65 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e  e remains unchan
23ab0 67 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20  ged. .** In all 
23ac0 6f 74 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c  other cases, SQL
23ad0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
23ae0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
23af0 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
23b00 74 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65  t changed, eithe
23b10 72 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66  r because one of
23b20 20 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a   the enumerated.
23b30 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62  ** conditions ab
23b40 6f 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c  ove is not true,
23b50 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
23b60 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68  n error state wh
23b70 65 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  en this.** funct
23b80 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ion was called, 
23b90 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 6d  or because the m
23ba0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
23bb0 20 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c   attempt failed,
23bc0 20 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65   .** then *pPage
23bd0 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  Size is set to t
23be0 68 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64  he old, retained
23bf0 20 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72   page size befor
23c00 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
23c10 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
23c20 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65  SetPagesize(Page
23c30 72 20 2a 70 50 61 67 65 72 2c 20 75 33 32 20 2a  r *pPager, u32 *
23c40 70 50 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e  pPageSize, int n
23c50 52 65 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20  Reserve){.  int 
23c60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
23c70 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20  .  /* It is not 
23c80 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 6f 20 61  possible to do a
23c90 20 66 75 6c 6c 20 61 73 73 65 72 74 5f 70 61 67   full assert_pag
23ca0 65 72 5f 73 74 61 74 65 28 29 20 68 65 72 65 2c  er_state() here,
23cb0 20 61 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75   as this.  ** fu
23cc0 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
23cd0 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
23ce0 20 50 61 67 65 72 4f 70 65 6e 28 29 2c 20 62 65   PagerOpen(), be
23cf0 66 6f 72 65 20 74 68 65 20 73 74 61 74 65 0a 20  fore the state. 
23d00 20 2a 2a 20 6f 66 20 74 68 65 20 50 61 67 65 72   ** of the Pager
23d10 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 74 65 72   object is inter
23d20 6e 61 6c 6c 79 20 63 6f 6e 73 69 73 74 65 6e 74  nally consistent
23d30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 74 20 6f  ..  **.  ** At o
23d40 6e 65 20 70 6f 69 6e 74 20 74 68 69 73 20 66 75  ne point this fu
23d50 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 65 64 20  nction returned 
23d60 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20  an error if the 
23d70 70 61 67 65 72 20 77 61 73 20 69 6e 20 0a 20 20  pager was in .  
23d80 2a 2a 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  ** PAGER_ERROR s
23d90 74 61 74 65 2e 20 42 75 74 20 73 69 6e 63 65 20  tate. But since 
23da0 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
23db0 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  e guarantees tha
23dc0 74 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20  t.  ** there is 
23dd0 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74  at least one out
23de0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65  standing page re
23df0 66 65 72 65 6e 63 65 2c 20 74 68 69 73 20 66 75  ference, this fu
23e00 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 61  nction.  ** is a
23e10 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 68 61 74 20   no-op for that 
23e20 63 61 73 65 20 61 6e 79 68 6f 77 2e 0a 20 20 2a  case anyhow..  *
23e30 2f 0a 0a 20 20 75 33 32 20 70 61 67 65 53 69 7a  /..  u32 pageSiz
23e40 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a  e = *pPageSize;.
23e50 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
23e60 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69  ze==0 || (pageSi
23e70 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
23e80 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
23e90 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20  PAGE_SIZE) );.  
23ea0 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d  if( (pPager->mem
23eb0 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  Db==0 || pPager-
23ec0 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 26  >dbSize==0).   &
23ed0 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
23ee0 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
23ef0 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20  pPCache)==0 .   
23f00 26 26 20 70 61 67 65 53 69 7a 65 20 26 26 20 70  && pageSize && p
23f10 61 67 65 53 69 7a 65 21 3d 28 75 33 32 29 70 50  ageSize!=(u32)pP
23f20 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a  ager->pageSize .
23f30 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70    ){.    char *p
23f40 4e 65 77 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20  New = NULL;     
23f50 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 74          /* New t
23f60 65 6d 70 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  emp space */.   
23f70 20 69 36 34 20 6e 42 79 74 65 20 3d 20 30 3b 0a   i64 nByte = 0;.
23f80 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
23f90 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50  >eState>PAGER_OP
23fa0 45 4e 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  EN && isOpen(pPa
23fb0 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
23fc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
23fd0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
23fe0 3e 66 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  >fd, &nByte);.  
23ff0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
24000 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24010 20 20 20 70 4e 65 77 20 3d 20 28 63 68 61 72 20     pNew = (char 
24020 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  *)sqlite3PageMal
24030 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20  loc(pageSize);. 
24040 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29       if( !pNew )
24050 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
24060 45 4d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  EM;.    }..    i
24070 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24080 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
24090 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
240a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
240b0 33 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69  3PcacheSetPageSi
240c0 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
240d0 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20  he, pageSize);. 
240e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
240f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24100 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
24110 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
24120 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50  Space);.      pP
24130 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
24140 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 50  = pNew;.      pP
24150 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28  ager->dbSize = (
24160 50 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61 67  Pgno)((nByte+pag
24170 65 53 69 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a  eSize-1)/pageSiz
24180 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  e);.      pPager
24190 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
241a0 65 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65  eSize;.    }else
241b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
241c0 61 67 65 46 72 65 65 28 70 4e 65 77 29 3b 0a 20  ageFree(pNew);. 
241d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61     }.  }..  *pPa
241e0 67 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  geSize = pPager-
241f0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 66 28  >pageSize;.  if(
24200 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24210 7b 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65 72  {.    if( nReser
24220 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20  ve<0 ) nReserve 
24230 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72  = pPager->nReser
24240 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ve;.    assert( 
24250 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e  nReserve>=0 && n
24260 52 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a  Reserve<1000 );.
24270 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73      pPager->nRes
24280 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73  erve = (i16)nRes
24290 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52  erve;.    pagerR
242a0 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72  eportSize(pPager
242b0 29 3b 0a 20 20 20 20 70 61 67 65 72 46 69 78 4d  );.    pagerFixM
242c0 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b  aplimit(pPager);
242d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
242e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
242f0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
24300 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61  he "temporary pa
24310 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20  ge" buffer held 
24320 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79  internally.** by
24330 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69   the pager.  Thi
24340 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68  s is a buffer th
24350 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68  at is big enough
24360 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20   to hold the.** 
24370 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f  entire content o
24380 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  f a database pag
24390 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20  e.  This buffer 
243a0 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  is used internal
243b0 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c  ly.** during rol
243c0 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62  lback and will b
243d0 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68  e overwritten wh
243e0 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63  enever a rollbac
243f0 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75  k.** occurs.  Bu
24400 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20  t other modules 
24410 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20  are free to use 
24420 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20  it too, as long 
24430 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63  as.** no rollbac
24440 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67  ks are happening
24450 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
24460 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
24470 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
24480 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
24490 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a  ->pTmpSpace;.}..
244a0 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
244b0 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   set the maximum
244c0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
244d0 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69  ount if mxPage i
244e0 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20  s positive. .** 
244f0 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20  Make no changes 
24500 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72  if mxPage is zer
24510 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20  o or negative.  
24520 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65  And never reduce
24530 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20   the.** maximum 
24540 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77  page count below
24550 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
24560 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
24570 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c  e..**.** Regardl
24580 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72  ess of mxPage, r
24590 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
245a0 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  t maximum page c
245b0 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ount..*/.int sql
245c0 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
245d0 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  Count(Pager *pPa
245e0 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
245f0 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30  {.  if( mxPage>0
24600 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
24610 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b  mxPgno = mxPage;
24620 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
24630 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
24640 41 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20  AGER_OPEN );    
24650 20 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79    /* Called only
24660 20 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20   by OP_MaxPgcnt 
24670 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
24680 67 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61  ger->mxPgno>=pPa
24690 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20  ger->dbSize );  
246a0 2f 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65  /* OP_MaxPgcnt e
246b0 6e 66 6f 72 63 65 73 20 74 68 69 73 20 2a 2f 0a  nforces this */.
246c0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
246d0 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  >mxPgno;.}../*.*
246e0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
246f0 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  set of routines 
24700 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61  are used to disa
24710 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65  ble the simulate
24720 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d  d.** I/O error m
24730 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65  echanism.  These
24740 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
24750 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75  ed to avoid simu
24760 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20  lated.** errors 
24770 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20  in places where 
24780 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
24790 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  bout errors..**.
247a0 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49  ** Unless -DSQLI
247b0 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65  TE_TEST=1 is use
247c0 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65  d, these routine
247d0 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73  s are all no-ops
247e0 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65  .** and generate
247f0 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66   no code..*/.#if
24800 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
24810 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
24820 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
24830 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20  ing;.extern int 
24840 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
24850 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74  _hit;.static int
24860 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64   saved_cnt;.void
24870 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
24880 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
24890 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20  d){.  saved_cnt 
248a0 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  = sqlite3_io_err
248b0 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71  or_pending;.  sq
248c0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
248d0 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76  ending = -1;.}.v
248e0 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  oid enable_simul
248f0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76  ated_io_errors(v
24900 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
24910 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
24920 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a   = saved_cnt;.}.
24930 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64  #else.# define d
24940 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
24950 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64  _io_errors().# d
24960 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d  efine enable_sim
24970 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
24980 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ().#endif../*.**
24990 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20   Read the first 
249a0 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65  N bytes from the
249b0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
249c0 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f  e file into memo
249d0 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74  ry.** that pDest
249e0 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a   points to. .**.
249f0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
24a00 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  was opened on a 
24a10 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28  transient file (
24a20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20  zFilename==""), 
24a30 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20  or.** opened on 
24a40 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e  a file less than
24a50 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   N bytes in size
24a60 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  , the output buf
24a70 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64  fer is.** zeroed
24a80 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
24a90 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74  eturned. The rat
24aa0 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20  ionale for this 
24ab0 69 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a  is that this .**
24ac0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
24ad0 64 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61  d to read databa
24ae0 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20  se headers, and 
24af0 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20  a new transient 
24b00 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64  or.** zero sized
24b10 20 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20   database has a 
24b20 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73  header than cons
24b30 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66  ists entirely of
24b40 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49   zeroes..**.** I
24b50 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61  f any IO error a
24b60 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45  part from SQLITE
24b70 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
24b80 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  D is encountered
24b90 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63  ,.** the error c
24ba0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
24bb0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e  to the caller an
24bc0 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
24bd0 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20  f the.** output 
24be0 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64  buffer undefined
24bf0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24c00 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61  PagerReadFilehea
24c10 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  der(Pager *pPage
24c20 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e  r, int N, unsign
24c30 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b  ed char *pDest){
24c40 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
24c50 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28  TE_OK;.  memset(
24c60 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20  pDest, 0, N);.  
24c70 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
24c80 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
24c90 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
24ca0 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  ;..  /* This rou
24cb0 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
24cc0 6c 65 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d  led by btree imm
24cd0 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 63  ediately after c
24ce0 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  reating.  ** the
24cf0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20   Pager object.  
24d00 54 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65  There has not be
24d10 65 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  en an opportunit
24d20 79 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a  y to transition.
24d30 20 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65    ** to WAL mode
24d40 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   yet..  */.  ass
24d50 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
24d60 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
24d70 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
24d80 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f  r->fd) ){.    IO
24d90 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70  TRACE(("DBHDR %p
24da0 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72   0 %d\n", pPager
24db0 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73  , N)).    rc = s
24dc0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
24dd0 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20  ger->fd, pDest, 
24de0 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  N, 0);.    if( r
24df0 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
24e00 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
24e10 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24e20 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
24e30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24e40 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
24e50 6e 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61  n may only be ca
24e60 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61 64  lled when a read
24e70 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
24e80 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  open on.** the p
24e90 61 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e 73  ager. It returns
24ea0 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
24eb0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
24ec0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
24ed0 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  * However, if th
24ee0 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65  e file is betwee
24ef0 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69  n 1 and <page-si
24f00 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ze> bytes in siz
24f10 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73  e, then .** this
24f20 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
24f30 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f   1 page file..*/
24f40 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
24f50 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65  erPagecount(Page
24f60 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a  r *pPager, int *
24f70 70 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72  pnPage){.  asser
24f80 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
24f90 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
24fa0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
24fb0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
24fc0 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48  ER_WRITER_FINISH
24fd0 45 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20  ED );.  *pnPage 
24fe0 3d 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64  = (int)pPager->d
24ff0 62 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  bSize;.}.../*.**
25000 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61   Try to obtain a
25010 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f   lock of type lo
25020 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61  cktype on the da
25030 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a  tabase file. If.
25040 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20  ** a similar or 
25050 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
25060 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68  already held, th
25070 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
25080 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72   no-op.** (retur
25090 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ning SQLITE_OK i
250a0 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a  mmediately)..**.
250b0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74  ** Otherwise, at
250c0 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20  tempt to obtain 
250d0 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73  the lock using s
250e0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20  qlite3OsLock(). 
250f0 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62  Invoke .** the b
25100 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
25110 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72  the lock is curr
25120 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61  ently not availa
25130 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20  ble. Repeat .** 
25140 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63  until the busy c
25150 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20  allback returns 
25160 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74  false or until t
25170 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a  he attempt to .*
25180 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63  * obtain the loc
25190 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a  k succeeds..**.*
251a0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
251b0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  OK on success an
251c0 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
251d0 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74  if we cannot obt
251e0 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e  ain.** the lock.
251f0 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   If the lock is 
25200 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73 73  obtained success
25210 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50  fully, set the P
25220 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76  ager.state .** v
25230 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74  ariable to lockt
25240 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ype before retur
25250 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
25260 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  int pager_wait_o
25270 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  n_lock(Pager *pP
25280 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79  ager, int lockty
25290 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  pe){.  int rc;  
252a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
252c0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
252d0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
252e0 68 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20  his is either a 
252f0 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74  no-op (because t
25300 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
25310 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61  k is .  ** alrea
25320 64 79 20 68 65 6c 64 29 2c 20 6f 72 20 6f 6e 65  dy held), or one
25330 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69   of the transiti
25340 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73  ons that the bus
25350 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d  y-handler.  ** m
25360 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75  ay be invoked du
25370 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20  ring, according 
25380 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  to the comment a
25390 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65  bove.  ** sqlite
253a0 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
253b0 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61  dler()..  */.  a
253c0 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
253d0 65 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29  eLock>=locktype)
253e0 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  .       || (pPag
253f0 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  er->eLock==NO_LO
25400 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK && locktype==
25410 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20  SHARED_LOCK).   
25420 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
25430 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
25440 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65  LOCK && locktype
25450 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
25460 29 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20  ).  );..  do {. 
25470 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63     rc = pagerLoc
25480 6b 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b  kDb(pPager, lock
25490 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28  type);.  }while(
254a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
254b0 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73   && pPager->xBus
254c0 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d  yHandler(pPager-
254d0 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
254e0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
254f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74  ;.}../*.** Funct
25500 69 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61  ion assertTrunca
25510 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  teConstraint(pPa
25520 67 65 72 29 20 63 68 65 63 6b 73 20 74 68 61 74  ger) checks that
25530 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
25540 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75  following is tru
25550 65 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20  e for all dirty 
25560 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20  pages currently 
25570 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  in the page-cach
25580 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68  e:.**.**   a) Th
25590 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
255a0 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
255b0 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ual to the size 
255c0 6f 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  of the .**      
255d0 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
255e0 20 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73   image, in pages
255f0 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20  , OR.**.**   b) 
25600 69 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  if the page cont
25610 65 6e 74 20 77 65 72 65 20 77 72 69 74 74 65 6e  ent were written
25620 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69   at this time, i
25630 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20  t would not.**  
25640 20 20 20 20 62 65 20 6e 65 63 65 73 73 61 72 79      be necessary
25650 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75   to write the cu
25660 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75  rrent content ou
25670 74 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  t to the sub-jou
25680 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73  rnal.**      (as
25690 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66   determined by f
256a0 75 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75  unction subjRequ
256b0 69 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a  iresPage())..**.
256c0 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74  ** If the condit
256d0 69 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79 20  ion asserted by 
256e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65  this function we
256f0 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64  re not true, and
25700 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61   the.** dirty pa
25710 67 65 20 77 65 72 65 20 74 6f 20 62 65 20 64 69  ge were to be di
25720 73 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65  scarded from the
25730 20 63 61 63 68 65 20 76 69 61 20 74 68 65 20 70   cache via the p
25740 61 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20  agerStress().** 
25750 72 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74  routine, pagerSt
25760 72 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74  ress() would not
25770 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
25780 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  nt page content 
25790 74 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  to.** the databa
257a0 73 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61  se file. If a sa
257b0 76 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74  vepoint transact
257c0 69 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20  ion were rolled 
257d0 62 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68  back after.** th
257e0 69 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65  is happened, the
257f0 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f   correct behavio
25800 72 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65  r would be to re
25810 73 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  store the curren
25820 74 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  t.** content of 
25830 74 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65  the page. Howeve
25840 72 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f  r, since this co
25850 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65  ntent is not pre
25860 73 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a  sent in either.*
25870 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
25880 69 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69  ile or the porti
25890 6f 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61  on of the rollba
258a0 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a  ck journal and .
258b0 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72  ** sub-journal r
258c0 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63  olled back the c
258d0 6f 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74  ontent could not
258e0 20 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64   be restored and
258f0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
25900 20 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63   image would bec
25910 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20  ome corrupt. It 
25920 69 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72  is therefore for
25930 74 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20  tunate that .** 
25940 74 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63  this circumstanc
25950 65 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a  e cannot arise..
25960 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
25970 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61  QLITE_DEBUG).sta
25980 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54  tic void assertT
25990 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
259a0 74 43 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b  tCb(PgHdr *pPg){
259b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
259c0 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
259d0 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  Y );.  assert( !
259e0 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
259f0 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67  (pPg) || pPg->pg
25a00 6e 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d  no<=pPg->pPager-
25a10 3e 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61  >dbSize );.}.sta
25a20 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54  tic void assertT
25a30 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
25a40 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
25a50 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
25a60 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50  eIterateDirty(pP
25a70 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61  ager->pPCache, a
25a80 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
25a90 73 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65  straintCb);.}.#e
25aa0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73  lse.# define ass
25ab0 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
25ac0 72 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65  raint(pPager).#e
25ad0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  ndif../*.** Trun
25ae0 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
25af0 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
25b00 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20   image to nPage 
25b10 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20  pages. This .** 
25b20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
25b30 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66  t actually modif
25b40 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  y the database f
25b50 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20  ile on disk. It 
25b60 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68  .** just sets th
25b70 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
25b80 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62   of the pager ob
25b90 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74 68 65  ject so that the
25ba0 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20   .** truncation 
25bb0 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65  will be done whe
25bc0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  n the current tr
25bd0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
25be0 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
25bf0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
25c00 6e 6c 79 20 63 61 6c 6c 65 64 20 72 69 67 68 74  nly called right
25c10 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69   before committi
25c20 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
25c30 2e 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 66  ..** Once this f
25c40 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  unction has been
25c50 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 74 72 61   called, the tra
25c60 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 65 69  nsaction must ei
25c70 74 68 65 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65  ther be.** rolle
25c80 64 20 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74  d back or commit
25c90 74 65 64 2e 20 49 74 20 69 73 20 6e 6f 74 20 73  ted. It is not s
25ca0 61 66 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  afe to call this
25cb0 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a   function and.**
25cc0 20 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 77   then continue w
25cd0 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
25ce0 74 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20  tabase..*/.void 
25cf0 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
25d00 63 61 74 65 49 6d 61 67 65 28 50 61 67 65 72 20  cateImage(Pager 
25d10 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
25d20 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  age){.  assert( 
25d30 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
25d40 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  nPage );.  asser
25d50 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
25d60 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
25d70 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50  CACHEMOD );.  pP
25d80 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
25d90 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f  Page;..  /* At o
25da0 6e 65 20 70 6f 69 6e 74 20 74 68 65 20 63 6f 64  ne point the cod
25db0 65 20 68 65 72 65 20 63 61 6c 6c 65 64 20 61 73  e here called as
25dc0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
25dd0 74 72 61 69 6e 74 28 29 20 74 6f 0a 20 20 2a 2a  traint() to.  **
25de0 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 6c 6c   ensure that all
25df0 20 70 61 67 65 73 20 62 65 69 6e 67 20 74 72 75   pages being tru
25e00 6e 63 61 74 65 64 20 61 77 61 79 20 62 79 20 74  ncated away by t
25e10 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 61 72  his operation ar
25e20 65 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20 6f  e,.  ** if one o
25e30 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74  r more savepoint
25e40 73 20 61 72 65 20 6f 70 65 6e 2c 20 70 72 65 73  s are open, pres
25e50 65 6e 74 20 69 6e 20 74 68 65 20 73 61 76 65 70  ent in the savep
25e60 6f 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  oint .  ** journ
25e70 61 6c 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  al so that they 
25e80 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
25e90 69 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  if the savepoint
25ea0 20 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20   is rolled.  ** 
25eb0 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 6e 6f  back. This is no
25ec0 20 6c 6f 6e 67 65 72 20 6e 65 63 65 73 73 61 72   longer necessar
25ed0 79 20 61 73 20 74 68 69 73 20 66 75 6e 63 74 69  y as this functi
25ee0 6f 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20  on is now only. 
25ef0 20 2a 2a 20 63 61 6c 6c 65 64 20 72 69 67 68 74   ** called right
25f00 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69   before committi
25f10 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
25f20 2e 20 53 6f 20 61 6c 74 68 6f 75 67 68 20 74 68  . So although th
25f30 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 6f 62  e .  ** Pager ob
25f40 6a 65 63 74 20 6d 61 79 20 73 74 69 6c 6c 20 68  ject may still h
25f50 61 76 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  ave open savepoi
25f60 6e 74 73 20 28 50 61 67 65 72 2e 6e 53 61 76 65  nts (Pager.nSave
25f70 70 6f 69 6e 74 21 3d 30 29 2c 20 0a 20 20 2a 2a  point!=0), .  **
25f80 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 62 65 20   they cannot be 
25f90 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 53 6f 20  rolled back. So 
25fa0 74 68 65 20 61 73 73 65 72 74 54 72 75 6e 63 61  the assertTrunca
25fb0 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 63  teConstraint() c
25fc0 61 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 6c  all.  ** is no l
25fd0 6f 6e 67 65 72 20 63 6f 72 72 65 63 74 2e 20 2a  onger correct. *
25fe0 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  /.}.../*.** This
25ff0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
26000 6c 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d  led before attem
26010 70 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  pting a hot-jour
26020 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74  nal rollback. It
26030 0a 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f  .** syncs the jo
26040 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69  urnal file to di
26050 73 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50  sk, then sets pP
26060 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
26070 20 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20   to the.** size 
26080 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
26090 69 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  ile so that the 
260a0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
260b0 20 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a   routine knows.*
260c0 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74 69 72  * that the entir
260d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
260e0 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a  as been synced..
260f0 2a 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20  **.** Syncing a 
26100 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64  hot-journal to d
26110 69 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d  isk before attem
26120 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74  pting to roll it
26130 20 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a   back ensures .*
26140 2a 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  * that if a powe
26150 72 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r-failure occurs
26160 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c   during the roll
26170 62 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73  back, the proces
26180 73 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70  s that.** attemp
26190 74 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c  ts rollback foll
261a0 6f 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63  owing system rec
261b0 6f 76 65 72 79 20 73 65 65 73 20 74 68 65 20 73  overy sees the s
261c0 61 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63  ame journal.** c
261d0 6f 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20 70  ontent as this p
261e0 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  rocess..**.** If
261f0 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73   everything goes
26200 20 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c   as planned, SQL
26210 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
26220 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a  ed. Otherwise, .
26230 2a 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  ** an SQLite err
26240 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
26250 69 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63  ic int pagerSync
26260 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  HotJournal(Pager
26270 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
26280 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26290 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
262a0 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63  noSync ){.    rc
262b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
262c0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51  (pPager->jfd, SQ
262d0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
262e0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
262f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26300 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
26310 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
26320 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a  >jfd, &pPager->j
26330 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a  ournalHdr);.  }.
26340 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26350 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 72  /*.** Obtain a r
26360 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 6d 65  eference to a me
26370 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65  mory mapped page
26380 20 6f 62 6a 65 63 74 20 66 6f 72 20 70 61 67 65   object for page
26390 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20 0a 2a   number pgno. .*
263a0 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  * The new object
263b0 20 77 69 6c 6c 20 75 73 65 20 74 68 65 20 70 6f   will use the po
263c0 69 6e 74 65 72 20 70 44 61 74 61 2c 20 6f 62 74  inter pData, obt
263d0 61 69 6e 65 64 20 66 72 6f 6d 20 78 46 65 74 63  ained from xFetc
263e0 68 28 29 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65  h()..** If succe
263f0 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 50 61  ssful, set *ppPa
26400 67 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ge to point to t
26410 68 65 20 6e 65 77 20 70 61 67 65 20 72 65 66 65  he new page refe
26420 72 65 6e 63 65 0a 2a 2a 20 61 6e 64 20 72 65 74  rence.** and ret
26430 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f  urn SQLITE_OK. O
26440 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
26450 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
26460 20 63 6f 64 65 20 61 6e 64 20 73 65 74 0a 2a 2a   code and set.**
26470 20 2a 70 70 50 61 67 65 20 74 6f 20 7a 65 72 6f   *ppPage to zero
26480 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 72 65 66  ..**.** Page ref
26490 65 72 65 6e 63 65 73 20 6f 62 74 61 69 6e 65 64  erences obtained
264a0 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   by calling this
264b0 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
264c0 20 62 65 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20   be released.** 
264d0 62 79 20 63 61 6c 6c 69 6e 67 20 70 61 67 65 72  by calling pager
264e0 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 29  ReleaseMapPage()
264f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26500 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70 50  pagerAcquireMapP
26510 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  age(.  Pager *pP
26520 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
26530 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
26540 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f  object */.  Pgno
26550 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
26560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
26570 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
26580 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 20 20 20  void *pData,    
26590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265a0 2f 2a 20 78 46 65 74 63 68 28 29 27 64 20 64 61  /* xFetch()'d da
265b0 74 61 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ta for this page
265c0 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a 70 70   */.  PgHdr **pp
265d0 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20 20  Page            
265e0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 41 63        /* OUT: Ac
265f0 71 75 69 72 65 64 20 70 61 67 65 20 6f 62 6a 65  quired page obje
26600 63 74 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72  ct */.){.  PgHdr
26610 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
26620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
26630 6d 6f 72 79 20 6d 61 70 70 65 64 20 70 61 67 65  mory mapped page
26640 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
26650 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70  .  if( pPager->p
26660 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 29 7b 0a  MmapFreelist ){.
26670 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 20      *ppPage = p 
26680 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46  = pPager->pMmapF
26690 72 65 65 6c 69 73 74 3b 0a 20 20 20 20 70 50 61  reelist;.    pPa
266a0 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
266b0 73 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a  st = p->pDirty;.
266c0 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20      p->pDirty = 
266d0 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 2d  0;.    memset(p-
266e0 3e 70 45 78 74 72 61 2c 20 30 2c 20 70 50 61 67  >pExtra, 0, pPag
266f0 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 7d  er->nExtra);.  }
26700 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67  else{.    *ppPag
26710 65 20 3d 20 70 20 3d 20 28 50 67 48 64 72 20 2a  e = p = (PgHdr *
26720 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
26730 72 6f 28 73 69 7a 65 6f 66 28 50 67 48 64 72 29  ro(sizeof(PgHdr)
26740 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72   + pPager->nExtr
26750 61 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30  a);.    if( p==0
26760 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
26770 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
26780 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e  r->fd, (i64)(pgn
26790 6f 2d 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70  o-1) * pPager->p
267a0 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b  ageSize, pData);
267b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
267c0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
267d0 7d 0a 20 20 20 20 70 2d 3e 70 45 78 74 72 61 20  }.    p->pExtra 
267e0 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 3b  = (void *)&p[1];
267f0 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20  .    p->flags = 
26800 50 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20 20 20  PGHDR_MMAP;.    
26810 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  p->nRef = 1;.   
26820 20 70 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61   p->pPager = pPa
26830 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ger;.  }..  asse
26840 72 74 28 20 70 2d 3e 70 45 78 74 72 61 3d 3d 28  rt( p->pExtra==(
26850 76 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29 3b 0a  void *)&p[1] );.
26860 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61    assert( p->pPa
26870 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge==0 );.  asser
26880 74 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50 47 48  t( p->flags==PGH
26890 44 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61 73 73  DR_MMAP );.  ass
268a0 65 72 74 28 20 70 2d 3e 70 50 61 67 65 72 3d 3d  ert( p->pPager==
268b0 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65  pPager );.  asse
268c0 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31 20 29  rt( p->nRef==1 )
268d0 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d 20 70  ;..  p->pgno = p
268e0 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74 61 20  gno;.  p->pData 
268f0 3d 20 70 44 61 74 61 3b 0a 20 20 70 50 61 67 65  = pData;.  pPage
26900 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a 0a  r->nMmapOut++;..
26910 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26920 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  OK;.}../*.** Rel
26930 65 61 73 65 20 61 20 72 65 66 65 72 65 6e 63 65  ease a reference
26940 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20 70 50   to page pPg. pP
26950 67 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  g must have been
26960 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20   returned by an 
26970 0a 2a 2a 20 65 61 72 6c 69 65 72 20 63 61 6c 6c  .** earlier call
26980 20 74 6f 20 70 61 67 65 72 41 63 71 75 69 72 65   to pagerAcquire
26990 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74  MapPage()..*/.st
269a0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52  atic void pagerR
269b0 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 50 67  eleaseMapPage(Pg
269c0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
269d0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
269e0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 50 61 67  ->pPager;.  pPag
269f0 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2d 2d 3b 0a  er->nMmapOut--;.
26a00 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
26a10 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65  pPager->pMmapFre
26a20 65 6c 69 73 74 3b 0a 20 20 70 50 61 67 65 72 2d  elist;.  pPager-
26a30 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 3d  >pMmapFreelist =
26a40 20 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28   pPg;..  assert(
26a50 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
26a60 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e  thods->iVersion>
26a70 3d 33 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  =3 );.  sqlite3O
26a80 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
26a90 3e 66 64 2c 20 28 69 36 34 29 28 70 50 67 2d 3e  >fd, (i64)(pPg->
26aa0 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e  pgno-1)*pPager->
26ab0 70 61 67 65 53 69 7a 65 2c 20 70 50 67 2d 3e 70  pageSize, pPg->p
26ac0 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Data);.}../*.** 
26ad0 46 72 65 65 20 61 6c 6c 20 50 67 48 64 72 20 6f  Free all PgHdr o
26ae0 62 6a 65 63 74 73 20 73 74 6f 72 65 64 20 69 6e  bjects stored in
26af0 20 74 68 65 20 50 61 67 65 72 2e 70 4d 6d 61 70   the Pager.pMmap
26b00 46 72 65 65 6c 69 73 74 20 6c 69 73 74 2e 0a 2a  Freelist list..*
26b10 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
26b20 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28 50  gerFreeMapHdrs(P
26b30 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
26b40 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 50 67 48   PgHdr *p;.  PgH
26b50 64 72 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72  dr *pNext;.  for
26b60 28 70 3d 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70  (p=pPager->pMmap
26b70 46 72 65 65 6c 69 73 74 3b 20 70 3b 20 70 3d 70  Freelist; p; p=p
26b80 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
26b90 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20   = p->pDirty;.  
26ba0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
26bb0 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
26bc0 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
26bd0 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
26be0 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
26bf0 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
26c00 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
26c10 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
26c20 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
26c30 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
26c40 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
26c50 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
26c60 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
26c70 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
26c80 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
26c90 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
26ca0 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
26cb0 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
26cc0 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
26cd0 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
26ce0 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
26cf0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
26d00 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
26d10 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
26d20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a  a coredump..**.*
26d30 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
26d40 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
26d50 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
26d60 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61  n is active an a
26d70 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
26d80 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
26d90 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  k. If an error o
26da0 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
26db0 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20   rollback .** a 
26dc0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot journal may 
26dd0 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
26de0 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f  ilesystem but no
26df0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
26e00 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  ed.** to the cal
26e10 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ler..*/.int sqli
26e20 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61  te3PagerClose(Pa
26e30 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
26e40 75 38 20 2a 70 54 6d 70 20 3d 20 28 75 38 20 2a  u8 *pTmp = (u8 *
26e50 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  )pPager->pTmpSpa
26e60 63 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61  ce;..  assert( a
26e70 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
26e80 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 64  e(pPager) );.  d
26e90 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
26ea0 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
26eb0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
26ec0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 61  gnMalloc();.  pa
26ed0 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28 70  gerFreeMapHdrs(p
26ee0 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20 70 50 61  Pager);.  /* pPa
26ef0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30  ger->errCode = 0
26f00 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 65  ; */.  pPager->e
26f10 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30  xclusiveMode = 0
26f20 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
26f30 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71 6c 69  _OMIT_WAL.  sqli
26f40 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61 67  te3WalClose(pPag
26f50 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61 67 65 72  er->pWal, pPager
26f60 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 2c  ->ckptSyncFlags,
26f70 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
26f80 65 2c 20 70 54 6d 70 29 3b 0a 20 20 70 50 61 67  e, pTmp);.  pPag
26f90 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23 65  er->pWal = 0;.#e
26fa0 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65 73  ndif.  pager_res
26fb0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  et(pPager);.  if
26fc0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
26fd0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
26fe0 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
26ff0 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6f 70    /* If it is op
27000 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  en, sync the jou
27010 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
27020 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41   calling UnlockA
27030 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20  ndRollback..    
27040 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  ** If this is no
27050 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e 20  t done, then an 
27060 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
27070 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75   of the open jou
27080 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69 6c  rnal .    ** fil
27090 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65 64 20  e may be played 
270a0 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
270b0 74 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77  tabase. If a pow
270c0 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
270d0 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20  s .    ** while 
270e0 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
270f0 67 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  g, the database 
27100 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72  could become cor
27110 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  rupt..    **.   
27120 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   ** If an error 
27130 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
27140 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68 65 20  ing to sync the 
27150 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74 20 74  journal, shift t
27160 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
27170 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
27180 74 61 74 65 2e 20 54 68 69 73 20 63 61 75 73 65  tate. This cause
27190 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  s UnlockAndRollb
271a0 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ack to unlock th
271b0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
271c0 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20  e and close the 
271d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 74  journal file wit
271e0 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67 20  hout attempting 
271f0 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20 2a  to roll it.    *
27200 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c 69  * back or finali
27210 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78 74 20  ze it. The next 
27220 64 61 74 61 62 61 73 65 20 75 73 65 72 20 77 69  database user wi
27230 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20 68 6f  ll have to do ho
27240 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  t-journal.    **
27250 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65   rollback before
27260 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 64   accessing the d
27270 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
27280 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 4f    */.    if( isO
27290 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
272a0 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
272b0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70 61  error(pPager, pa
272c0 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
272d0 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  l(pPager));.    
272e0 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  }.    pagerUnloc
272f0 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
27300 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
27310 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
27320 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73  oc();.  enable_s
27330 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
27340 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41  rs();.  PAGERTRA
27350 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE(("CLOSE %d\n"
27360 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
27370 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  )));.  IOTRACE((
27380 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50  "CLOSE %p\n", pP
27390 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33  ager)).  sqlite3
273a0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
273b0 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  jfd);.  sqlite3O
273c0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
273d0 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  d);.  sqlite3Pag
273e0 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20 73  eFree(pTmp);.  s
273f0 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73  qlite3PcacheClos
27400 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
27410 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  e);..#ifdef SQLI
27420 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
27430 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
27440 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e  cFree ) pPager->
27450 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65  xCodecFree(pPage
27460 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64  r->pCodec);.#end
27470 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  if..  assert( !p
27480 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
27490 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49  t && !pPager->pI
274a0 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  nJournal );.  as
274b0 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50  sert( !isOpen(pP
274c0 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69  ager->jfd) && !i
274d0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
274e0 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65  fd) );..  sqlite
274f0 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
27500 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27510 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  OK;.}..#if !defi
27520 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64  ned(NDEBUG) || d
27530 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
27540 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
27550 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
27560 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a   for page pPg..*
27570 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61  /.Pgno sqlite3Pa
27580 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62  gerPagenumber(Db
27590 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
275a0 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  turn pPg->pgno;.
275b0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
275c0 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Increment the re
275d0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
275e0 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76  r page pPg..*/.v
275f0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
27600 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  Ref(DbPage *pPg)
27610 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
27620 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  eRef(pPg);.}../*
27630 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
27640 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77  rnal. In other w
27650 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  ords, make sure 
27660 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68  all the pages th
27670 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  at have.** been 
27680 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
27690 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75  ournal have actu
276a0 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65  ally reached the
276b0 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a   surface of the.
276c0 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20  ** disk and can 
276d0 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74  be restored in t
276e0 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f  he event of a ho
276f0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
27700 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
27710 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c   Pager.noSync fl
27720 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
27730 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
27740 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68   a no-op..** Oth
27750 65 72 77 69 73 65 2c 20 74 68 65 20 61 63 74 69  erwise, the acti
27760 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64 65 70  ons required dep
27770 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  end on the journ
27780 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65 20  al-mode and the 
27790 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61 72 61  .** device chara
277a0 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74 68  cteristics of th
277b0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61  e file-system, a
277c0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
277d0 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72     * If the jour
277e0 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69  nal file is an i
277f0 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
27800 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e   file, no action
27810 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20   need.**     be 
27820 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  taken..**.**   *
27830 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
27840 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e  he device does n
27850 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53  ot support the S
27860 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65  AFE_APPEND prope
27870 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e  rty,.**     then
27880 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
27890 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
278a0 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75  ntly written jou
278b0 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20  rnal header.**  
278c0 20 20 20 69 73 20 75 70 64 61 74 65 64 20 74 6f     is updated to
278d0 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d   contain the num
278e0 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72  ber of journal r
278f0 65 63 6f 72 64 73 20 74 68 61 74 20 68 61 76 65  ecords that have
27900 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69  .**     been wri
27910 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  tten following i
27920 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  t. If the pager 
27930 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  is operating in 
27940 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20  full-sync.**    
27950 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
27960 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
27970 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68  synced before th
27980 69 73 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  is field is upda
27990 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ted..**.**   * I
279a0 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65  f the device doe
279b0 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68  s not support th
279c0 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f  e SEQUENTIAL pro
279d0 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20  perty, then .** 
279e0 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65      journal file
279f0 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a   is synced..**.*
27a00 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d  * Or, in pseudo-
27a10 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66  code:.**.**   if
27a20 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79  ( NOT <in-memory
27a30 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20   journal> ){.** 
27a40 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45      if( NOT SAFE
27a50 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20  _APPEND ){.**   
27a60 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79      if( <full-sy
27a70 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63  nc mode> ) xSync
27a80 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29  (<journal file>)
27a90 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61  ;.**       <upda
27aa0 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a  te nRec field>.*
27ab0 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20  *     } .**     
27ac0 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49  if( NOT SEQUENTI
27ad0 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72  AL ) xSync(<jour
27ae0 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20  nal file>);.**  
27af0 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63   }.**.** If succ
27b00 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75  essful, this rou
27b10 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20  tine clears the 
27b20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
27b30 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a  flag of every .*
27b40 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79  * page currently
27b50 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20   held in memory 
27b60 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
27b70 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
27b80 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73  n IO.** error is
27b90 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
27ba0 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
27bb0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
27bc0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
27bd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
27be0 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ncJournal(Pager 
27bf0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 65 77  *pPager, int new
27c00 48 64 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  Hdr){.  int rc; 
27c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
27c30 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73  n code */..  ass
27c40 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
27c50 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
27c60 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
27c70 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
27c80 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
27c90 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61  R_DBMOD.  );.  a
27ca0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
27cb0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
27cc0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
27cd0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
27ce0 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73  er) );..  rc = s
27cf0 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75  qlite3PagerExclu
27d00 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29  siveLock(pPager)
27d10 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
27d20 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
27d30 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  c;..  if( !pPage
27d40 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
27d50 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
27d60 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
27d70 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
27d80 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61  ger->jfd) && pPa
27d90 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
27da0 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
27db0 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  ODE_MEMORY ){.  
27dc0 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44      const int iD
27dd0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
27de0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
27df0 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
27e00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
27e10 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
27e20 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  ) );..      if( 
27e30 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
27e40 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
27e50 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
27e60 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73  This block deals
27e70 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65   with an obscure
27e80 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65   problem. If the
27e90 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e   last connection
27ea0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
27eb0 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64   wrote to this d
27ec0 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65 72  atabase was oper
27ed0 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74  ating in persist
27ee0 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  ent-journal.    
27ef0 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65      ** mode, the
27f00 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
27f10 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20 70  le may at this p
27f20 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65  oint actually be
27f30 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20 20   larger.        
27f40 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f  ** than Pager.jo
27f50 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20  urnalOff bytes. 
27f60 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e  If the next thin
27f70 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g in the journal
27f80 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  .        ** file
27f90 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61   happens to be a
27fa0 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
27fb0 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72 74  (written as part
27fc0 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
27fd0 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e  ** previous conn
27fe0 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61 63  ection's transac
27ff0 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61  tion), and a cra
28000 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c  sh or power-fail
28010 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
28020 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e 52 65  occurs after nRe
28030 63 20 69 73 20 75 70 64 61 74 65 64 20 62 75 74  c is updated but
28040 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e   before this con
28050 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a  nection writes .
28060 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68          ** anyth
28070 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20  ing else to the 
28080 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72  journal file (or
28090 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62   commits/rolls b
280a0 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20  ack its .       
280b0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29   ** transaction)
280c0 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61  , then SQLite ma
280d0 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65  y become confuse
280e0 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65  d when doing the
280f0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74   .        ** hot
28100 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
28110 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f  k following reco
28120 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c  very. It may rol
28130 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20  l back all.     
28140 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f     ** of this co
28150 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20  nnections data, 
28160 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20  then proceed to 
28170 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65  rolling back the
28180 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a   old,.        **
28190 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74   out-of-date dat
281a0 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69  a that follows i
281b0 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  t. Database corr
281c0 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  uption..        
281d0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f  **.        ** To
281e0 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
281f0 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  s, if the journa
28200 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65  l file does appe
28210 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20  ar to contain.  
28220 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64        ** a valid
28230 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e   header followin
28240 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  g Pager.journalO
28250 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61  ff, then write a
28260 20 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a   0x00.        **
28270 20 62 79 74 65 20 74 6f 20 74 68 65 20 73 74 61   byte to the sta
28280 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76  rt of it to prev
28290 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e  ent it from bein
282a0 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20  g recognized..  
282b0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
282c0 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 65   ** Variable iNe
282d0 78 74 48 64 72 4f 66 66 73 65 74 20 69 73 20 73  xtHdrOffset is s
282e0 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  et to the offset
282f0 20 61 74 20 77 68 69 63 68 20 74 68 69 73 0a 20   at which this. 
28300 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65         ** proble
28310 6d 61 74 69 63 20 68 65 61 64 65 72 20 77 69 6c  matic header wil
28320 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20 65  l occur, if it e
28330 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69 73  xists. aMagic is
28340 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20 2a   used .        *
28350 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72 79  * as a temporary
28360 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70 65   buffer to inspe
28370 63 74 20 74 68 65 20 66 69 72 73 74 20 63 6f 75  ct the first cou
28380 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66 0a  ple of bytes of.
28390 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70          ** the p
283a0 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c  otential journal
283b0 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20   header..       
283c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20   */.        i64 
283d0 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b 0a  iNextHdrOffset;.
283e0 20 20 20 20 20 20 20 20 75 38 20 61 4d 61 67 69          u8 aMagi
283f0 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75 38  c[8];.        u8
28400 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28   zHeader[sizeof(
28410 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
28420 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  ];..        memc
28430 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75  py(zHeader, aJou
28440 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
28450 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
28460 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33 32  );.        put32
28470 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
28480 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
28490 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52  ic)], pPager->nR
284a0 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e  ec);..        iN
284b0 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20 6a  extHdrOffset = j
284c0 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
284d0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
284e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
284f0 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
28500 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65 78   aMagic, 8, iNex
28510 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20  tHdrOffset);.   
28520 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
28530 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d  ITE_OK && 0==mem
28540 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
28550 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b  rnalMagic, 8) ){
28560 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69  .          stati
28570 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62  c const u8 zerob
28580 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  yte = 0;.       
28590 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
285a0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
285b0 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20 31  fd, &zerobyte, 1
285c0 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  , iNextHdrOffset
285d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
285e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
285f0 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
28600 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
28610 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
28620 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
28630 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
28640 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   /* Write the nR
28650 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68  ec value into th
28660 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
28670 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20  eader. If in.   
28680 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e       ** full-syn
28690 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73  chronous mode, s
286a0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
286b0 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75  first. This ensu
286c0 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  res that.       
286d0 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73   ** all data has
286e0 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20   really hit the 
286f0 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63  disk before nRec
28700 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d   is updated to m
28710 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ark.        ** i
28720 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65  t as a candidate
28730 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20   for rollback.. 
28740 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
28750 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74    ** This is not
28760 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65   required if the
28770 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69   persistent medi
28780 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20  a supports the. 
28790 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41         ** SAFE_A
287a0 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20  PPEND property. 
287b0 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20  Because in this 
287c0 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  case it is not p
287d0 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20  ossible .       
287e0 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20   ** for garbage 
287f0 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e  data to be appen
28800 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c  ded to the file,
28810 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
28820 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f          ** is po
28830 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46  pulated with 0xF
28840 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65  FFFFFFF when the
28850 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
28860 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20  is written.     
28870 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20     ** and never 
28880 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61  needs to be upda
28890 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ted..        */.
288a0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
288b0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20  er->fullSync && 
288c0 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
288d0 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
288e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41   ){.          PA
288f0 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20  GERTRACE(("SYNC 
28900 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
28910 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
28920 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49  )));.          I
28930 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
28940 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
28950 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
28960 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
28970 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
28980 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20  >syncFlags);.   
28990 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
289a0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
289b0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
289c0 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
289d0 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e  ("JHDR %p %lld\n
289e0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
289f0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b  r->journalHdr));
28a00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
28a10 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20 20  lite3OsWrite(.  
28a20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
28a30 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20  ->jfd, zHeader, 
28a40 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 2c  sizeof(zHeader),
28a50 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
28a60 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  Hdr.        );. 
28a70 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
28a80 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
28a90 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
28aa0 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26      if( 0==(iDc&
28ab0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
28ac0 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20  UENTIAL) ){.    
28ad0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
28ae0 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
28af0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
28b00 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20  pPager)));.     
28b10 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
28b20 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
28b30 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  )).        rc = 
28b40 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
28b50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
28b60 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a 20  r->syncFlags| . 
28b70 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
28b80 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51 4c  ->syncFlags==SQL
28b90 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51  ITE_SYNC_FULL?SQ
28ba0 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
28bb0 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b  LY:0).        );
28bc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
28bd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
28be0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
28bf0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
28c00 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67  ournalHdr = pPag
28c10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
28c20 20 20 20 20 20 20 69 66 28 20 6e 65 77 48 64 72        if( newHdr
28c30 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
28c40 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
28c50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20  PEND) ){.       
28c60 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
28c70 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
28c80 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
28c90 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
28ca0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28cb0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
28cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
28cd0 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e{.      pPager-
28ce0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
28cf0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
28d00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
28d10 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67  * Unless the pag
28d20 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20  er is in noSync 
28d30 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61  mode, the journa
28d40 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20  l file was just 
28d50 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c  .  ** successful
28d60 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74 68 65  ly synced. Eithe
28d70 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74 68 65  r way, clear the
28d80 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
28d90 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61   flag on .  ** a
28da0 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20  ll pages..  */. 
28db0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
28dc0 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61  earSyncFlags(pPa
28dd0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
28de0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
28df0 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  = PAGER_WRITER_D
28e00 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74 28 20  BMOD;.  assert( 
28e10 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
28e20 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
28e30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28e40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  ;.}../*.** The a
28e50 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66  rgument is the f
28e60 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64  irst in a linked
28e70 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70   list of dirty p
28e80 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a  ages connected.*
28e90 2a 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70  * by the PgHdr.p
28ea0 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54  Dirty pointer. T
28eb0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69  his function wri
28ec0 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20  tes each one of 
28ed0 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  the.** in-memory
28ee0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69   pages in the li
28ef0 73 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  st to the databa
28f00 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67  se file. The arg
28f10 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20  ument may.** be 
28f20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69  NULL, representi
28f30 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74  ng an empty list
28f40 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
28f50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  his function is.
28f60 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  ** a no-op..**.*
28f70 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75 73 74  * The pager must
28f80 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61   hold at least a
28f90 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77   RESERVED lock w
28fa0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
28fb0 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20  n.** is called. 
28fc0 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61  Before writing a
28fd0 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64  nything to the d
28fe0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
28ff0 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70  is lock.** is up
29000 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43  graded to an EXC
29010 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
29020 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20  the lock cannot 
29030 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20  be obtained,.** 
29040 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
29050 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64  eturned and no d
29060 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
29070 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
29080 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74  ile..** .** If t
29090 68 65 20 70 61 67 65 72 20 69 73 20 61 20 74 65  he pager is a te
290a0 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e  mp-file pager an
290b0 64 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c  d the actual fil
290c0 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a  e-system file.**
290d0 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e   is not yet open
290e0 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20  , it is created 
290f0 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72  and opened befor
29100 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a  e any data is .*
29110 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a  * written out..*
29120 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f  *.** Once the lo
29130 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67 72  ck has been upgr
29140 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63  aded and, if nec
29150 65 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65  essary, the file
29160 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20   opened,.** the 
29170 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65  pages are writte
29180 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  n out to the dat
29190 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69  abase file in li
291a0 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e  st order. Writin
291b0 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73  g.** a page is s
291c0 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d 65 65  kipped if it mee
291d0 74 73 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  ts either of the
291e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65   following crite
291f0 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  ria:.**.**   * T
29200 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
29210 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50  s greater than P
29220 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a  ager.dbSize, or.
29230 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44 52  **   * The PGHDR
29240 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67  _DONT_WRITE flag
29250 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70   is set on the p
29260 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72  age..**.** If wr
29270 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65  iting out a page
29280 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61   causes the data
29290 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f  base file to gro
292a0 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53  w, Pager.dbFileS
292b0 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65  ize.** is update
292c0 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49  d accordingly. I
292d0 66 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74  f page 1 is writ
292e0 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68  ten out, then th
292f0 65 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a  e value cached.*
29300 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c  * in Pager.dbFil
29310 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74  eVers[] is updat
29320 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ed to match the 
29330 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64  new value stored
29340 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   in.** the datab
29350 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
29360 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  If everything is
29370 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
29380 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
29390 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
293a0 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61  or .** occurs, a
293b0 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
293c0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c  is returned. Or,
293d0 20 69 66 20 74 68 65 20 45 58 43 4c 55 53 49 56   if the EXCLUSIV
293e0 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a  E lock cannot.**
293f0 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51   be obtained, SQ
29400 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
29410 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
29420 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
29430 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65 72 20  _pagelist(Pager 
29440 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
29450 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  pList){.  int rc
29460 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
29470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29480 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
29490 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
294a0 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tion is only cal
294b0 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b  led for rollback
294c0 20 70 61 67 65 72 73 20 69 6e 20 57 52 49 54 45   pagers in WRITE
294d0 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a  R_DBMOD state. *
294e0 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  /.  assert( !pag
294f0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
29500 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
29510 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
29520 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
29530 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
29540 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
29550 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a  LUSIVE_LOCK );..
29560 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
29570 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   is a temp-file 
29580 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
29590 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74   opened, open it
295a0 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73   now. It.  ** is
295b0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
295c0 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65 72  r rc to be other
295d0 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   than SQLITE_OK 
295e0 69 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20  if this branch. 
295f0 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61 73   ** is taken, as
29600 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
29610 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70  ock() is a no-op
29620 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e   for temp-files.
29630 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f  .  */.  if( !isO
29640 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
29650 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
29660 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
29670 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
29680 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
29690 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
296a0 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  r, pPager->fd, p
296b0 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29  Pager->vfsFlags)
296c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f  ;.  }..  /* Befo
296d0 72 65 20 74 68 65 20 66 69 72 73 74 20 77 72 69  re the first wri
296e0 74 65 2c 20 67 69 76 65 20 74 68 65 20 56 46 53  te, give the VFS
296f0 20 61 20 68 69 6e 74 20 6f 66 20 77 68 61 74 20   a hint of what 
29700 74 68 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 66  the final.  ** f
29710 69 6c 65 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  ile size will be
29720 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
29730 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
29740 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
29750 3e 66 64 29 20 29 3b 0a 20 20 69 66 28 20 72 63  >fd) );.  if( rc
29760 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20  ==SQLITE_OK .   
29770 26 26 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  && pPager->dbHin
29780 74 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62  tSize<pPager->db
29790 53 69 7a 65 0a 20 20 20 26 26 20 28 70 4c 69 73  Size.   && (pLis
297a0 74 2d 3e 70 44 69 72 74 79 20 7c 7c 20 70 4c 69  t->pDirty || pLi
297b0 73 74 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  st->pgno>pPager-
297c0 3e 64 62 48 69 6e 74 53 69 7a 65 29 0a 20 20 29  >dbHintSize).  )
297d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
297e0 74 36 34 20 73 7a 46 69 6c 65 20 3d 20 70 50 61  t64 szFile = pPa
297f0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20  ger->pageSize * 
29800 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70  (sqlite3_int64)p
29810 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
29820 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
29830 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67  ControlHint(pPag
29840 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46  er->fd, SQLITE_F
29850 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20  CNTL_SIZE_HINT, 
29860 26 73 7a 46 69 6c 65 29 3b 0a 20 20 20 20 70 50  &szFile);.    pP
29870 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
29880 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
29890 65 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  e;.  }..  while(
298a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
298b0 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50  & pList ){.    P
298c0 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74  gno pgno = pList
298d0 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20  ->pgno;..    /* 
298e0 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72  If there are dir
298f0 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ty pages in the 
29900 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20  page cache with 
29910 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65  page numbers gre
29920 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e  ater.    ** than
29930 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74   Pager.dbSize, t
29940 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65  his means sqlite
29950 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
29960 61 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64  age() was called
29970 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20   to.    ** make 
29980 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72  the file smaller
29990 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20   (presumably by 
299a0 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65  auto-vacuum code
299b0 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a  ). Do not write.
299c0 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20      ** any such 
299d0 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c  pages to the fil
299e0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
299f0 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72   Also, do not wr
29a00 69 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65  ite out any page
29a10 20 74 68 61 74 20 68 61 73 20 74 68 65 20 50 47   that has the PG
29a20 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66  HDR_DONT_WRITE f
29a30 6c 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28  lag.    ** set (
29a40 73 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61  set by sqlite3Pa
29a50 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e  gerDontWrite()).
29a60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
29a70 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
29a80 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73  Size && 0==(pLis
29a90 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  t->flags&PGHDR_D
29aa0 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20  ONT_WRITE) ){.  
29ab0 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
29ac0 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
29ad0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
29ae0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
29af0 77 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 63  write */.      c
29b00 68 61 72 20 2a 70 44 61 74 61 3b 20 20 20 20 20  har *pData;     
29b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29b30 20 44 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a   Data to write *
29b40 2f 20 20 20 20 0a 0a 20 20 20 20 20 20 61 73 73  /    ..      ass
29b50 65 72 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c 61  ert( (pList->fla
29b60 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
29b70 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  NC)==0 );.      
29b80 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d  if( pList->pgno=
29b90 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69 74 65  =1 ) pager_write
29ba0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
29bb0 4c 69 73 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  List);..      /*
29bc0 20 45 6e 63 6f 64 65 20 74 68 65 20 64 61 74 61   Encode the data
29bd0 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f  base */.      CO
29be0 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69  DEC2(pPager, pLi
29bf0 73 74 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c  st->pData, pgno,
29c00 20 36 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54   6, return SQLIT
29c10 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 29 3b  E_NOMEM, pData);
29c20 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ..      /* Write
29c30 20 6f 75 74 20 74 68 65 20 70 61 67 65 20 64 61   out the page da
29c40 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ta. */.      rc 
29c50 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
29c60 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61  (pPager->fd, pDa
29c70 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
29c80 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a  Size, offset);..
29c90 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65        /* If page
29ca0 20 31 20 77 61 73 20 6a 75 73 74 20 77 72 69 74   1 was just writ
29cb0 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65  ten, update Page
29cc0 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20  r.dbFileVers to 
29cd0 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74  match.      ** t
29ce0 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f  he value now sto
29cf0 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  red in the datab
29d00 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69  ase file. If wri
29d10 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20  ting this .     
29d20 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64 20   ** page caused 
29d30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
29d40 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74  e to grow, updat
29d50 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20  e dbFileSize. . 
29d60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
29d70 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
29d80 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
29d90 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
29da0 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a   &pData[24], siz
29db0 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
29dc0 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
29dd0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  }.      if( pgno
29de0 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
29df0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ize ){.        p
29e00 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
29e10 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20  e = pgno;.      
29e20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
29e30 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54  aStat[PAGER_STAT
29e40 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20  _WRITE]++;..    
29e50 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20    /* Update any 
29e60 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63  backup objects c
29e70 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  opying the conte
29e80 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  nts of this page
29e90 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  r. */.      sqli
29ea0 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
29eb0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
29ec0 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73   pgno, (u8*)pLis
29ed0 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20  t->pData);..    
29ee0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
29ef0 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20  TORE %d page %d 
29f00 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
29f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
29f30 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
29f40 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29  agehash(pList)))
29f50 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
29f60 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22  ("PGOUT %p %d\n"
29f70 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
29f80 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
29f90 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
29fa0 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b  _writedb_count);
29fb0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29fc0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4e    PAGERTRACE(("N
29fd0 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  OSTORE %d page %
29fe0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
29ff0 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20  ager), pgno));. 
2a000 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73     }.    pager_s
2a010 65 74 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73  et_pagehash(pLis
2a020 74 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  t);.    pList = 
2a030 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
2a040 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
2a050 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65  .}../*.** Ensure
2a060 20 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a 6f   that the sub-jo
2a070 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
2a080 65 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72  en. If it is alr
2a090 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73 20  eady open, this 
2a0a0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
2a0b0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53  a no-op..**.** S
2a0c0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2a0d0 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68 69  rned if everythi
2a0e0 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e  ng goes accordin
2a0f0 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a  g to plan. An .*
2a100 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58  * SQLITE_IOERR_X
2a110 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  XX error code is
2a120 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 63   returned if a c
2a130 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  all to sqlite3Os
2a140 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73  Open() .** fails
2a150 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a160 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50  openSubJournal(P
2a170 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2a180 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2a190 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f 70  _OK;.  if( !isOp
2a1a0 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
2a1b0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
2a1c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
2a1d0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2a1e0 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61  DE_MEMORY || pPa
2a1f0 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72  ger->subjInMemor
2a200 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  y ){.      sqlit
2a210 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e  e3MemJournalOpen
2a220 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
2a230 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a240 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74   rc = pagerOpent
2a250 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67  emp(pPager, pPag
2a260 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54 45  er->sjfd, SQLITE
2a270 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
2a280 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
2a290 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2a2a0 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63 6f  ** Append a reco
2a2b0 72 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  rd of the curren
2a2c0 74 20 73 74 61 74 65 20 6f 66 20 70 61 67 65 20  t state of page 
2a2d0 70 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  pPg to the sub-j
2a2e0 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 0a 2a 2a 20 49  ournal. .**.** I
2a2f0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
2a300 74 20 74 68 65 20 62 69 74 20 63 6f 72 72 65 73  t the bit corres
2a310 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e  ponding to pPg->
2a320 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76  pgno in the bitv
2a330 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f  ecs.** for all o
2a340 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62  pen savepoints b
2a350 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
2a360 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
2a370 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
2a380 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
2a390 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
2a3a0 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72  ul, an IO.** err
2a3b0 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65 20 61  or code if the a
2a3c0 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
2a3d0 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
2a3e0 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
2a3f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
2a400 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20   a malloc fails 
2a410 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20  while setting a 
2a420 62 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69  bit in a savepoi
2a430 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f  nt.** bitvec..*/
2a440 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
2a450 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72  ournalPage(PgHdr
2a460 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63   *pPg){.  int rc
2a470 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2a480 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2a490 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
2a4a0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
2a4b0 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
2a4c0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
2a4d0 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68  ..    /* Open th
2a4e0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69  e sub-journal, i
2a4f0 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72  f it has not alr
2a500 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
2a510 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2a520 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
2a530 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  al );.    assert
2a540 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2a550 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55 73  >jfd) || pagerUs
2a560 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
2a570 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
2a580 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
2a590 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75 62   || pPager->nSub
2a5a0 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
2a5b0 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
2a5c0 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20  l(pPager) .     
2a5d0 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75      || pageInJou
2a5e0 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 70 50 67  rnal(pPager, pPg
2a5f0 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  ) .         || p
2a600 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
2a610 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20 20  >dbOrigSize .   
2a620 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65   );.    rc = ope
2a630 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67  nSubJournal(pPag
2a640 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  er);..    /* If 
2a650 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
2a660 77 61 73 20 6f 70 65 6e 65 64 20 73 75 63 63 65  was opened succe
2a670 73 73 66 75 6c 6c 79 20 28 6f 72 20 77 61 73 20  ssfully (or was 
2a680 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20  already open),. 
2a690 20 20 20 2a 2a 20 77 72 69 74 65 20 74 68 65 20     ** write the 
2a6a0 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 69  journal record i
2a6b0 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 2a  nto the file.  *
2a6c0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
2a6d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2a6e0 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70   void *pData = p
2a6f0 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20  Pg->pData;.     
2a700 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 69   i64 offset = (i
2a710 36 34 29 70 50 61 67 65 72 2d 3e 6e 53 75 62 52  64)pPager->nSubR
2a720 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
2a730 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 63  geSize);.      c
2a740 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20 0a  har *pData2;.  .
2a750 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
2a760 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
2a770 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e  >pgno, 7, return
2a780 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70   SQLITE_NOMEM, p
2a790 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 50 41  Data2);.      PA
2a7a0 47 45 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d  GERTRACE(("STMT-
2a7b0 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
2a7c0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
2a7d0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
2a7e0 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  o));.      rc = 
2a7f0 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
2a800 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74  er->sjfd, offset
2a810 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
2a820 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2a830 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2a840 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
2a850 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66  rite(pPager->sjf
2a860 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
2a870 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66  r->pageSize, off
2a880 73 65 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a  set+4);.      }.
2a890 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
2a8a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2a8b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 75  .    pPager->nSu
2a8c0 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65  bRec++;.    asse
2a8d0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  rt( pPager->nSav
2a8e0 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20  epoint>0 );.    
2a8f0 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f  rc = addToSavepo
2a900 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
2a910 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  r, pPg->pgno);. 
2a920 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2a930 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62  }.static int sub
2a940 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66 52 65 71  journalPageIfReq
2a950 75 69 72 65 64 28 50 67 48 64 72 20 2a 70 50 67  uired(PgHdr *pPg
2a960 29 7b 0a 20 20 69 66 28 20 73 75 62 6a 52 65 71  ){.  if( subjReq
2a970 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29  uiresPage(pPg) )
2a980 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 75 62  {.    return sub
2a990 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29  journalPage(pPg)
2a9a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2a9b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2a9c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2a9d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
2a9e0 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61  alled by the pca
2a9f0 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69  che layer when i
2aa00 74 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f  t has reached so
2aa10 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72  me.** soft memor
2aa20 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72  y limit. The fir
2aa30 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
2aa40 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61   pointer to a Pa
2aa50 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63  ger object.** (c
2aa60 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e  ast as a void*).
2aa70 20 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c   The pager is al
2aa80 77 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27  ways 'purgeable'
2aa90 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f   (not an in-memo
2aaa0 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e  ry.** database).
2aab0 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
2aac0 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65  ment is a refere
2aad0 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68  nce to a page th
2aae0 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e  at is .** curren
2aaf0 74 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61  tly dirty but ha
2ab00 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
2ab10 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65   references. The
2ab20 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61   page.** is alwa
2ab30 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
2ab40 74 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  th the Pager obj
2ab50 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
2ab60 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75  e first .** argu
2ab70 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
2ab80 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63  job of this func
2ab90 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20  tion is to make 
2aba0 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69  pPg clean by wri
2abb0 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74  ting its content
2abc0 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20  s.** out to the 
2abd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
2abe0 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73  f possible. This
2abf0 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e   may involve syn
2ac00 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  cing the.** jour
2ac10 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  nal file. .**.**
2ac20 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
2ac30 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
2ac40 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c  eClean() is call
2ac50 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61  ed on the page a
2ac60 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
2ac70 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
2ac80 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
2ac90 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
2aca0 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65  make the.** page
2acb0 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65   clean, the IO e
2acc0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
2acd0 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61  urned. If the pa
2ace0 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ge cannot be.** 
2acf0 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73  made clean for s
2ad00 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e  ome other reason
2ad10 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
2ad20 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49  ccurs, then SQLI
2ad30 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
2ad40 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50  rned by sqlite3P
2ad50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29  cacheMakeClean()
2ad60 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a   is not called..
2ad70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
2ad80 67 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a  gerStress(void *
2ad90 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  p, PgHdr *pPg){.
2ada0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
2adb0 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20  = (Pager *)p;.  
2adc0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2add0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
2ade0 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
2adf0 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
2ae00 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
2ae10 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20  _DIRTY );..  /* 
2ae20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e  The doNotSpill N
2ae30 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73 65 74  OSYNC bit is set
2ae40 20 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77 68   during times wh
2ae50 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63 20  en doing a sync 
2ae60 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  of.  ** journal 
2ae70 28 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e 65  (and adding a ne
2ae80 77 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f 74  w header) is not
2ae90 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73 20   allowed.  This 
2aea0 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69  occurs.  ** duri
2aeb0 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ng calls to sqli
2aec0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
2aed0 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
2aee0 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65  journal multiple
2aef0 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f  .  ** pages belo
2af00 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61 6d  nging to the sam
2af10 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20  e sector..  **. 
2af20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70 69   ** The doNotSpi
2af30 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20  ll ROLLBACK and 
2af40 4f 46 46 20 62 69 74 73 20 69 6e 68 69 62 69 74  OFF bits inhibit
2af50 73 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69 6c  s all cache spil
2af60 6c 69 6e 67 0a 20 20 2a 2a 20 72 65 67 61 72 64  ling.  ** regard
2af70 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
2af80 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69 73  or not a sync is
2af90 20 72 65 71 75 69 72 65 64 2e 20 20 54 68 69 73   required.  This
2afa0 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 0a 20   is set during. 
2afb0 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   ** a rollback o
2afc0 72 20 62 79 20 75 73 65 72 20 72 65 71 75 65 73  r by user reques
2afd0 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  t, respectively.
2afe0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c  .  **.  ** Spill
2aff0 69 6e 67 20 69 73 20 61 6c 73 6f 20 70 72 6f 68  ing is also proh
2b000 69 62 69 74 65 64 20 77 68 65 6e 20 69 6e 20 61  ibited when in a
2b010 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 73 69  n error state si
2b020 6e 63 65 20 74 68 61 74 20 63 6f 75 6c 64 0a 20  nce that could. 
2b030 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61 74 61   ** lead to data
2b040 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
2b050 20 20 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e     In the curren
2b060 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
2b070 20 69 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70   it .  ** is imp
2b080 6f 73 73 69 62 6c 65 20 66 6f 72 20 73 71 6c 69  ossible for sqli
2b090 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 29  te3PcacheFetch()
2b0a0 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 77 69   to be called wi
2b0b0 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 33  th createFlag==3
2b0c0 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74  .  ** while in t
2b0d0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
2b0e0 68 65 6e 63 65 20 69 74 20 69 73 20 69 6d 70 6f  hence it is impo
2b0f0 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20  ssible for this 
2b100 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20  routine to.  ** 
2b110 62 65 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65  be called in the
2b120 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 20 4e   error state.  N
2b130 65 76 65 72 74 68 65 6c 65 73 73 2c 20 77 65 20  evertheless, we 
2b140 69 6e 63 6c 75 64 65 20 61 20 4e 45 56 45 52 28  include a NEVER(
2b150 29 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f 72 20  ).  ** test for 
2b160 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
2b170 61 73 20 61 20 73 61 66 65 67 75 61 72 64 20 61  as a safeguard a
2b180 67 61 69 6e 73 74 20 66 75 74 75 72 65 20 63 68  gainst future ch
2b190 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  anges..  */.  if
2b1a0 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
2b1b0 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75 72  errCode) ) retur
2b1c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74  n SQLITE_OK;.  t
2b1d0 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d  estcase( pPager-
2b1e0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
2b1f0 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
2b200 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
2b210 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
2b220 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4f  ll & SPILLFLAG_O
2b230 46 46 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  FF );.  testcase
2b240 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
2b250 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47  pill & SPILLFLAG
2b260 5f 4e 4f 53 59 4e 43 20 29 3b 0a 20 20 69 66 28  _NOSYNC );.  if(
2b270 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
2b280 69 6c 6c 0a 20 20 20 26 26 20 28 28 70 50 61 67  ill.   && ((pPag
2b290 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
2b2a0 20 28 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c   (SPILLFLAG_ROLL
2b2b0 42 41 43 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f  BACK|SPILLFLAG_O
2b2c0 46 46 29 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c  FF))!=0.      ||
2b2d0 20 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50   (pPg->flags & P
2b2e0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21  GHDR_NEED_SYNC)!
2b2f0 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  =0).  ){.    ret
2b300 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2b310 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 44 69 72 74   }..  pPg->pDirt
2b320 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 61 67  y = 0;.  if( pag
2b330 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2b340 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69 74 65   ){.    /* Write
2b350 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20   a single frame 
2b360 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 74 6f  for this page to
2b370 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20   the log. */.   
2b380 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c   rc = subjournal
2b390 50 61 67 65 49 66 52 65 71 75 69 72 65 64 28 70  PageIfRequired(p
2b3a0 50 67 29 3b 20 0a 20 20 20 20 69 66 28 20 72 63  Pg); .    if( rc
2b3b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b3c0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 57       rc = pagerW
2b3d0 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72 2c  alFrames(pPager,
2b3e0 20 70 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20   pPg, 0, 0);.   
2b3f0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 0a 20   }.  }else{.  . 
2b400 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a     /* Sync the j
2b410 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72  ournal file if r
2b420 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
2b430 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  if( pPg->flags&P
2b440 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a  GHDR_NEED_SYNC .
2b450 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
2b460 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
2b470 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
2b480 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20    ){.      rc = 
2b490 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
2b4a0 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  er, 1);.    }.  
2b4b0 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
2b4c0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2b4d0 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68  e page out to th
2b4e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2b4f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
2b500 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b510 20 20 20 61 73 73 65 72 74 28 20 28 70 50 67 2d     assert( (pPg-
2b520 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
2b530 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20  D_SYNC)==0 );.  
2b540 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
2b550 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50  rite_pagelist(pP
2b560 61 67 65 72 2c 20 70 50 67 29 3b 0a 20 20 20 20  ager, pPg);.    
2b570 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b  }.  }..  /* Mark
2b580 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
2b590 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  an. */.  if( rc=
2b5a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b5b0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
2b5c0 54 52 45 53 53 20 25 64 20 70 61 67 65 20 25 64  TRESS %d page %d
2b5d0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
2b5e0 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
2b5f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  );.    sqlite3Pc
2b600 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
2b610 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  g);.  }..  retur
2b620 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
2b630 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a 2f  ager, rc); .}../
2b640 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6c 6c 20 75  *.** Flush all u
2b650 6e 72 65 66 65 72 65 6e 63 65 64 20 64 69 72 74  nreferenced dirt
2b660 79 20 70 61 67 65 73 20 74 6f 20 64 69 73 6b 2e  y pages to disk.
2b670 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2b680 61 67 65 72 46 6c 75 73 68 28 50 61 67 65 72 20  agerFlush(Pager 
2b690 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
2b6a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2b6b0 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 20 3d    PgHdr *pList =
2b6c0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69   sqlite3PcacheDi
2b6d0 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e  rtyList(pPager->
2b6e0 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 77 68 69  pPCache);..  whi
2b6f0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
2b700 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20  K && pList ){.  
2b710 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20 3d    PgHdr *pNext =
2b720 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
2b730 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e      if( pList->n
2b740 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
2b750 72 63 20 3d 20 70 61 67 65 72 53 74 72 65 73 73  rc = pagerStress
2b760 28 28 76 6f 69 64 2a 29 70 50 61 67 65 72 2c 20  ((void*)pPager, 
2b770 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pList);.    }.  
2b780 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b    pList = pNext;
2b790 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
2b7a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  c;.}../*.** Allo
2b7b0 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
2b7c0 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72 20  ize a new Pager 
2b7d0 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61  object and put a
2b7e0 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a   pointer to it.*
2b7f0 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54  * in *ppPager. T
2b800 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20  he pager should 
2b810 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72  eventually be fr
2b820 65 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 69  eed by passing i
2b830 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50  t.** to sqlite3P
2b840 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a  agerClose()..**.
2b850 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65  ** The zFilename
2b860 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
2b870 20 70 61 74 68 20 74 6f 20 74 68 65 20 64 61 74   path to the dat
2b880 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
2b890 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  en..** If zFilen
2b8a0 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  ame is NULL then
2b8b0 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65   a randomly-name
2b8c0 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  d temporary file
2b8d0 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
2b8e0 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66  nd used as the f
2b8f0 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
2b900 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  . Temporary file
2b910 73 20 61 72 65 20 62 65 20 64 65 6c 65 74 65 64  s are be deleted
2b920 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
2b930 79 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20  y when they are 
2b940 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65  closed. If zFile
2b950 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79  name is ":memory
2b960 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20  :" then .** all 
2b970 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68  information is h
2b980 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74  eld in cache. It
2b990 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65   is never writte
2b9a0 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54  n to disk. .** T
2b9b0 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
2b9c0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20  to implement an 
2b9d0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
2b9e0 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45  se..**.** The nE
2b9f0 78 74 72 61 20 70 61 72 61 6d 65 74 65 72 20 73  xtra parameter s
2ba00 70 65 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d  pecifies the num
2ba10 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
2ba20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a  space allocated.
2ba30 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61  ** along with ea
2ba40 63 68 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ch page referenc
2ba50 65 2e 20 54 68 69 73 20 73 70 61 63 65 20 69 73  e. This space is
2ba60 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68   available to th
2ba70 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68  e user.** via th
2ba80 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  e sqlite3PagerGe
2ba90 74 45 78 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a  tExtra() API..**
2baa0 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72  .** The flags ar
2bab0 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74  gument is used t
2bac0 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70 65 72  o specify proper
2bad0 74 69 65 73 20 74 68 61 74 20 61 66 66 65 63 74  ties that affect
2bae0 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f   the.** operatio
2baf0 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 20  n of the pager. 
2bb00 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73  It should be pas
2bb10 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73 65  sed some bitwise
2bb20 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20   combination.** 
2bb30 6f 66 20 74 68 65 20 50 41 47 45 52 5f 2a 20 66  of the PAGER_* f
2bb40 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lags..**.** The 
2bb50 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74  vfsFlags paramet
2bb60 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20  er is a bitmask 
2bb70 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20 66  to pass to the f
2bb80 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a  lags parameter.*
2bb90 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29  * of the xOpen()
2bba0 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73   method of the s
2bbb0 75 70 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e  upplied VFS when
2bbc0 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20   opening files. 
2bbd0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
2bbe0 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  ger object is al
2bbf0 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
2bc00 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f  specified file o
2bc10 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73  pened .** succes
2bc20 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f  sfully, SQLITE_O
2bc30 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  K is returned an
2bc40 64 20 2a 70 70 50 61 67 65 72 20 73 65 74 20 74  d *ppPager set t
2bc50 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68  o point to.** th
2bc60 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65  e new pager obje
2bc70 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ct. If an error 
2bc80 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72  occurs, *ppPager
2bc90 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a   is set to NULL.
2bca0 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64  ** and error cod
2bcb0 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  e returned. This
2bcc0 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65   function may re
2bcd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2bce0 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c  M.** (sqlite3Mal
2bcf0 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20 74 6f  loc() is used to
2bd00 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
2bd10 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  ), SQLITE_CANTOP
2bd20 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75  EN or .** variou
2bd30 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20  s SQLITE_IO_XXX 
2bd40 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  errors..*/.int s
2bd50 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
2bd60 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
2bd70 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54  pVfs,       /* T
2bd80 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20  he virtual file 
2bd90 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f  system to use */
2bda0 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67  .  Pager **ppPag
2bdb0 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  er,         /* O
2bdc0 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50  UT: Return the P
2bdd0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68  ager structure h
2bde0 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
2bdf0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
2be00 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2be10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
2be20 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
2be30 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  nExtra,         
2be40 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79       /* Extra by
2be50 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61  tes append to ea
2be60 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
2be70 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
2be80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2be90 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c  /* flags control
2bea0 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a  ling this file *
2beb0 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
2bec0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2bed0 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  flags passed thr
2bee0 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
2bef0 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20  vfs.xOpen() */. 
2bf00 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29   void (*xReinit)
2bf10 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e  (DbPage*) /* Fun
2bf20 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69  ction to reiniti
2bf30 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29  alize pages */.)
2bf40 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20  {.  u8 *pPtr;.  
2bf50 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
2bf60 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  0;       /* Page
2bf70 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f  r object to allo
2bf80 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  cate and return 
2bf90 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
2bfa0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a  LITE_OK;      /*
2bfb0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2bfc0 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d    int tempFile =
2bfd0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
2bfe0 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65  ue for temp file
2bff0 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f  s (incl. in-memo
2c000 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69  ry files) */.  i
2c010 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20  nt memDb = 0;   
2c020 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2c030 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  if this is an in
2c040 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
2c050 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d    int readOnly =
2c060 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
2c070 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
2c080 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a  read-only file *
2c090 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46  /.  int journalF
2c0a0 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20  ileSize;     /* 
2c0b0 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74  Bytes to allocat
2c0c0 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e  e for each journ
2c0d0 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20  al fd */.  char 
2c0e0 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20  *zPathname = 0; 
2c0f0 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68      /* Full path
2c100 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c   to database fil
2c110 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68  e */.  int nPath
2c120 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  name = 0;       
2c130 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
2c140 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20  es in zPathname 
2c150 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72  */.  int useJour
2c160 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50  nal = (flags & P
2c170 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  AGER_OMIT_JOURNA
2c180 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20  L)==0; /* False 
2c190 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20  to omit journal 
2c1a0 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53  */.  int pcacheS
2c1b0 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ize = sqlite3Pca
2c1c0 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20  cheSize();      
2c1d0 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c   /* Bytes to all
2c1e0 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63 68 65  ocate for PCache
2c1f0 20 2a 2f 0a 20 20 75 33 32 20 73 7a 50 61 67 65   */.  u32 szPage
2c200 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45  Dflt = SQLITE_DE
2c210 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
2c220 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67    /* Default pag
2c230 65 20 73 69 7a 65 20 2a 2f 0a 20 20 63 6f 6e 73  e size */.  cons
2c240 74 20 63 68 61 72 20 2a 7a 55 72 69 20 3d 20 30  t char *zUri = 0
2c250 3b 20 20 20 20 2f 2a 20 55 52 49 20 61 72 67 73  ;    /* URI args
2c260 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e   to copy */.  in
2c270 74 20 6e 55 72 69 20 3d 20 30 3b 20 20 20 20 20  t nUri = 0;     
2c280 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2c290 20 6f 66 20 62 79 74 65 73 20 6f 66 20 55 52 49   of bytes of URI
2c2a0 20 61 72 67 73 20 61 74 20 2a 7a 55 72 69 20 2a   args at *zUri *
2c2b0 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  /..  /* Figure o
2c2c0 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63  ut how much spac
2c2d0 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  e is required fo
2c2e0 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66  r each journal f
2c2f0 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20  ile-handle.  ** 
2c300 28 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f  (there are two o
2c310 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e  f them, the main
2c320 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
2c330 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54   sub-journal). T
2c340 68 69 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20  his.  ** is the 
2c350 6d 61 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65  maximum space re
2c360 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 69 6e  quired for an in
2c370 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
2c380 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20 2a  file handle .  *
2c390 2a 20 61 6e 64 20 61 20 72 65 67 75 6c 61 72 20  * and a regular 
2c3a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e  journal file-han
2c3b0 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61  dle. Note that a
2c3c0 20 22 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61   "regular journa
2c3d0 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d  l-handle".  ** m
2c3e0 61 79 20 62 65 20 61 20 77 72 61 70 70 65 72 20  ay be a wrapper 
2c3f0 63 61 70 61 62 6c 65 20 6f 66 20 63 61 63 68 69  capable of cachi
2c400 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 6f 72  ng the first por
2c410 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72  tion of the jour
2c420 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e  nal.  ** file in
2c430 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c 65   memory to imple
2c440 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d 69 63 2d  ment the atomic-
2c450 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
2c460 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20 73 6f  on (see .  ** so
2c470 75 72 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e 61  urce file journa
2c480 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  l.c)..  */.  if(
2c490 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53   sqlite3JournalS
2c4a0 69 7a 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65  ize(pVfs)>sqlite
2c4b0 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  3MemJournalSize(
2c4c0 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  ) ){.    journal
2c4d0 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44  FileSize = ROUND
2c4e0 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  8(sqlite3Journal
2c4f0 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 20 20 7d  Size(pVfs));.  }
2c500 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61  else{.    journa
2c510 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e  lFileSize = ROUN
2c520 44 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75  D8(sqlite3MemJou
2c530 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20 7d  rnalSize());.  }
2c540 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f  ..  /* Set the o
2c550 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 74  utput variable t
2c560 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61  o NULL in case a
2c570 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  n error occurs. 
2c580 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  */.  *ppPager = 
2c590 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0;..#ifndef SQLI
2c5a0 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
2c5b0 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 50  .  if( flags & P
2c5c0 41 47 45 52 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  AGER_MEMORY ){. 
2c5d0 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20     memDb = 1;.  
2c5e0 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
2c5f0 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
2c600 29 7b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61  ){.      zPathna
2c610 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
2c620 72 44 75 70 28 30 2c 20 7a 46 69 6c 65 6e 61 6d  rDup(0, zFilenam
2c630 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  e);.      if( zP
2c640 61 74 68 6e 61 6d 65 3d 3d 30 20 20 29 20 72 65  athname==0  ) re
2c650 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2c660 4d 3b 0a 20 20 20 20 20 20 6e 50 61 74 68 6e 61  M;.      nPathna
2c670 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
2c680 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b  en30(zPathname);
2c690 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  .      zFilename
2c6a0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
2c6b0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d  #endif..  /* Com
2c6c0 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74  pute and store t
2c6d0 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
2c6e0 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64   in an allocated
2c6f0 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a   buffer pointed.
2c700 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68    ** to by zPath
2c710 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61  name, length nPa
2c720 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74  thname. Or, if t
2c730 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61  his is a tempora
2c740 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65  ry file,.  ** le
2c750 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61  ave both nPathna
2c760 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65  me and zPathname
2c770 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a   set to 0..  */.
2c780 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
2c790 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
2c7a0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
2c7b0 72 20 2a 7a 3b 0a 20 20 20 20 6e 50 61 74 68 6e  r *z;.    nPathn
2c7c0 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  ame = pVfs->mxPa
2c7d0 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50  thname+1;.    zP
2c7e0 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
2c7f0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20  3DbMallocRaw(0, 
2c800 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20  nPathname*2);.  
2c810 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d    if( zPathname=
2c820 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
2c830 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2c840 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50 61 74 68  .    }.    zPath
2c850 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20  name[0] = 0; /* 
2c860 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74 69 61  Make sure initia
2c870 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20 46 75  lized even if Fu
2c880 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66 61 69  llPathname() fai
2c890 6c 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  ls */.    rc = s
2c8a0 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
2c8b0 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
2c8c0 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c  name, nPathname,
2c8d0 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
2c8e0 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   nPathname = sql
2c8f0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
2c900 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d  thname);.    z =
2c910 20 7a 55 72 69 20 3d 20 26 7a 46 69 6c 65 6e 61   zUri = &zFilena
2c920 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  me[sqlite3Strlen
2c930 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 5d  30(zFilename)+1]
2c940 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20  ;.    while( *z 
2c950 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71  ){.      z += sq
2c960 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
2c970 2b 31 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73  +1;.      z += s
2c980 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2c990 29 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  )+1;.    }.    n
2c9a0 55 72 69 20 3d 20 28 69 6e 74 29 28 26 7a 5b 31  Uri = (int)(&z[1
2c9b0 5d 20 2d 20 7a 55 72 69 29 3b 0a 20 20 20 20 61  ] - zUri);.    a
2c9c0 73 73 65 72 74 28 20 6e 55 72 69 3e 3d 30 20 29  ssert( nUri>=0 )
2c9d0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2c9e0 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68  LITE_OK && nPath
2c9f0 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50  name+8>pVfs->mxP
2ca00 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
2ca10 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
2ca20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68  is taken when th
2ca30 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20 72  e journal path r
2ca40 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20  equired by.     
2ca50 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
2ca60 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 77 69   being opened wi
2ca70 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20  ll be more than 
2ca80 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2ca90 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20  .      ** bytes 
2caa0 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20  in length. This 
2cab0 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
2cac0 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65  se cannot be ope
2cad0 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73  ned,.      ** as
2cae0 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   it will not be 
2caf0 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e  possible to open
2cb00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2cb10 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20 20 20  e or even.      
2cb20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68  ** check for a h
2cb30 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  ot-journal befor
2cb40 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20 20 20  e reading..     
2cb50 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
2cb60 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
2cb70 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KPT;.    }.    i
2cb80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2cb90 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2cba0 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68  3DbFree(0, zPath
2cbb0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  name);.      ret
2cbc0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2cbd0 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
2cbe0 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20   memory for the 
2cbf0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  Pager structure,
2cc00 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20   PCache object, 
2cc10 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66  the.  ** three f
2cc20 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c  ile descriptors,
2cc30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2cc40 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
2cc50 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
2cc60 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79  le name. The lay
2cc70 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73  out in memory is
2cc80 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
2cc90 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72  *.  **     Pager
2cca0 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
2ccb0 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65             (size
2ccc0 6f 66 28 50 61 67 65 72 29 20 62 79 74 65 73 29  of(Pager) bytes)
2ccd0 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65  .  **     PCache
2cce0 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
2ccf0 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
2cd00 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 20 62  e3PcacheSize() b
2cd10 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44  ytes).  **     D
2cd20 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e  atabase file han
2cd30 64 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 28  dle            (
2cd40 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62  pVfs->szOsFile b
2cd50 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53  ytes).  **     S
2cd60 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
2cd70 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28  handle         (
2cd80 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2cd90 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2cda0 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  Main journal fil
2cdb0 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
2cdc0 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
2cdd0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2cde0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   Database file n
2cdf0 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
2ce00 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79   (nPathname+1 by
2ce10 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f  tes).  **     Jo
2ce20 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
2ce30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
2ce40 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74  Pathname+8+1 byt
2ce50 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20  es).  */.  pPtr 
2ce60 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d  = (u8 *)sqlite3M
2ce70 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52  allocZero(.    R
2ce80 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50  OUND8(sizeof(*pP
2ce90 61 67 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a  ager)) +      /*
2cea0 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
2ceb0 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70   */.    ROUND8(p
2cec0 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20  cacheSize) +    
2ced0 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65         /* PCache
2cee0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52   object */.    R
2cef0 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73  OUND8(pVfs->szOs
2cf00 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a  File) +       /*
2cf10 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c   The main db fil
2cf20 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  e */.    journal
2cf30 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20  FileSize * 2 +  
2cf40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2cf50 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  wo journal files
2cf60 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61   */ .    nPathna
2cf70 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 20 2b 20  me + 1 + nUri + 
2cf80 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65          /* zFile
2cf90 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74  name */.    nPat
2cfa0 68 6e 61 6d 65 20 2b 20 38 20 2b 20 32 20 20 20  hname + 8 + 2   
2cfb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a             /* zJ
2cfc0 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
2cfd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
2cfe0 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d  L.    + nPathnam
2cff0 65 20 2b 20 34 20 2b 20 32 20 20 20 20 20 20 20  e + 4 + 2       
2d000 20 20 20 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a       /* zWal */.
2d010 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 61 73  #endif.  );.  as
2d020 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
2d030 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54  _ALIGNMENT(SQLIT
2d040 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75  E_INT_TO_PTR(jou
2d050 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29  rnalFileSize)) )
2d060 3b 0a 20 20 69 66 28 20 21 70 50 74 72 20 29 7b  ;.  if( !pPtr ){
2d070 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
2d080 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29  ee(0, zPathname)
2d090 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2d0a0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
2d0b0 20 70 50 61 67 65 72 20 3d 20 20 20 20 20 20 20   pPager =       
2d0c0 20 20 20 20 20 20 20 28 50 61 67 65 72 2a 29 28         (Pager*)(
2d0d0 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  pPtr);.  pPager-
2d0e0 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20 28 50  >pPCache =    (P
2d0f0 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d 20  Cache*)(pPtr += 
2d100 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70  ROUND8(sizeof(*p
2d110 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61 67  Pager)));.  pPag
2d120 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c 69  er->fd =   (sqli
2d130 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
2d140 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65  += ROUND8(pcache
2d150 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65 72  Size));.  pPager
2d160 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65  ->sjfd = (sqlite
2d170 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d  3_file*)(pPtr +=
2d180 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a   ROUND8(pVfs->sz
2d190 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61 67  OsFile));.  pPag
2d1a0 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69  er->jfd =  (sqli
2d1b0 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
2d1c0 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  += journalFileSi
2d1d0 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  ze);.  pPager->z
2d1e0 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28 63  Filename =    (c
2d1f0 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f  har*)(pPtr += jo
2d200 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a  urnalFileSize);.
2d210 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
2d220 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
2d230 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a  Pager->jfd) );..
2d240 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
2d250 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65   Pager.zFilename
2d260 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72   and Pager.zJour
2d270 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20  nal buffers, if 
2d280 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69  required. */.  i
2d290 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a  f( zPathname ){.
2d2a0 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 61 74      assert( nPat
2d2b0 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20 20 20 70  hname>0 );.    p
2d2c0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20  Pager->zJournal 
2d2d0 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72  =   (char*)(pPtr
2d2e0 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20   += nPathname + 
2d2f0 31 20 2b 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d  1 + nUri);.    m
2d300 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46  emcpy(pPager->zF
2d310 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  ilename, zPathna
2d320 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a  me, nPathname);.
2d330 20 20 20 20 69 66 28 20 6e 55 72 69 20 29 20 6d      if( nUri ) m
2d340 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  emcpy(&pPager->z
2d350 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61  Filename[nPathna
2d360 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e 55 72  me+1], zUri, nUr
2d370 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  i);.    memcpy(p
2d380 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
2d390 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
2d3a0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63  hname);.    memc
2d3b0 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  py(&pPager->zJou
2d3c0 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c  rnal[nPathname],
2d3d0 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30 30 22 2c   "-journal\000",
2d3e0 20 38 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74   8+2);.    sqlit
2d3f0 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 50  e3FileSuffix3(pP
2d400 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2d410 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2d420 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  l);.#ifndef SQLI
2d430 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
2d440 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d 20 26  pPager->zWal = &
2d450 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2d460 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b  [nPathname+8+1];
2d470 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
2d480 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74 68 6e  er->zWal, zPathn
2d490 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b  ame, nPathname);
2d4a0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61  .    memcpy(&pPa
2d4b0 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e  ger->zWal[nPathn
2d4c0 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30 30 30 22  ame], "-wal\000"
2d4d0 2c 20 34 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69  , 4+1);.    sqli
2d4e0 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70  te3FileSuffix3(p
2d4f0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2d500 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 29 3b  , pPager->zWal);
2d510 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
2d520 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61  te3DbFree(0, zPa
2d530 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70  thname);.  }.  p
2d540 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56  Pager->pVfs = pV
2d550 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66  fs;.  pPager->vf
2d560 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67  sFlags = vfsFlag
2d570 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  s;..  /* Open th
2d580 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20  e pager file..  
2d590 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
2d5a0 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
2d5b0 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f  0] ){.    int fo
2d5c0 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ut = 0;         
2d5d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46             /* VF
2d5e0 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64  S flags returned
2d5f0 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20   by xOpen() */. 
2d600 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2d610 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
2d620 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  er->zFilename, p
2d630 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c  Pager->fd, vfsFl
2d640 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  ags, &fout);.   
2d650 20 61 73 73 65 72 74 28 20 21 6d 65 6d 44 62 20   assert( !memDb 
2d660 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20  );.    readOnly 
2d670 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f  = (fout&SQLITE_O
2d680 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a  PEN_READONLY);..
2d690 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
2d6a0 6c 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  le was successfu
2d6b0 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72  lly opened for r
2d6c0 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
2d6d0 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20  ,.    ** choose 
2d6e0 61 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  a default page s
2d6f0 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20 68  ize in case we h
2d700 61 76 65 20 74 6f 20 63 72 65 61 74 65 20 74 68  ave to create th
2d710 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
2d720 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61  e file. The defa
2d730 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 73  ult page size is
2d740 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a   the maximum of:
2d750 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2d760 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55    + SQLITE_DEFAU
2d770 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20  LT_PAGE_SIZE,.  
2d780 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61    **    + The va
2d790 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
2d7a0 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53  sqlite3OsSectorS
2d7b0 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20 20 20  ize().    **    
2d7c0 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20 70 61  + The largest pa
2d7d0 67 65 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e  ge size that can
2d7e0 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
2d7f0 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20  ically..    */. 
2d800 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2d810 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
2d820 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
2d830 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
2d840 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
2d850 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72  d);.      if( !r
2d860 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
2d870 20 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65     setSectorSize
2d880 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
2d890 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
2d8a0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2d8b0 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  E<=SQLITE_MAX_DE
2d8c0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29  FAULT_PAGE_SIZE)
2d8d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a  ;.        if( sz
2d8e0 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72 2d  PageDflt<pPager-
2d8f0 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20  >sectorSize ){. 
2d900 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61           if( pPa
2d910 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e  ger->sectorSize>
2d920 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2d930 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a  LT_PAGE_SIZE ){.
2d940 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61              szPa
2d950 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f  geDflt = SQLITE_
2d960 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
2d970 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 20  _SIZE;.         
2d980 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2d990 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
2d9a0 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e 73 65   (u32)pPager->se
2d9b0 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  ctorSize;.      
2d9c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2d9d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2d9e0 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
2d9f0 45 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  E.        {.    
2da00 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
2da10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
2da20 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
2da30 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
2da40 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
2da50 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
2da60 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33  ATOMIC64K==(6553
2da70 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20  6>>8));.        
2da80 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
2da90 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
2daa0 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20  _SIZE<=65536);. 
2dab0 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d           for(ii=
2dac0 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d  szPageDflt; ii<=
2dad0 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
2dae0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69  LT_PAGE_SIZE; ii
2daf0 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20  =ii*2){.        
2db00 20 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c      if( iDc&(SQL
2db10 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
2db20 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20  |(ii>>8)) ){.   
2db30 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67             szPag
2db40 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20  eDflt = ii;.    
2db50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2db60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2db70 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20  #endif.      }. 
2db80 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c       pPager->noL
2db90 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 75 72  ock = sqlite3_ur
2dba0 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65 6e  i_boolean(zFilen
2dbb0 61 6d 65 2c 20 22 6e 6f 6c 6f 63 6b 22 2c 20 30  ame, "nolock", 0
2dbc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 44  );.      if( (iD
2dbd0 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  c & SQLITE_IOCAP
2dbe0 5f 49 4d 4d 55 54 41 42 4c 45 29 21 3d 30 0a 20  _IMMUTABLE)!=0. 
2dbf0 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
2dc00 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69  _uri_boolean(zFi
2dc10 6c 65 6e 61 6d 65 2c 20 22 69 6d 6d 75 74 61 62  lename, "immutab
2dc20 6c 65 22 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  le", 0) ){.     
2dc30 20 20 20 20 20 76 66 73 46 6c 61 67 73 20 7c 3d       vfsFlags |=
2dc40 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
2dc50 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 20  DONLY;.         
2dc60 20 67 6f 74 6f 20 61 63 74 5f 6c 69 6b 65 5f 74   goto act_like_t
2dc70 65 6d 70 5f 66 69 6c 65 3b 0a 20 20 20 20 20 20  emp_file;.      
2dc80 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
2dc90 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d  .    /* If a tem
2dca0 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 72  porary file is r
2dcb0 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20  equested, it is 
2dcc0 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64  not opened immed
2dcd0 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49  iately..    ** I
2dce0 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20 61  n this case we a
2dcf0 63 63 65 70 74 20 74 68 65 20 64 65 66 61 75 6c  ccept the defaul
2dd00 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20  t page size and 
2dd10 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20  delay actually. 
2dd20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68     ** opening th
2dd30 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65  e file until the
2dd40 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f   first call to O
2dd50 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a  sWrite()..    **
2dd60 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61  .    ** This bra
2dd70 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75 6e 20  nch is also run 
2dd80 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
2dd90 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20 69 6e   database. An in
2dda0 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64  -memory.    ** d
2ddb0 61 74 61 62 61 73 65 20 69 73 20 74 68 65 20 73  atabase is the s
2ddc0 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d 66 69  ame as a temp-fi
2ddd0 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76 65 72  le that is never
2dde0 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a   written out to.
2ddf0 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20      ** disk and 
2de00 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  uses an in-memor
2de10 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  y rollback journ
2de20 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  al..    **.    *
2de30 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 61 6c  * This branch al
2de40 73 6f 20 72 75 6e 73 20 66 6f 72 20 66 69 6c 65  so runs for file
2de50 73 20 6d 61 72 6b 65 64 20 61 73 20 69 6d 6d 75  s marked as immu
2de60 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 20 0a 61  table..    */ .a
2de70 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c  ct_like_temp_fil
2de80 65 3a 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20  e:.    tempFile 
2de90 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
2dea0 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
2deb0 52 45 41 44 45 52 3b 20 20 20 20 20 2f 2a 20 50  READER;     /* P
2dec0 72 65 74 65 6e 64 20 77 65 20 61 6c 72 65 61 64  retend we alread
2ded0 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 20 2a 2f  y have a lock */
2dee0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f  .    pPager->eLo
2def0 63 6b 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c  ck = EXCLUSIVE_L
2df00 4f 43 4b 3b 20 20 20 20 2f 2a 20 50 72 65 74 65  OCK;    /* Prete
2df10 6e 64 20 77 65 20 61 72 65 20 69 6e 20 45 58 43  nd we are in EXC
2df20 4c 55 53 49 56 45 20 6d 6f 64 65 20 2a 2f 0a 20  LUSIVE mode */. 
2df30 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63     pPager->noLoc
2df40 6b 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  k = 1;          
2df50 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 6c        /* Do no l
2df60 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 72 65  ocking */.    re
2df70 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c 61  adOnly = (vfsFla
2df80 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  gs&SQLITE_OPEN_R
2df90 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a 20  EADONLY);.  }.. 
2dfa0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
2dfb0 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72 53  g call to PagerS
2dfc0 65 74 50 61 67 65 73 69 7a 65 28 29 20 73 65 72  etPagesize() ser
2dfd0 76 65 73 20 74 6f 20 73 65 74 20 74 68 65 20 76  ves to set the v
2dfe0 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61  alue of .  ** Pa
2dff0 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e 64  ger.pageSize and
2e000 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65   to allocate the
2e010 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
2e020 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20   buffer..  */.  
2e030 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2e040 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
2e050 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d   pPager->memDb==
2e060 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 );.    rc = sq
2e070 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
2e080 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 73  esize(pPager, &s
2e090 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b 0a  zPageDflt, -1);.
2e0a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
2e0b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
2e0c0 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
2e0d0 69 7a 65 20 74 68 65 20 50 43 61 63 68 65 20 6f  ize the PCache o
2e0e0 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20  bject. */.  if( 
2e0f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2e100 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 78  .    assert( nEx
2e110 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 20 20  tra<1000 );.    
2e120 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28  nExtra = ROUND8(
2e130 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 72 63 20  nExtra);.    rc 
2e140 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f  = sqlite3PcacheO
2e150 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20  pen(szPageDflt, 
2e160 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a  nExtra, !memDb,.
2e170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e180 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61         !memDb?pa
2e190 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f  gerStress:0, (vo
2e1a0 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61  id *)pPager, pPa
2e1b0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
2e1c0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65   }..  /* If an e
2e1d0 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 61 62  rror occurred ab
2e1e0 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 20 50  ove, free the  P
2e1f0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
2e200 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  nd close the fil
2e210 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  e..  */.  if( rc
2e220 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2e230 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
2e240 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
2e250 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
2e260 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  ee(pPager->pTmpS
2e270 70 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  pace);.    sqlit
2e280 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
2e290 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2e2a0 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43    }..  PAGERTRAC
2e2b0 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e  E(("OPEN %d %s\n
2e2c0 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ", FILEHANDLEID(
2e2d0 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61  pPager->fd), pPa
2e2e0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29  ger->zFilename))
2e2f0 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50  ;.  IOTRACE(("OP
2e300 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61  EN %p %s\n", pPa
2e310 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  ger, pPager->zFi
2e320 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67  lename))..  pPag
2e330 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  er->useJournal =
2e340 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b   (u8)useJournal;
2e350 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2e360 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20  mtOpen = 0; */. 
2e370 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
2e380 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  InUse = 0; */.  
2e390 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  /* pPager->nRef 
2e3a0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2e3b0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
2e3c0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2e3d0 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30  r->stmtJSize = 0
2e3e0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2e3f0 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a  ->nPage = 0; */.
2e400 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
2e410 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41   = SQLITE_MAX_PA
2e420 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70  GE_COUNT;.  /* p
2e430 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
2e440 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a  AGER_UNLOCK; */.
2e450 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72    /* pPager->err
2e460 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Mask = 0; */.  p
2e470 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2e480 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a  = (u8)tempFile;.
2e490 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69    assert( tempFi
2e4a0 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
2e4b0 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20  GMODE_NORMAL .  
2e4c0 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46          || tempF
2e4d0 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
2e4e0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
2e4f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
2e500 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2e510 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a  EXCLUSIVE==1 );.
2e520 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
2e530 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65  iveMode = (u8)te
2e540 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65  mpFile; .  pPage
2e550 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
2e560 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
2e570 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d  pFile;.  pPager-
2e580 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d  >memDb = (u8)mem
2e590 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65  Db;.  pPager->re
2e5a0 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61  adOnly = (u8)rea
2e5b0 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74 28  dOnly;.  assert(
2e5c0 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70   useJournal || p
2e5d0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2e5e0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  );.  pPager->noS
2e5f0 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  ync = pPager->te
2e600 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 50  mpFile;.  if( pP
2e610 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
2e620 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2e630 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30 20  er->fullSync==0 
2e640 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2e650 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
2e660 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
2e670 74 28 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79  t( pPager->walSy
2e680 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20  ncFlags==0 );.  
2e690 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2e6a0 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 3d  ->ckptSyncFlags=
2e6b0 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  =0 );.  }else{. 
2e6c0 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53     pPager->fullS
2e6d0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ync = 1;.    pPa
2e6e0 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
2e6f0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
2e700 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  MAL;.    pPager-
2e710 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20  >walSyncFlags = 
2e720 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
2e730 41 4c 20 7c 20 57 41 4c 5f 53 59 4e 43 5f 54 52  AL | WAL_SYNC_TR
2e740 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20 20 20  ANSACTIONS;.    
2e750 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
2e760 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
2e770 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a  YNC_NORMAL;.  }.
2e780 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
2e790 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  rst = 0; */.  /*
2e7a0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
2e7b0 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20  ynced = 0; */.  
2e7c0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  /* pPager->pLast
2e7d0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
2e7e0 72 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36  r->nExtra = (u16
2e7f0 29 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65  )nExtra;.  pPage
2e800 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
2e810 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  mit = SQLITE_DEF
2e820 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a  AULT_JOURNAL_SIZ
2e830 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72  E_LIMIT;.  asser
2e840 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
2e850 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c  ->fd) || tempFil
2e860 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72  e );.  setSector
2e870 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
2e880 69 66 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20  if( !useJournal 
2e890 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
2e8a0 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
2e8b0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2e8c0 46 46 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  FF;.  }else if( 
2e8d0 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61  memDb ){.    pPa
2e8e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2e8f0 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
2e900 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d  MODE_MEMORY;.  }
2e910 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42  .  /* pPager->xB
2e920 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20  usyHandler = 0; 
2e930 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2e940 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
2e950 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
2e960 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52  ->xReiniter = xR
2e970 65 69 6e 69 74 3b 0a 20 20 2f 2a 20 6d 65 6d 73  einit;.  /* mems
2e980 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
2e990 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
2e9a0 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a  er->aHash)); */.
2e9b0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 7a 4d    /* pPager->szM
2e9c0 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  map = SQLITE_DEF
2e9d0 41 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45 20 2f  AULT_MMAP_SIZE /
2e9e0 2f 20 77 69 6c 6c 20 62 65 20 73 65 74 20 62 79  / will be set by
2e9f0 20 62 74 72 65 65 2e 63 20 2a 2f 0a 0a 20 20 2a   btree.c */..  *
2ea00 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  ppPager = pPager
2ea10 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2ea20 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 20 56 65 72  E_OK;.}.../* Ver
2ea30 69 66 79 20 74 68 61 74 20 74 68 65 20 64 61 74  ify that the dat
2ea40 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e  abase file has n
2ea50 6f 74 20 62 65 20 64 65 6c 65 74 65 64 20 6f 72  ot be deleted or
2ea60 20 72 65 6e 61 6d 65 64 20 6f 75 74 20 66 72 6f   renamed out fro
2ea70 6d 0a 2a 2a 20 75 6e 64 65 72 20 74 68 65 20 70  m.** under the p
2ea80 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ager.  Return SQ
2ea90 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65 20 64  LITE_OK if the d
2eaa0 61 74 61 62 61 73 65 20 69 73 20 73 74 69 6c 6c  atabase is still
2eab0 20 77 65 72 65 20 69 74 20 6f 75 67 68 74 0a 2a   were it ought.*
2eac0 2a 20 74 6f 20 62 65 20 6f 6e 20 64 69 73 6b 2e  * to be on disk.
2ead0 20 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72    Return non-zer
2eae0 6f 20 28 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  o (SQLITE_READON
2eaf0 4c 59 5f 44 42 4d 4f 56 45 44 20 6f 72 20 73 6f  LY_DBMOVED or so
2eb00 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a  me other error.*
2eb10 2a 20 63 6f 64 65 20 66 72 6f 6d 20 73 71 6c 69  * code from sqli
2eb20 74 65 33 4f 73 41 63 63 65 73 73 28 29 29 20 69  te3OsAccess()) i
2eb30 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
2eb40 61 73 20 67 6f 6e 65 20 6d 69 73 73 69 6e 67 2e  as gone missing.
2eb50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
2eb60 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65 64  atabaseIsUnmoved
2eb70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2eb80 0a 20 20 69 6e 74 20 62 48 61 73 4d 6f 76 65 64  .  int bHasMoved
2eb90 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
2eba0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  .  if( pPager->t
2ebb0 65 6d 70 46 69 6c 65 20 29 20 72 65 74 75 72 6e  empFile ) return
2ebc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
2ebd0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
2ebe0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
2ebf0 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
2ec00 28 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  ( pPager->zFilen
2ec10 61 6d 65 20 26 26 20 70 50 61 67 65 72 2d 3e 7a  ame && pPager->z
2ec20 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 3b 0a 20  Filename[0] );. 
2ec30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
2ec40 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65  ileControl(pPage
2ec50 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43  r->fd, SQLITE_FC
2ec60 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44 2c 20 26  NTL_HAS_MOVED, &
2ec70 62 48 61 73 4d 6f 76 65 64 29 3b 0a 20 20 69 66  bHasMoved);.  if
2ec80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54  ( rc==SQLITE_NOT
2ec90 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 2f 2a 20  FOUND ){.    /* 
2eca0 49 66 20 74 68 65 20 48 41 53 5f 4d 4f 56 45 44  If the HAS_MOVED
2ecb0 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 69 73   file-control is
2ecc0 20 75 6e 69 6d 70 6c 65 6d 65 6e 74 65 64 2c 20   unimplemented, 
2ecd0 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
2ece0 66 69 6c 65 0a 20 20 20 20 2a 2a 20 68 61 73 20  file.    ** has 
2ecf0 6e 6f 74 20 62 65 65 6e 20 6d 6f 76 65 64 2e 20  not been moved. 
2ed00 20 54 68 61 74 20 69 73 20 74 68 65 20 68 69 73   That is the his
2ed10 74 6f 72 69 63 61 6c 20 62 65 68 61 76 69 6f 72  torical behavior
2ed20 20 6f 66 20 53 51 4c 69 74 65 3a 20 70 72 69 6f   of SQLite: prio
2ed30 72 20 74 6f 0a 20 20 20 20 2a 2a 20 76 65 72 73  r to.    ** vers
2ed40 69 6f 6e 20 33 2e 38 2e 33 2c 20 69 74 20 6e 65  ion 3.8.3, it ne
2ed50 76 65 72 20 63 68 65 63 6b 65 64 20 2a 2f 0a 20  ver checked */. 
2ed60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2ed70 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72  K;.  }else if( r
2ed80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2ed90 62 48 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20  bHasMoved ){.   
2eda0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
2edb0 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 3b 0a 20  DONLY_DBMOVED;. 
2edc0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2edd0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
2ede0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2edf0 64 20 61 66 74 65 72 20 74 72 61 6e 73 69 74 69  d after transiti
2ee00 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52  oning from PAGER
2ee10 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41  _UNLOCK to.** PA
2ee20 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65  GER_SHARED state
2ee30 2e 20 49 74 20 74 65 73 74 73 20 69 66 20 74 68  . It tests if th
2ee40 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75  ere is a hot jou
2ee50 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a  rnal present in.
2ee60 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
2ee70 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  em for the given
2ee80 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f   pager. A hot jo
2ee90 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61  urnal is one tha
2eea0 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62  t .** needs to b
2eeb0 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41  e played back. A
2eec0 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73  ccording to this
2eed0 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74   function, a hot
2eee0 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65  -journal.** file
2eef0 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20 66   exists if the f
2ef00 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69  ollowing criteri
2ef10 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a  a are met:.**.**
2ef20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c     * The journal
2ef30 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20   file exists in 
2ef40 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c  the file system,
2ef50 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70   and.**   * No p
2ef60 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52  rocess holds a R
2ef70 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74  ESERVED or great
2ef80 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  er lock on the d
2ef90 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e  atabase file, an
2efa0 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74  d.**   * The dat
2efb0 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c  abase file itsel
2efc0 66 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  f is greater tha
2efd0 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a  n 0 bytes in siz
2efe0 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68  e, and.**   * Th
2eff0 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
2f000 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f010 20 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e   exists and is n
2f020 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49  ot 0x00..**.** I
2f030 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  f the current si
2f040 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
2f050 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74  se file is 0 but
2f060 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a   a journal file.
2f070 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20  ** exists, that 
2f080 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f  is probably an o
2f090 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20  ld journal left 
2f0a0 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f  over from a prio
2f0b0 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69  r.** database wi
2f0c0 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
2f0d0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
2f0e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2f0f0 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74  is.** just delet
2f100 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74  ed using OsDelet
2f110 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20 73  e, *pExists is s
2f120 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49  et to 0 and SQLI
2f130 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
2f140 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rned..**.** This
2f150 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
2f160 74 20 63 68 65 63 6b 20 69 66 20 74 68 65 72 65  t check if there
2f170 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   is a master jou
2f180 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a  rnal filename.**
2f190 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
2f1a0 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  he file. If ther
2f1b0 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d  e is, and that m
2f1c0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
2f1d0 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  le.** does not e
2f1e0 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a  xist, then the j
2f1f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
2f200 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49  ot really hot. I
2f210 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74  n this.** case t
2f220 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
2f230 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d   return a false-
2f240 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20 70 61  positive. The pa
2f250 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a  ger_playback().*
2f260 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  * routine will d
2f270 69 73 63 6f 76 65 72 20 74 68 61 74 20 74 68 65  iscover that the
2f280 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2f290 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20   not really hot 
2f2a0 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  and .** will not
2f2b0 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a   roll it back. .
2f2c0 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a  **.** If a hot-j
2f2d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66  ournal file is f
2f2e0 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a  ound to exist, *
2f2f0 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74  pExists is set t
2f300 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49  o 1 and .** SQLI
2f310 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
2f320 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  If no hot-journa
2f330 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e  l file is presen
2f340 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a  t, *pExists is.*
2f350 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53  * set to 0 and S
2f360 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
2f370 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
2f380 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
2f390 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65  rying.** to dete
2f3a0 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
2f3b0 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   not a hot-journ
2f3c0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
2f3d0 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20  the IO error.** 
2f3e0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2f3f0 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
2f400 66 20 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e  f *pExists is un
2f410 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
2f420 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75  ic int hasHotJou
2f430 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
2f440 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73  er, int *pExists
2f450 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
2f460 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
2f470 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
2f480 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2f490 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  OK;           /*
2f4a0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2f4b0 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d 20 31    int exists = 1
2f4c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f4d0 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75  /* True if a jou
2f4e0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65  rnal file is pre
2f4f0 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 72  sent */.  int jr
2f500 6e 6c 4f 70 65 6e 20 3d 20 21 21 69 73 4f 70 65  nlOpen = !!isOpe
2f510 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  n(pPager->jfd);.
2f520 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2f530 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
2f540 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
2f550 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
2f560 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2f570 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
2f580 5f 4f 50 45 4e 20 29 3b 0a 0a 20 20 61 73 73 65  _OPEN );..  asse
2f590 72 74 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20  rt( jrnlOpen==0 
2f5a0 7c 7c 20 28 20 73 71 6c 69 74 65 33 4f 73 44 65  || ( sqlite3OsDe
2f5b0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
2f5c0 69 63 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ics(pPager->jfd)
2f5d0 20 26 0a 20 20 20 20 53 51 4c 49 54 45 5f 49 4f   &.    SQLITE_IO
2f5e0 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f  CAP_UNDELETABLE_
2f5f0 57 48 45 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a  WHEN_OPEN.  ));.
2f600 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b  .  *pExists = 0;
2f610 0a 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e  .  if( !jrnlOpen
2f620 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
2f630 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
2f640 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
2f650 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  nal, SQLITE_ACCE
2f660 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73  SS_EXISTS, &exis
2f670 74 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ts);.  }.  if( r
2f680 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2f690 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e  exists ){.    in
2f6a0 74 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 20 20 20  t locked = 0;   
2f6b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2f6c0 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73  e if some proces
2f6d0 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  s holds a RESERV
2f6e0 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20  ED lock */..    
2f6f0 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f  /* Race conditio
2f700 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72  n here:  Another
2f710 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68   process might h
2f720 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67  ave been holding
2f730 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   the.    ** the 
2f740 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e  RESERVED lock an
2f750 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c  d have a journal
2f760 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c   open at the sql
2f770 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a  ite3OsAccess() .
2f780 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76      ** call abov
2f790 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65  e, but then dele
2f7a0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  te the journal a
2f7b0 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b  nd drop the lock
2f7c0 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77   before.    ** w
2f7d0 65 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c  e get to the fol
2f7e0 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73  lowing sqlite3Os
2f7f0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2f800 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68  k() call.  If th
2f810 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65  at.    ** is the
2f820 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74   case, this rout
2f830 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20  ine might think 
2f840 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
2f850 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20  ournal when.    
2f860 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72 65  ** in fact there
2f870 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20   is none.  This 
2f880 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c  results in a fal
2f890 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63  se-positive whic
2f8a0 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65  h will.    ** be
2f8b0 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74   dealt with by t
2f8c0 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74  he playback rout
2f8d0 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38  ine.  Ticket #38
2f8e0 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  83..    */.    r
2f8f0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65  c = sqlite3OsChe
2f900 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70  ckReservedLock(p
2f910 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b  Pager->fd, &lock
2f920 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ed);.    if( rc=
2f930 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c  =SQLITE_OK && !l
2f940 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 50  ocked ){.      P
2f950 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20  gno nPage;      
2f960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2f970 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
2f980 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2f990 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  /..      rc = pa
2f9a0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
2f9b0 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
2f9c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2f9d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2f9e0 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
2f9f0 61 73 65 20 69 73 20 7a 65 72 6f 20 70 61 67 65  ase is zero page
2fa00 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 61 74 20  s in size, that 
2fa10 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65  means that eithe
2fa20 72 20 28 31 29 20 74 68 65 0a 20 20 20 20 20 20  r (1) the.      
2fa30 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 73 20    ** journal is 
2fa40 61 20 72 65 6d 6e 61 6e 74 20 66 72 6f 6d 20 61  a remnant from a
2fa50 20 70 72 69 6f 72 20 64 61 74 61 62 61 73 65 20   prior database 
2fa60 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
2fa70 6d 65 20 77 68 65 72 65 0a 20 20 20 20 20 20 20  me where.       
2fa80 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
2fa90 20 66 69 6c 65 20 62 75 74 20 6e 6f 74 20 74 68   file but not th
2faa0 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 64 65  e journal was de
2fab0 6c 65 74 65 64 2c 20 6f 72 20 28 32 29 20 74 68  leted, or (2) th
2fac0 65 20 69 6e 69 74 69 61 6c 0a 20 20 20 20 20 20  e initial.      
2fad0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
2fae0 20 74 68 61 74 20 70 6f 70 75 6c 61 74 65 73 20   that populates 
2faf0 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69  a new database i
2fb00 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
2fb10 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ack..        ** 
2fb20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20  In either case, 
2fb30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2fb40 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e   can be deleted.
2fb50 20 20 48 6f 77 65 76 65 72 2c 20 74 61 6b 65 20    However, take 
2fb60 63 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  care.        ** 
2fb70 6e 6f 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68  not to delete th
2fb80 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2fb90 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
2fba0 6f 70 65 6e 20 64 75 65 20 74 6f 0a 20 20 20 20  open due to.    
2fbb0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 5f 6d      ** journal_m
2fbc0 6f 64 65 3d 50 45 52 53 49 53 54 2e 0a 20 20 20  ode=PERSIST..   
2fbd0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2fbe0 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 26 26 20  if( nPage==0 && 
2fbf0 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  !jrnlOpen ){.   
2fc00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
2fc10 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
2fc20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2fc30 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61   pagerLockDb(pPa
2fc40 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  ger, RESERVED_LO
2fc50 43 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  CK)==SQLITE_OK )
2fc60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
2fc70 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
2fc80 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
2fc90 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  rnal, 0);.      
2fca0 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
2fcb0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
2fcc0 20 29 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62   ) pagerUnlockDb
2fcd0 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
2fce0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
2fcf0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
2fd00 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
2fd10 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d  loc();.        }
2fd20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2fd30 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  /* The journal f
2fd40 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e  ile exists and n
2fd50 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
2fd60 6f 6e 20 68 61 73 20 61 20 72 65 73 65 72 76 65  on has a reserve
2fd70 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f  d.          ** o
2fd80 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
2fd90 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2fda0 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74  ile. Now check t
2fdb0 68 61 74 20 74 68 65 72 65 20 69 73 0a 20 20 20  hat there is.   
2fdc0 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61         ** at lea
2fdd0 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20  st one non-zero 
2fde0 62 79 74 65 73 20 61 74 20 74 68 65 20 73 74 61  bytes at the sta
2fdf0 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
2fe00 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  l file..        
2fe10 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73    ** If there is
2fe20 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64  , then we consid
2fe30 65 72 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  er this journal 
2fe40 74 6f 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f  to be hot. If no
2fe50 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  t, .          **
2fe60 20 69 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72   it can be ignor
2fe70 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ed..          */
2fe80 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
2fe90 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  jrnlOpen ){.    
2fea0 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
2feb0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2fec0 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
2fed0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  _MAIN_JOURNAL;. 
2fee0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2fef0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
2ff00 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
2ff10 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
2ff20 64 2c 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20  d, f, &f);.     
2ff30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2ff40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ff50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2ff60 20 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a    u8 first = 0;.
2ff70 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2ff80 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
2ff90 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69  Pager->jfd, (voi
2ffa0 64 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30  d *)&first, 1, 0
2ffb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
2ffc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
2ffd0 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
2ffe0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2fff0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
30000 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
30010 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a            if( !j
30020 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  rnlOpen ){.     
30030 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
30040 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
30050 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
30060 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
30070 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69 72 73  *pExists = (firs
30080 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20  t!=0);.         
30090 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
300a0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29  QLITE_CANTOPEN )
300b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
300c0 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70   If we cannot op
300d0 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
300e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
300f0 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a  order to see if.
30100 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
30110 74 20 68 61 73 20 61 20 7a 65 72 6f 20 68 65 61  t has a zero hea
30120 64 65 72 2c 20 74 68 61 74 20 6d 69 67 68 74 20  der, that might 
30130 62 65 20 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f  be due to an I/O
30140 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20   error, or.     
30150 20 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67         ** it mig
30160 68 74 20 62 65 20 64 75 65 20 74 6f 20 74 68 65  ht be due to the
30170 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
30180 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20  described above 
30190 61 6e 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20  and in.         
301a0 20 20 20 2a 2a 20 74 69 63 6b 65 74 20 23 33 38     ** ticket #38
301b0 38 33 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  83.  Either way,
301c0 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
301d0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e   journal is hot.
301e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
301f0 54 68 69 73 20 6d 69 67 68 74 20 62 65 20 61 20  This might be a 
30200 66 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 20  false positive. 
30210 20 42 75 74 20 69 66 20 69 74 20 69 73 2c 20 74   But if it is, t
30220 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20  hen the.        
30230 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63      ** automatic
30240 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63   journal playbac
30250 6b 20 61 6e 64 20 72 65 63 6f 76 65 72 79 20 6d  k and recovery m
30260 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65  echanism will de
30270 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  al.            *
30280 2a 20 77 69 74 68 20 69 74 20 75 6e 64 65 72 20  * with it under 
30290 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
302a0 6b 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f  k where we do no
302b0 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20  t need to.      
302c0 20 20 20 20 20 20 2a 2a 20 77 6f 72 72 79 20 73        ** worry s
302d0 6f 20 6d 75 63 68 20 77 69 74 68 20 72 61 63 65  o much with race
302e0 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20   conditions..   
302f0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
30300 20 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73          *pExists
30310 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
30320 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
30330 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
30350 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
30360 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
30370 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
30380 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
30390 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  in a shared lock
303a0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
303b0 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20   file..** It is 
303c0 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20  illegal to call 
303d0 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
303e0 69 72 65 28 29 20 75 6e 74 69 6c 20 61 66 74 65  ire() until afte
303f0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  r this function.
30400 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75 63 63  ** has been succ
30410 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e  essfully called.
30420 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c 6f 63   If a shared-loc
30430 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
30440 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66  d when.** this f
30450 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
30460 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
30470 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
30480 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  owing operations
30490 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66 6f 72   are also perfor
304a0 6d 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  med by this func
304b0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29  tion..**.**   1)
304c0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
304d0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41   currently in PA
304e0 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 28  GER_OPEN state (
304f0 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20  no lock held.** 
30500 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61       on the data
30510 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e  base file), then
30520 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
30530 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a  ade to obtain a.
30540 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 20 6c  **      SHARED l
30550 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
30560 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69  ase file. Immedi
30570 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61  ately after obta
30580 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  ining.**      th
30590 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  e SHARED lock, t
305a0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69  he file-system i
305b0 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20  s checked for a 
305c0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20  hot-journal,.** 
305d0 20 20 20 20 20 77 68 69 63 68 20 69 73 20 70 6c       which is pl
305e0 61 79 65 64 20 62 61 63 6b 20 69 66 20 70 72 65  ayed back if pre
305f0 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20  sent. Following 
30600 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  any hot-journal 
30610 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63  .**      rollbac
30620 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  k, the contents 
30630 6f 66 20 74 68 65 20 63 61 63 68 65 20 61 72 65  of the cache are
30640 20 76 61 6c 69 64 61 74 65 64 20 62 79 20 63 68   validated by ch
30650 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74  ecking.**      t
30660 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74  he 'change-count
30670 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65  er' field of the
30680 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
30690 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20  eader and.**    
306a0 20 20 64 69 73 63 61 72 64 65 64 20 69 66 20 74    discarded if t
306b0 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f  hey are found to
306c0 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a   be invalid..**.
306d0 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65 20 70  **   2) If the p
306e0 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
306f0 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
30700 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  e, and there are
30710 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20   currently.**   
30720 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e     no outstandin
30730 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
30740 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69  any pages, and i
30750 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
30760 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68  tate,.**      th
30770 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
30780 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74   made to clear t
30790 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 62  he error state b
307a0 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20  y discarding.** 
307b0 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74       the content
307c0 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 63 61  s of the page ca
307d0 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20  che and rolling 
307e0 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f  back any open jo
307f0 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69  urnal.**      fi
30800 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  le..**.** If eve
30810 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
30820 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
30830 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
30840 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a   an IO error .**
30850 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6c 6f   occurs while lo
30860 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  cking the databa
30870 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  se, checking for
30880 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
30890 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c 6c 69  ile or .** rolli
308a0 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ng back a journa
308b0 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20 65  l file, the IO e
308c0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
308d0 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
308e0 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64  lite3PagerShared
308f0 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  Lock(Pager *pPag
30900 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
30910 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
30920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
30930 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
30940 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
30950 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72  s only called fr
30960 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20 6f 6e  om b-tree and on
30970 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ly when there ar
30980 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74 61  e no.  ** outsta
30990 6e 64 69 6e 67 20 70 61 67 65 73 2e 20 54 68 69  nding pages. Thi
309a0 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74  s implies that t
309b0 68 65 20 70 61 67 65 72 20 73 74 61 74 65 20 73  he pager state s
309c0 68 6f 75 6c 64 20 65 69 74 68 65 72 0a 20 20 2a  hould either.  *
309d0 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20 52 45 41  * be OPEN or REA
309e0 44 45 52 2e 20 52 45 41 44 45 52 20 69 73 20 6f  DER. READER is o
309f0 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20  nly possible if 
30a00 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 72 20  the pager is or 
30a10 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65 78 63  was in .  ** exc
30a20 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f  lusive access mo
30a30 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  de..  */.  asser
30a40 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  t( sqlite3Pcache
30a50 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
30a60 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a  >pPCache)==0 );.
30a70 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
30a80 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
30a90 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
30aa0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
30ab0 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20  ==PAGER_OPEN || 
30ac0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
30ad0 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
30ae0 20 20 69 66 28 20 4e 45 56 45 52 28 4d 45 4d 44    if( NEVER(MEMD
30af0 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  B && pPager->err
30b00 43 6f 64 65 29 20 29 7b 20 72 65 74 75 72 6e 20  Code) ){ return 
30b10 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
30b20 20 7d 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72   }..  if( !pager
30b30 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26  UseWal(pPager) &
30b40 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
30b50 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a  ==PAGER_OPEN ){.
30b60 20 20 20 20 69 6e 74 20 62 48 6f 74 4a 6f 75 72      int bHotJour
30b70 6e 61 6c 20 3d 20 31 3b 20 20 20 20 20 20 20 20  nal = 1;        
30b80 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
30b90 72 65 20 65 78 69 73 74 73 20 61 20 68 6f 74 20  re exists a hot 
30ba0 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 2a 2f 0a  journal-file */.
30bb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
30bc0 4d 44 42 20 29 3b 0a 0a 20 20 20 20 72 63 20 3d  MDB );..    rc =
30bd0 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
30be0 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52  ock(pPager, SHAR
30bf0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  ED_LOCK);.    if
30c00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30c10 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
30c20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
30c30 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65  NO_LOCK || pPage
30c40 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57  r->eLock==UNKNOW
30c50 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
30c60 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
30c70 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   }..    /* If a 
30c80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
30c90 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69  sts, and there i
30ca0 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f  s no RESERVED lo
30cb0 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ck on the.    **
30cc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
30cd0 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e  then it either n
30ce0 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
30cf0 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65  d back or delete
30d00 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
30d10 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  ( pPager->eLock<
30d20 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
30d30 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f        rc = hasHo
30d40 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  tJournal(pPager,
30d50 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a   &bHotJournal);.
30d60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
30d70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30d80 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
30d90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
30da0 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  bHotJournal ){. 
30db0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
30dc0 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
30dd0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
30de0 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41  _READONLY_ROLLBA
30df0 43 4b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  CK;.        goto
30e00 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
30e10 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61  ..      /* Get a
30e20 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
30e30 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
30e40 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70   file. At this p
30e50 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20  oint it is.     
30e60 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   ** important th
30e70 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  at a RESERVED lo
30e80 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e  ck is not obtain
30e90 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f  ed on the way to
30ea0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58   the.      ** EX
30eb0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
30ec0 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65   it were, anothe
30ed0 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20  r process might 
30ee0 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  open the.      *
30ef0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
30f00 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45   detect the RESE
30f10 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63  RVED lock, and c
30f20 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65  onclude that the
30f30 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
30f40 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  se is safe to re
30f50 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  ad while this pr
30f60 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72  ocess is still r
30f70 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20  olling the .    
30f80 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c    ** hot-journal
30f90 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20   back..      ** 
30fa0 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73  .      ** Becaus
30fb0 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  e the intermedia
30fc0 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  te RESERVED lock
30fd0 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65   is not requeste
30fe0 64 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20  d, any.      ** 
30ff0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 61 74  other process at
31000 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65  tempting to acce
31010 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ss the database 
31020 66 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f  file will get to
31030 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20   .      ** this 
31040 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64  point in the cod
31050 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62  e and fail to ob
31060 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43  tain its own EXC
31070 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20  LUSIVE lock .   
31080 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74     ** on the dat
31090 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
310a0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e    **.      ** Un
310b0 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69  less the pager i
310c0 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  s in locking_mod
310d0 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  e=exclusive mode
310e0 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20 20  , the lock is.  
310f0 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65      ** downgrade
31100 64 20 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43 4b  d to SHARED_LOCK
31110 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e   before this fun
31120 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20  ction returns.. 
31130 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
31140 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70   = pagerLockDb(p
31150 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
31160 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
31170 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31180 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
31190 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
311a0 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 74   .      /* If it
311b0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
311c0 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 6c  open and the fil
311d0 65 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b  e exists on disk
311e0 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20 20 20 20  , open the .    
311f0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72    ** journal for
31200 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
31210 73 73 2e 20 57 72 69 74 65 20 61 63 63 65 73 73  ss. Write access
31220 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63   is required bec
31230 61 75 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 69  ause .      ** i
31240 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
31250 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65  ss mode the file
31260 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c   descriptor will
31270 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a 20   be kept open . 
31280 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73 73       ** and poss
31290 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20  ibly used for a 
312a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65  transaction late
312b0 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69 74  r on. Also, writ
312c0 65 2d 61 63 63 65 73 73 20 0a 20 20 20 20 20 20  e-access .      
312d0 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79 20 72 65  ** is usually re
312e0 71 75 69 72 65 64 20 74 6f 20 66 69 6e 61 6c 69  quired to finali
312f0 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ze the journal i
31300 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70  n journal_mode=p
31310 65 72 73 69 73 74 20 0a 20 20 20 20 20 20 2a 2a  ersist .      **
31320 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f 20   mode (and also 
31330 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  for journal_mode
31340 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f 6d  =truncate on som
31350 65 20 73 79 73 74 65 6d 73 29 2e 0a 20 20 20 20  e systems)..    
31360 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
31370 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65   the journal doe
31380 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74 20  s not exist, it 
31390 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68  usually means th
313a0 61 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20 2a  at some .      *
313b0 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
313c0 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65  on managed to ge
313d0 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74  t in and roll it
313e0 20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20   back before .  
313f0 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e      ** this conn
31400 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20  ection obtained 
31410 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
31420 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74  ck above. Or, it
31430 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d   .      ** may m
31440 65 61 6e 20 74 68 61 74 20 74 68 65 20 70 61 67  ean that the pag
31450 65 72 20 77 61 73 20 69 6e 20 74 68 65 20 65 72  er was in the er
31460 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74  ror-state when t
31470 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e  his.      ** fun
31480 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
31490 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
314a0 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65   file does not e
314b0 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  xist..      */. 
314c0 20 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e       if( !isOpen
314d0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
314e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
314f0 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
31500 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
31510 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 45  ;.        int bE
31520 78 69 73 74 73 3b 20 20 20 20 20 20 20 20 20 20  xists;          
31530 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
31540 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
31550 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  ts */.        rc
31560 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
31570 73 73 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  ss(.            
31580 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
31590 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
315a0 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 62  CCESS_EXISTS, &b
315b0 45 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20 20  Exists);.       
315c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
315d0 4f 4b 20 26 26 20 62 45 78 69 73 74 73 20 29 7b  OK && bExists ){
315e0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66  .          int f
315f0 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  out = 0;.       
31600 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54     int f = SQLIT
31610 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
31620 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
31630 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20  N_JOURNAL;.     
31640 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
31650 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
31660 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
31670 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
31680 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
31690 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
316a0 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20  fd, f, &fout);. 
316b0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
316c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
316d0 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
316e0 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20  >jfd) );.       
316f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
31700 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c  E_OK && fout&SQL
31710 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
31720 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  Y ){.           
31730 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
31740 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
31750 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
31760 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
31770 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  fd);.          }
31780 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31790 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c   }. .      /* Pl
317a0 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74  ayback and delet
317b0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  e the journal.  
317c0 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73  Drop the databas
317d0 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  e write.      **
317e0 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75   lock and reacqu
317f0 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
31800 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63 61 63  k. Purge the cac
31810 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20  he before.      
31820 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  ** playing back 
31830 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  the hot-journal 
31840 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74  so that we don't
31850 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20   end up with.   
31860 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69     ** an inconsi
31870 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79  stent cache.  Sy
31880 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e  nc the hot journ
31890 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e  al before playin
318a0 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61  g.      ** it ba
318b0 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f  ck since the pro
318c0 63 65 73 73 20 74 68 61 74 20 63 72 61 73 68 65  cess that crashe
318d0 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68  d and left the h
318e0 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  ot journal.     
318f0 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64   ** probably did
31900 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64   not sync it and
31910 20 77 65 20 61 72 65 20 72 65 71 75 69 72 65 64   we are required
31920 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a   to always sync.
31930 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75        ** the jou
31940 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79  rnal before play
31950 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20  ing it back..   
31960 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
31970 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
31980 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  fd) ){.        a
31990 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
319a0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
319b0 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f  rc = pagerSyncHo
319c0 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  tJournal(pPager)
319d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
319e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
319f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
31a00 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
31a10 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ger, 1);.       
31a20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
31a30 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
31a40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31a50 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65  }else if( !pPage
31a60 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
31a70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
31a80 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72  rUnlockDb(pPager
31a90 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
31aa0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
31ab0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31ac0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
31ad0 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
31ae0 6b 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ken if an error 
31af0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
31b00 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20  ing to open.    
31b10 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62      ** or roll b
31b20 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
31b30 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  l while holding 
31b40 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
31b50 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  k. The.        *
31b60 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  * pager_unlock()
31b70 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
31b80 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72   called before r
31b90 65 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f  eturning to unlo
31ba0 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ck.        ** th
31bb0 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 75  e file. If the u
31bc0 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20 66 61  nlock attempt fa
31bd0 69 6c 73 2c 20 74 68 65 6e 20 50 61 67 65 72 2e  ils, then Pager.
31be0 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20 20  eLock must be.  
31bf0 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20        ** set to 
31c00 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65  UNKNOWN_LOCK (se
31c10 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  e the comment ab
31c20 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20  ove the #define 
31c30 66 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  for .        ** 
31c40 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f  UNKNOWN_LOCK abo
31c50 76 65 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  ve for an explan
31c60 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20  ation). .       
31c70 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49   **.        ** I
31c80 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 70  n order to get p
31c90 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f  ager_unlock() to
31ca0 20 64 6f 20 74 68 69 73 2c 20 73 65 74 20 50 61   do this, set Pa
31cb0 67 65 72 2e 65 53 74 61 74 65 20 74 6f 0a 20 20  ger.eState to.  
31cc0 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45        ** PAGER_E
31cd0 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20 69  RROR now. This i
31ce0 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63  s not actually c
31cf0 6f 75 6e 74 65 64 20 61 73 20 61 20 74 72 61 6e  ounted as a tran
31d00 73 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a  sition.        *
31d10 2a 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  * to ERROR state
31d20 20 69 6e 20 74 68 65 20 73 74 61 74 65 20 64 69   in the state di
31d30 61 67 72 61 6d 20 61 74 20 74 68 65 20 74 6f 70  agram at the top
31d40 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2c 0a 20   of this file,. 
31d50 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20         ** since 
31d60 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
31d70 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61   same call to pa
31d80 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c  ger_unlock() wil
31d90 6c 20 76 65 72 79 0a 20 20 20 20 20 20 20 20 2a  l very.        *
31da0 2a 20 73 68 6f 72 74 6c 79 20 74 72 61 6e 73 69  * shortly transi
31db0 74 69 6f 6e 20 74 68 65 20 70 61 67 65 72 20 6f  tion the pager o
31dc0 62 6a 65 63 74 20 74 6f 20 74 68 65 20 4f 50 45  bject to the OPE
31dd0 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67  N state. Calling
31de0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 73 65  .        ** asse
31df0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29  rt_pager_state()
31e00 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c   would fail now,
31e10 20 61 73 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f   as it should no
31e20 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20  t be possible.  
31e30 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69        ** to be i
31e40 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68  n ERROR state wh
31e50 65 6e 20 74 68 65 72 65 20 61 72 65 20 7a 65 72  en there are zer
31e60 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  o outstanding pa
31e70 67 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  ge .        ** r
31e80 65 66 65 72 65 6e 63 65 73 2e 0a 20 20 20 20 20  eferences..     
31e90 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61     */.        pa
31ea0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
31eb0 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67  , rc);.        g
31ec0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
31ed0 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
31ee0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
31ef0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
31f00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
31f10 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53  pPager->eLock==S
31f20 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20  HARED_LOCK).    
31f30 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
31f40 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
31f50 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   && pPager->eLoc
31f60 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20  k>SHARED_LOCK). 
31f70 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20       );.    }.. 
31f80 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
31f90 74 65 6d 70 46 69 6c 65 20 26 26 20 70 50 61 67  tempFile && pPag
31fa0 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65  er->hasHeldShare
31fb0 64 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f  dLock ){.      /
31fc0 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63  * The shared-loc
31fd0 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  k has just been 
31fe0 61 63 71 75 69 72 65 64 20 74 68 65 6e 20 63 68  acquired then ch
31ff0 65 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  eck to.      ** 
32000 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62  see if the datab
32010 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64  ase has been mod
32020 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64  ified.  If the d
32030 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e  atabase has chan
32040 67 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 66 6c  ged,.      ** fl
32050 75 73 68 20 74 68 65 20 63 61 63 68 65 2e 20 20  ush the cache.  
32060 54 68 65 20 68 61 73 48 65 6c 64 53 68 61 72 65  The hasHeldShare
32070 64 4c 6f 63 6b 20 66 6c 61 67 20 70 72 65 76 65  dLock flag preve
32080 6e 74 73 20 74 68 69 73 20 66 72 6f 6d 0a 20 20  nts this from.  
32090 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 69 6e 67      ** occurring
320a0 20 6f 6e 20 74 68 65 20 76 65 72 79 20 66 69 72   on the very fir
320b0 73 74 20 61 63 63 65 73 73 20 74 6f 20 61 20 66  st access to a f
320c0 69 6c 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  ile, in order to
320d0 20 73 61 76 65 20 61 0a 20 20 20 20 20 20 2a 2a   save a.      **
320e0 20 73 69 6e 67 6c 65 20 75 6e 6e 65 63 65 73 73   single unnecess
320f0 61 72 79 20 73 71 6c 69 74 65 33 4f 73 52 65 61  ary sqlite3OsRea
32100 64 28 29 20 63 61 6c 6c 20 61 74 20 74 68 65 20  d() call at the 
32110 73 74 61 72 74 2d 75 70 2e 0a 20 20 20 20 20 20  start-up..      
32120 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61  **.      ** Data
32130 62 61 73 65 20 63 68 61 6e 67 65 73 20 61 72 65  base changes are
32140 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f   detected by loo
32150 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73  king at 15 bytes
32160 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
32170 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34   ** at offset 24
32180 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
32190 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20   The first 4 of 
321a0 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61  these 16 bytes a
321b0 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32  re.      ** a 32
321c0 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61  -bit counter tha
321d0 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
321e0 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67   with each chang
321f0 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  e.  The.      **
32200 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61   other bytes cha
32210 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74  nge randomly wit
32220 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e  h each file chan
32230 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ge when.      **
32240 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75   a codec is in u
32250 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  se..      ** .  
32260 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
32270 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  a vanishingly sm
32280 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20  all chance that 
32290 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f  a change will no
322a0 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64  t be .      ** d
322b0 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68  etected.  The ch
322c0 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74  ance of an undet
322d0 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20  ected change is 
322e0 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20  so small that.  
322f0 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
32300 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20   neglected..    
32310 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20    */.      Pgno 
32320 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
32330 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
32340 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  [sizeof(pPager->
32350 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20  dbFileVers)];.. 
32360 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50       rc = pagerP
32370 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
32380 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
32390 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 61  if( rc ) goto fa
323a0 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20 69 66 28  iled;..      if(
323b0 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
323c0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b      IOTRACE(("CK
323d0 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70  VERS %p %d\n", p
323e0 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62  Pager, sizeof(db
323f0 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20  FileVers)));.   
32400 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32410 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
32420 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c  fd, &dbFileVers,
32430 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
32440 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20  rs), 24);.      
32450 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32460 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
32470 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
32480 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
32490 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
324a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
324b0 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  se{.        mems
324c0 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30  et(dbFileVers, 0
324d0 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
324e0 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  ers));.      }..
324f0 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70        if( memcmp
32500 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
32510 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c  ers, dbFileVers,
32520 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
32530 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  rs))!=0 ){.     
32540 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
32550 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20  Pager);..       
32560 20 2f 2a 20 55 6e 6d 61 70 20 74 68 65 20 64 61   /* Unmap the da
32570 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20  tabase file. It 
32580 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
32590 20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65 73   external proces
325a0 73 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  ses.        ** m
325b0 61 79 20 68 61 76 65 20 74 72 75 6e 63 61 74 65  ay have truncate
325c0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
325d0 69 6c 65 20 61 6e 64 20 74 68 65 6e 20 65 78 74  ile and then ext
325e0 65 6e 64 65 64 20 69 74 20 62 61 63 6b 0a 20 20  ended it back.  
325f0 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 74 73 20        ** to its 
32600 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20 77 68  original size wh
32610 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
32620 20 77 61 73 20 6e 6f 74 20 68 6f 6c 64 69 6e 67   was not holding
32630 20 61 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20   a lock..       
32640 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
32650 20 74 68 65 72 65 20 6d 61 79 20 65 78 69 73 74   there may exist
32660 20 61 20 50 61 67 65 72 2e 70 4d 61 70 20 6d 61   a Pager.pMap ma
32670 70 70 69 6e 67 20 74 68 61 74 20 61 70 70 65 61  pping that appea
32680 72 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  rs.        ** to
32690 20 62 65 20 74 68 65 20 72 69 67 68 74 20 73 69   be the right si
326a0 7a 65 20 62 75 74 20 69 73 20 6e 6f 74 20 61 63  ze but is not ac
326b0 74 75 61 6c 6c 79 20 76 61 6c 69 64 2e 20 41 76  tually valid. Av
326c0 6f 69 64 20 74 68 69 73 0a 20 20 20 20 20 20 20  oid this.       
326d0 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 79 20   ** possibility 
326e0 62 79 20 75 6e 6d 61 70 70 69 6e 67 20 74 68 65  by unmapping the
326f0 20 64 62 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20   db here. */.   
32700 20 20 20 20 20 69 66 28 20 55 53 45 46 45 54 43       if( USEFETC
32710 48 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  H(pPager) ){.   
32720 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
32730 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
32740 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  fd, 0, 0);.     
32750 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
32760 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
32770 65 72 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c  ere is a WAL fil
32780 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  e in the file-sy
32790 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20  stem, open this 
327a0 64 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c 0a  database in WAL.
327b0 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68      ** mode. Oth
327c0 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c  erwise, the foll
327d0 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63  owing function c
327e0 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
327f0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
32800 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
32810 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 23  esent(pPager);.#
32820 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
32830 49 54 5f 57 41 4c 0a 20 20 20 20 61 73 73 65 72  IT_WAL.    asser
32840 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d  t( pPager->pWal=
32850 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
32860 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  _OK );.#endif.  
32870 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  }..  if( pagerUs
32880 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
32890 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
328a0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
328b0 20 72 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e   rc = pagerBegin
328c0 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
328d0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
328e0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
328f0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26  te==PAGER_OPEN &
32900 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
32910 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
32920 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
32930 72 2c 20 26 70 50 61 67 65 72 2d 3e 64 62 53 69  r, &pPager->dbSi
32940 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65  ze);.  }.. faile
32950 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  d:.  if( rc!=SQL
32960 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
32970 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
32980 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
32990 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73  (pPager);.    as
329a0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
329b0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
329c0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
329d0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
329e0 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a  = PAGER_READER;.
329f0 20 20 20 20 70 50 61 67 65 72 2d 3e 68 61 73 48      pPager->hasH
32a00 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 3d 20  eldSharedLock = 
32a10 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
32a20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rc;.}../*.** If 
32a30 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
32a40 75 6e 74 20 68 61 73 20 72 65 61 63 68 65 64 20  unt has reached 
32a50 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61  zero, rollback a
32a60 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61  ny active.** tra
32a70 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c  nsaction and unl
32a80 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 2a  ock the pager..*
32a90 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e 20  *.** Except, in 
32aa0 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43  locking_mode=EXC
32ab0 4c 55 53 49 56 45 20 77 68 65 6e 20 74 68 65 72  LUSIVE when ther
32ac0 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20  e is nothing to 
32ad0 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  in.** the rollba
32ae0 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20  ck journal, the 
32af0 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65  unlock is not pe
32b00 72 66 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 72  rformed and ther
32b10 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20  e is.** nothing 
32b20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20  to rollback, so 
32b30 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
32b40 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61  a no-op..*/ .sta
32b50 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e  tic void pagerUn
32b60 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67  lockIfUnused(Pag
32b70 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
32b80 66 28 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70  f( pPager->nMmap
32b90 4f 75 74 3d 3d 30 20 26 26 20 28 73 71 6c 69 74  Out==0 && (sqlit
32ba0 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
32bb0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
32bc0 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 61 67  )==0) ){.    pag
32bd0 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
32be0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
32bf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
32c00 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  e a reference to
32c10 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e   page number pgn
32c20 6f 20 69 6e 20 70 61 67 65 72 20 70 50 61 67 65  o in pager pPage
32c30 72 20 28 61 20 70 61 67 65 0a 2a 2a 20 72 65 66  r (a page.** ref
32c40 65 72 65 6e 63 65 20 68 61 73 20 74 79 70 65 20  erence has type 
32c50 44 62 50 61 67 65 2a 29 2e 20 49 66 20 74 68 65  DbPage*). If the
32c60 20 72 65 71 75 65 73 74 65 64 20 72 65 66 65 72   requested refer
32c70 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63  ence is .** succ
32c80 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65  essfully obtaine
32c90 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  d, it is copied 
32ca0 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53  to *ppPage and S
32cb0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
32cc0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
32cd0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
32ce0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
32cf0 20 63 61 63 68 65 2c 20 69 74 20 69 73 20 72 65   cache, it is re
32d00 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65  turned. .** Othe
32d10 72 77 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67  rwise, a new pag
32d20 65 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f  e object is allo
32d30 63 61 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61  cated and popula
32d40 74 65 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a  ted with data.**
32d50 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
32d60 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e  atabase file. In
32d70 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65   some cases, the
32d80 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d   pcache module m
32d90 61 79 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74  ay.** choose not
32da0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e   to allocate a n
32db0 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61  ew page object a
32dc0 6e 64 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20  nd may reuse an 
32dd0 65 78 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65  existing.** obje
32de0 63 74 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74  ct with no outst
32df0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
32e00 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74  s..**.** The ext
32e10 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64  ra data appended
32e20 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c   to a page is al
32e30 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ways initialized
32e40 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a   to zeros the .*
32e50 2a 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70  * first time a p
32e60 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e  age is loaded in
32e70 74 6f 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68  to memory. If th
32e80 65 20 70 61 67 65 20 72 65 71 75 65 73 74 65 64  e page requested
32e90 20 69 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20   is .** already 
32ea0 69 6e 20 74 68 65 20 63 61 63 68 65 20 77 68 65  in the cache whe
32eb0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
32ec0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  is called, then 
32ed0 74 68 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74  the extra.** dat
32ee0 61 20 69 73 20 6c 65 66 74 20 61 73 20 69 74 20  a is left as it 
32ef0 77 61 73 20 77 68 65 6e 20 74 68 65 20 70 61 67  was when the pag
32f00 65 20 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73  e object was las
32f10 74 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  t used..**.** If
32f20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
32f30 61 67 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  age is smaller t
32f40 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
32f50 64 20 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a  d page or if a .
32f60 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ** non-zero valu
32f70 65 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74  e is passed as t
32f80 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72  he noContent par
32f90 61 6d 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a  ameter and the .
32fa0 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70 61 67  ** requested pag
32fb0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
32fc0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63   stored in the c
32fd0 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a  ache, then no .*
32fe0 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65  * actual disk re
32ff0 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68  ad occurs. In th
33000 69 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f  is case the memo
33010 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20  ry image of the 
33020 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74  .** page is init
33030 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a  ialized to all z
33040 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  eros. .**.** If 
33050 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
33060 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
33070 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
33080 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
33090 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  ts.** of the pag
330a0 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73 20 69  e. This occurs i
330b0 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a  n two scenarios:
330c0 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e  .**.**   a) When
330d0 20 72 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d   reading a free-
330e0 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 66  list leaf page f
330f0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
33100 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29  , and.**.**   b)
33110 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
33120 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  t is being rolle
33130 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65  d back and we ne
33140 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20  ed to load.**   
33150 20 20 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e     a new page in
33160 74 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f 20  to the cache to 
33170 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  be filled with t
33180 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20  he data read.** 
33190 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61       from the sa
331a0 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e  vepoint journal.
331b0 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  .**.** If noCont
331c0 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65  ent is true, the
331d0 6e 20 74 68 65 20 64 61 74 61 20 72 65 74 75 72  n the data retur
331e0 6e 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e  ned is zeroed in
331f0 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e  stead of.** bein
33200 67 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  g read from the 
33210 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69  database. Additi
33220 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73  onally, the bits
33230 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
33240 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67  * to pgno in Pag
33250 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62  er.pInJournal (b
33260 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61  itvec of pages a
33270 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e 20 74  lready written t
33280 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  o the.** journal
33290 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50   file) and the P
332a0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
332b0 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65  nSavepoint bitve
332c0 63 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a  cs of any open.*
332d0 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  * savepoints are
332e0 20 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73   set. This means
332f0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
33300 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 61 74  made writable at
33310 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e   any.** point in
33320 20 74 68 65 20 66 75 74 75 72 65 2c 20 75 73 69   the future, usi
33330 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  ng a call to sql
33340 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
33350 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a  , its contents.*
33360 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f  * will not be jo
33370 75 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61  urnaled. This sa
33380 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68  ves IO..**.** Th
33390 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
333a0 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
333b0 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
333c0 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
333d0 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
333e0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
333f0 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
33400 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
33410 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
33420 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
33430 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69  kup().  Both thi
33440 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f  s routine and Lo
33450 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a  okup() attempt.*
33460 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  * to find a page
33470 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
33480 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20  y cache first.  
33490 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
334a0 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
334b0 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f   memory, this ro
334c0 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69  utine goes to di
334d0 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e  sk to read it in
334e0 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28   whereas Lookup(
334f0 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e  ).** just return
33500 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69  s 0.  This routi
33510 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65  ne acquires a re
33520 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73  ad-lock the firs
33530 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73  t time it.** has
33540 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20   to go to disk, 
33550 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70  and could also p
33560 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a  layback an old j
33570 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
33580 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f  ary..** Since Lo
33590 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65  okup() never goe
335a0 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65  s to disk, it ne
335b0 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20  ver has to deal 
335c0 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72  with locks.** or
335d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
335e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
335f0 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61  gerAcquire(.  Pa
33600 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
33610 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
33620 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
33630 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
33640 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
33650 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
33660 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44   to fetch */.  D
33670 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  bPage **ppPage, 
33680 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f     /* Write a po
33690 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
336a0 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
336b0 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
336c0 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58  /* PAGER_GET_XXX
336d0 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69   flags */.){.  i
336e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
336f0 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  K;.  PgHdr *pPg 
33700 3d 20 30 3b 0a 20 20 75 33 32 20 69 46 72 61 6d  = 0;.  u32 iFram
33710 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
33720 20 20 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20         /* Frame 
33730 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 57 41 4c  to read from WAL
33740 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   file */.  const
33750 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d   int noContent =
33760 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
33770 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 3b 0a  GET_NOCONTENT);.
33780 0a 20 20 2f 2a 20 49 74 20 69 73 20 61 63 63 65  .  /* It is acce
33790 70 74 61 62 6c 65 20 74 6f 20 75 73 65 20 61 20  ptable to use a 
337a0 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29  read-only (mmap)
337b0 20 70 61 67 65 20 66 6f 72 20 61 6e 79 20 70 61   page for any pa
337c0 67 65 20 65 78 63 65 70 74 0a 20 20 2a 2a 20 70  ge except.  ** p
337d0 61 67 65 20 31 20 69 66 20 74 68 65 72 65 20 69  age 1 if there i
337e0 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  s no write-trans
337f0 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 72 20 74  action open or t
33800 68 65 20 41 43 51 55 49 52 45 5f 52 45 41 44 4f  he ACQUIRE_READO
33810 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61 67 20 77 61  NLY.  ** flag wa
33820 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74  s specified by t
33830 68 65 20 63 61 6c 6c 65 72 2e 20 41 6e 64 20 73  he caller. And s
33840 6f 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 64 62  o long as the db
33850 20 69 73 20 6e 6f 74 20 61 20 0a 20 20 2a 2a 20   is not a .  ** 
33860 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d  temporary or in-
33870 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
33880 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74    */.  const int
33890 20 62 4d 6d 61 70 4f 6b 20 3d 20 28 70 67 6e 6f   bMmapOk = (pgno
338a0 3e 31 20 26 26 20 55 53 45 46 45 54 43 48 28 70  >1 && USEFETCH(p
338b0 50 61 67 65 72 29 0a 20 20 20 26 26 20 28 70 50  Pager).   && (pP
338c0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
338d0 47 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 28 66  GER_READER || (f
338e0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47 45 54  lags & PAGER_GET
338f0 5f 52 45 41 44 4f 4e 4c 59 29 29 0a 23 69 66 64  _READONLY)).#ifd
33900 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
33910 44 45 43 0a 20 20 20 26 26 20 70 50 61 67 65 72  DEC.   && pPager
33920 2d 3e 78 43 6f 64 65 63 3d 3d 30 0a 23 65 6e 64  ->xCodec==0.#end
33930 69 66 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 4f 70  if.  );..  /* Op
33940 74 69 6d 69 7a 61 74 69 6f 6e 20 6e 6f 74 65 3a  timization note:
33950 20 20 41 64 64 69 6e 67 20 74 68 65 20 22 70 67    Adding the "pg
33960 6e 6f 3c 3d 31 22 20 74 65 72 6d 20 62 65 66 6f  no<=1" term befo
33970 72 65 20 22 70 67 6e 6f 3d 3d 30 22 20 68 65 72  re "pgno==0" her
33980 65 0a 20 20 2a 2a 20 61 6c 6c 6f 77 73 20 74 68  e.  ** allows th
33990 65 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d  e compiler optim
339a0 69 7a 65 72 20 74 6f 20 72 65 75 73 65 20 74 68  izer to reuse th
339b0 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
339c0 20 22 70 67 6e 6f 3e 31 22 0a 20 20 2a 2a 20 74   "pgno>1".  ** t
339d0 65 73 74 20 69 6e 20 74 68 65 20 70 72 65 76 69  est in the previ
339e0 6f 75 73 20 73 74 61 74 65 6d 65 6e 74 2c 20 61  ous statement, a
339f0 6e 64 20 61 76 6f 69 64 20 74 65 73 74 69 6e 67  nd avoid testing
33a00 20 70 67 6e 6f 3d 3d 30 20 69 6e 20 74 68 65 0a   pgno==0 in the.
33a10 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 63 61 73 65    ** common case
33a20 20 77 68 65 72 65 20 70 67 6e 6f 20 69 73 20 6c   where pgno is l
33a30 61 72 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70  arge. */.  if( p
33a40 67 6e 6f 3c 3d 31 20 26 26 20 70 67 6e 6f 3d 3d  gno<=1 && pgno==
33a50 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
33a60 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
33a70 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  KPT;.  }.  asser
33a80 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
33a90 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e>=PAGER_READER 
33aa0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
33ab0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
33ac0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
33ad0 65 72 74 28 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d  ert( noContent==
33ae0 30 20 7c 7c 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20  0 || bMmapOk==0 
33af0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  );..  assert( pP
33b00 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61  ager->hasHeldSha
33b10 72 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 0a 20  redLock==1 );.. 
33b20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
33b30 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
33b40 20 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20 61   state, return a
33b50 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64 69 61 74  n error immediat
33b60 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72  ely. .  ** Other
33b70 77 69 73 65 2c 20 72 65 71 75 65 73 74 20 74 68  wise, request th
33b80 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
33b90 50 43 61 63 68 65 20 6c 61 79 65 72 2e 20 2a 2f  PCache layer. */
33ba0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
33bb0 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f  rrCode!=SQLITE_O
33bc0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  K ){.    rc = pP
33bd0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
33be0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
33bf0 62 4d 6d 61 70 4f 6b 20 26 26 20 70 61 67 65 72  bMmapOk && pager
33c00 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
33c10 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
33c20 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65  ite3WalFindFrame
33c30 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
33c40 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20  gno, &iFrame);. 
33c50 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
33c60 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61  ITE_OK ) goto pa
33c70 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
33c80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
33c90 62 4d 6d 61 70 4f 6b 20 26 26 20 69 46 72 61 6d  bMmapOk && iFram
33ca0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 6f  e==0 ){.      vo
33cb0 69 64 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a 0a  id *pData = 0;..
33cc0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
33cd0 65 33 4f 73 46 65 74 63 68 28 70 50 61 67 65 72  e3OsFetch(pPager
33ce0 2d 3e 66 64 2c 20 0a 20 20 20 20 20 20 20 20 20  ->fd, .         
33cf0 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a   (i64)(pgno-1) *
33d00 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
33d10 65 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  e, pPager->pageS
33d20 69 7a 65 2c 20 26 70 44 61 74 61 0a 20 20 20 20  ize, &pData.    
33d30 20 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20    );..      if( 
33d40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
33d50 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20   pData ){.      
33d60 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53    if( pPager->eS
33d70 74 61 74 65 3e 50 41 47 45 52 5f 52 45 41 44 45  tate>PAGER_READE
33d80 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  R ){.          p
33d90 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  Pg = sqlite3Page
33da0 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  rLookup(pPager, 
33db0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d  pgno);.        }
33dc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 67  .        if( pPg
33dd0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
33de0 20 72 63 20 3d 20 70 61 67 65 72 41 63 71 75 69   rc = pagerAcqui
33df0 72 65 4d 61 70 50 61 67 65 28 70 50 61 67 65 72  reMapPage(pPager
33e00 2c 20 70 67 6e 6f 2c 20 70 44 61 74 61 2c 20 26  , pgno, pData, &
33e10 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  pPg);.        }e
33e20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
33e30 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
33e40 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34  pPager->fd, (i64
33e50 29 28 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72  )(pgno-1)*pPager
33e60 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74  ->pageSize, pDat
33e70 61 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  a);.        }.  
33e80 20 20 20 20 20 20 69 66 28 20 70 50 67 20 29 7b        if( pPg ){
33e90 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
33ea0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
33eb0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   );.          *p
33ec0 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20 20 20  pPage = pPg;.   
33ed0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
33ee0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
33ef0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
33f00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33f10 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
33f20 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
33f30 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
33f40 20 20 7d 0a 0a 20 20 20 20 7b 0a 20 20 20 20 20    }..    {.     
33f50 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f   sqlite3_pcache_
33f60 70 61 67 65 20 2a 70 42 61 73 65 3b 0a 20 20 20  page *pBase;.   
33f70 20 20 20 70 42 61 73 65 20 3d 20 73 71 6c 69 74     pBase = sqlit
33f80 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
33f90 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
33fa0 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20 69  gno, 3);.      i
33fb0 66 28 20 70 42 61 73 65 3d 3d 30 20 29 7b 0a 20  f( pBase==0 ){. 
33fc0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
33fd0 74 65 33 50 63 61 63 68 65 46 65 74 63 68 53 74  te3PcacheFetchSt
33fe0 72 65 73 73 28 70 50 61 67 65 72 2d 3e 70 50 43  ress(pPager->pPC
33ff0 61 63 68 65 2c 20 70 67 6e 6f 2c 20 26 70 42 61  ache, pgno, &pBa
34000 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  se);.        if(
34010 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34020 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
34030 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 20  ire_err;.       
34040 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20 29 7b   if( pBase==0 ){
34050 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 20 3d  .          pPg =
34060 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
34070 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
34080 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
34090 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
340a0 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
340b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
340c0 20 20 20 20 20 70 50 67 20 3d 20 2a 70 70 50 61       pPg = *ppPa
340d0 67 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  ge = sqlite3Pcac
340e0 68 65 46 65 74 63 68 46 69 6e 69 73 68 28 70 50  heFetchFinish(pP
340f0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
34100 67 6e 6f 2c 20 70 42 61 73 65 29 3b 0a 20 20 20  gno, pBase);.   
34110 20 20 20 61 73 73 65 72 74 28 20 70 50 67 21 3d     assert( pPg!=
34120 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  0 );.    }.  }..
34130 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
34140 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69  _OK ){.    /* Ei
34150 74 68 65 72 20 74 68 65 20 63 61 6c 6c 20 74 6f  ther the call to
34160 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
34170 74 63 68 28 29 20 72 65 74 75 72 6e 65 64 20 61  tch() returned a
34180 6e 20 65 72 72 6f 72 20 6f 72 20 74 68 65 0a 20  n error or the. 
34190 20 20 20 2a 2a 20 70 61 67 65 72 20 77 61 73 20     ** pager was 
341a0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65  already in the e
341b0 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20  rror-state when 
341c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61  this function wa
341d0 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a  s called..    **
341e0 20 53 65 74 20 70 50 67 20 74 6f 20 30 20 61 6e   Set pPg to 0 an
341f0 64 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 78  d jump to the ex
34200 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c 65 72 2e  ception handler.
34210 20 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 30    */.    pPg = 0
34220 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72  ;.    goto pager
34230 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
34240 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 3d  }.  assert( pPg=
34250 3d 28 2a 70 70 50 61 67 65 29 20 29 3b 0a 20 20  =(*ppPage) );.  
34260 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e  assert( pPg->pgn
34270 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  o==pgno );.  ass
34280 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
34290 3d 3d 70 50 61 67 65 72 20 7c 7c 20 70 50 67 2d  ==pPager || pPg-
342a0 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20  >pPager==0 );.. 
342b0 20 69 66 28 20 70 50 67 2d 3e 70 50 61 67 65 72   if( pPg->pPager
342c0 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29   && !noContent )
342d0 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
342e0 20 63 61 73 65 20 74 68 65 20 70 63 61 63 68 65   case the pcache
342f0 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e   already contain
34300 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  s an initialized
34310 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20   copy of.    ** 
34320 74 68 65 20 70 61 67 65 2e 20 52 65 74 75 72 6e  the page. Return
34330 20 77 69 74 68 6f 75 74 20 66 75 72 74 68 65 72   without further
34340 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73   ado.  */.    as
34350 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45  sert( pgno<=PAGE
34360 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70 67  R_MAX_PGNO && pg
34370 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no!=PAGER_MJ_PGN
34380 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  O(pPager) );.   
34390 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50   pPager->aStat[P
343a0 41 47 45 52 5f 53 54 41 54 5f 48 49 54 5d 2b 2b  AGER_STAT_HIT]++
343b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
343c0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65  ITE_OK;..  }else
343d0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  {.    /* The pag
343e0 65 72 20 63 61 63 68 65 20 68 61 73 20 63 72 65  er cache has cre
343f0 61 74 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e  ated a new page.
34400 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65   Its content nee
34410 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65  ds to .    ** be
34420 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a   initialized.  *
34430 2f 0a 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67  /..    pPg->pPag
34440 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20  er = pPager;..  
34450 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
34460 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
34470 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c  2^31. Return SQL
34480 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
34490 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d   page.    ** num
344a0 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
344b0 20 74 68 69 73 2c 20 6f 72 20 74 68 65 20 75 6e   this, or the un
344c0 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67  used locking-pag
344d0 65 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e  e, is requested.
344e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
344f0 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20  >PAGER_MAX_PGNO 
34500 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
34510 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
34520 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
34530 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
34540 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  ;.      goto pag
34550 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
34560 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 4d      }..    if( M
34570 45 4d 44 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e  EMDB || pPager->
34580 64 62 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20 6e  dbSize<pgno || n
34590 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20 21 69 73 4f  oContent || !isO
345a0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
345b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  ){.      if( pgn
345c0 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  o>pPager->mxPgno
345d0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
345e0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
345f0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
34600 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
34610 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
34620 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
34630 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20       /* Failure 
34640 74 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 20  to set the bits 
34650 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c  in the InJournal
34660 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20   bit-vectors is 
34670 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20  benign..        
34680 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61  ** It merely mea
34690 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67 68 74  ns that we might
346a0 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77   do some extra w
346b0 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61  ork to journal a
346c0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67   .        ** pag
346d0 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
346e0 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e  need to be journ
346f0 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c  aled.  Neverthel
34700 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20  ess, be sure .  
34710 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74        ** to test
34720 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20   the case where 
34730 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  a malloc error o
34740 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
34750 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20  ng to set .     
34760 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61     ** a bit in a
34770 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20   bit vector..   
34780 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
34790 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
347a0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
347b0 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50      if( pgno<=pP
347c0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
347d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45   ){.          TE
347e0 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73  STONLY( rc = ) s
347f0 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
34800 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
34810 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  al, pgno);.     
34820 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
34830 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
34840 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
34850 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72       TESTONLY( r
34860 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70  c = ) addToSavep
34870 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
34880 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  er, pgno);.     
34890 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
348a0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
348b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
348c0 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
348d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
348e0 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61   memset(pPg->pDa
348f0 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  ta, 0, pPager->p
34900 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
34910 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25  IOTRACE(("ZERO %
34920 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
34930 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c   pgno));.    }el
34940 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70 61  se{.      if( pa
34950 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
34960 29 20 26 26 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20  ) && bMmapOk==0 
34970 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
34980 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72  sqlite3WalFindFr
34990 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ame(pPager->pWal
349a0 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29  , pgno, &iFrame)
349b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
349c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
349d0 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
349e0 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
349f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
34a00 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
34a10 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
34a20 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
34a30 54 5f 4d 49 53 53 5d 2b 2b 3b 0a 20 20 20 20 20  T_MISS]++;.     
34a40 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65   rc = readDbPage
34a50 28 70 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a 20  (pPg, iFrame);. 
34a60 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
34a70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
34a80 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
34a90 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
34aa0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  }.    }.    page
34ab0 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70  r_set_pagehash(p
34ac0 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  Pg);.  }..  retu
34ad0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
34ae0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
34af0 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  :.  assert( rc!=
34b00 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
34b10 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71  f( pPg ){.    sq
34b20 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
34b30 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  pPg);.  }.  page
34b40 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
34b50 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50  pPager);..  *ppP
34b60 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  age = 0;.  retur
34b70 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
34b80 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
34b90 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
34ba0 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
34bb0 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
34bc0 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
34bd0 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
34be0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
34bf0 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
34c00 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
34c10 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 0a   not in cache. .
34c20 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
34c30 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
34c40 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  .  The differenc
34c50 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
34c60 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71  outine.** and sq
34c70 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
34c80 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77  is that _get() w
34c90 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69  ill go to the di
34ca0 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69  sk and read.** i
34cb0 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68  n the page if th
34cc0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
34cd0 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20  ready in cache. 
34ce0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
34cf0 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
34d00 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
34d10 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20   in cache or if 
34d20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72  a disk I/O error
34d30 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61   .** has ever ha
34d40 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67  ppened..*/.DbPag
34d50 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c  e *sqlite3PagerL
34d60 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
34d70 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
34d80 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68  .  sqlite3_pcach
34d90 65 5f 70 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  e_page *pPage;. 
34da0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
34db0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
34dc0 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73  pgno!=0 );.  ass
34dd0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50 43  ert( pPager->pPC
34de0 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 70 50 61  ache!=0 );.  pPa
34df0 67 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  ge = sqlite3Pcac
34e00 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
34e10 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30  pPCache, pgno, 0
34e20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
34e30 67 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  ge==0 || pPager-
34e40 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f  >hasHeldSharedLo
34e50 63 6b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ck );.  if( pPag
34e60 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
34e70 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
34e80 33 50 63 61 63 68 65 46 65 74 63 68 46 69 6e 69  3PcacheFetchFini
34e90 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  sh(pPager->pPCac
34ea0 68 65 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 29  he, pgno, pPage)
34eb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
34ec0 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72 65  se a page refere
34ed0 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  nce..**.** If th
34ee0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
34ef0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
34f00 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c  ge drop to zero,
34f10 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67   then the.** pag
34f20 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
34f30 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65  e LRU list.  Whe
34f40 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  n all references
34f50 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a   to all pages.**
34f60 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61   are released, a
34f70 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
34f80 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
34f90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
34fa0 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  .** removed..*/.
34fb0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
34fc0 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 44 62  rUnrefNotNull(Db
34fd0 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61  Page *pPg){.  Pa
34fe0 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 61  ger *pPager;.  a
34ff0 73 73 65 72 74 28 20 70 50 67 21 3d 30 20 29 3b  ssert( pPg!=0 );
35000 0a 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d  .  pPager = pPg-
35010 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70  >pPager;.  if( p
35020 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
35030 52 5f 4d 4d 41 50 20 29 7b 0a 20 20 20 20 70 61  R_MMAP ){.    pa
35040 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67  gerReleaseMapPag
35050 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b  e(pPg);.  }else{
35060 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
35070 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
35080 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63    }.  pagerUnloc
35090 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72  kIfUnused(pPager
350a0 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  );.}.void sqlite
350b0 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61  3PagerUnref(DbPa
350c0 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  ge *pPg){.  if( 
350d0 70 50 67 20 29 20 73 71 6c 69 74 65 33 50 61 67  pPg ) sqlite3Pag
350e0 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70  erUnrefNotNull(p
350f0 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Pg);.}../*.** Th
35100 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
35110 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74 61  alled at the sta
35120 72 74 20 6f 66 20 65 76 65 72 79 20 77 72 69 74  rt of every writ
35130 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
35140 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72  * There must alr
35150 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56  eady be a RESERV
35160 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
35170 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
35180 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68  base .** file wh
35190 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
351a0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
351b0 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
351c0 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
351d0 20 70 50 61 67 65 72 20 61 6e 64 20 77 72 69 74   pPager and writ
351e0 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  e a journal head
351f0 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61  er.** to the sta
35200 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65  rt of it. If the
35210 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61  re are active sa
35220 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74  vepoints, open t
35230 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  he sub-journal.*
35240 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20  * as well. This 
35250 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
35260 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a   used when the j
35270 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62  ournal file is b
35280 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20  eing .** opened 
35290 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62  to write a rollb
352a0 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72  ack log for a tr
352b0 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
352c0 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68   not used .** wh
352d0 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74  en opening a hot
352e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
352f0 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a   roll it back..*
35300 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
35310 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65  nal file is alre
35320 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20  ady open (as it 
35330 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73  may be in exclus
35340 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68  ive mode),.** th
35350 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
35360 20 6a 75 73 74 20 77 72 69 74 65 73 20 61 20 6a   just writes a j
35370 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
35380 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
35390 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65  e.** already ope
353a0 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57  n file. .**.** W
353b0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
353c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
353d0 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73  s opened by this
353e0 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a   function, the.*
353f0 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  * Pager.pInJourn
35400 61 6c 20 62 69 74 76 65 63 20 73 74 72 75 63 74  al bitvec struct
35410 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
35420 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
35430 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
35440 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
35450 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c  sful. Otherwise,
35460 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
35470 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20  TE_NOMEM if the 
35480 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63  attempt to alloc
35490 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  ate Pager.pInJou
354a0 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a  rnal fails, or .
354b0 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  ** an IO error c
354c0 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f  ode if opening o
354d0 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f  r writing the jo
354e0 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73  urnal file fails
354f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
35500 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
35510 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
35520 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
35530 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
35540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35550 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
35560 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  /.  sqlite3_vfs 
35570 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
35580 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f  Pager->pVfs;   /
35590 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
355a0 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a   vfs pointer */.
355b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
355c0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
355d0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
355e0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
355f0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
35600 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
35610 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
35620 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a  ournal==0 );.  .
35630 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20    /* If already 
35640 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
35650 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  te, this functio
35660 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42  n is a no-op.  B
35670 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f  ut on.  ** the o
35680 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20  ther hand, this 
35690 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
356a0 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72   called if we ar
356b0 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a  e already in.  *
356c0 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  * an error state
356d0 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  . */.  if( NEVER
356e0 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
356f0 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65  ) ) return pPage
35700 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69  r->errCode;..  i
35710 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
35720 70 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65  pPager) && pPage
35730 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
35740 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
35750 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 70 50 61  E_OFF ){.    pPa
35760 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
35770 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
35780 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62  reate(pPager->db
35790 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Size);.    if( p
357a0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
357b0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  l==0 ){.      re
357c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
357d0 4d 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  M;.    }.  .    
357e0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
357f0 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69  nal file if it i
35800 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
35810 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  en. */.    if( !
35820 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
35830 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  fd) ){.      if(
35840 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
35850 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
35860 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
35870 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
35880 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  3MemJournalOpen(
35890 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
358a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
358b0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61     const int fla
358c0 67 73 20 3d 20 20 20 20 20 20 20 20 20 20 20 20  gs =            
358d0 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c         /* VFS fl
358e0 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72  ags to open jour
358f0 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  nal file */.    
35900 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
35910 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
35920 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a  TE_OPEN_CREATE|.
35930 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
35940 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20  r->tempFile ? . 
35950 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49             (SQLI
35960 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
35970 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45  CLOSE|SQLITE_OPE
35980 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a  N_TEMP_JOURNAL):
35990 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51  .            (SQ
359a0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
359b0 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20 20 20 20  OURNAL).        
359c0 20 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a    );..        /*
359d0 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
359e0 20 64 61 74 61 62 61 73 65 20 73 74 69 6c 6c 20   database still 
359f0 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  has the same nam
35a00 65 20 61 73 20 69 74 20 64 69 64 20 77 68 65 6e  e as it did when
35a10 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 77  .        ** it w
35a20 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70  as originally op
35a30 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ened. */.       
35a40 20 72 63 20 3d 20 64 61 74 61 62 61 73 65 49 73   rc = databaseIs
35a50 55 6e 6d 6f 76 65 64 28 70 50 61 67 65 72 29 3b  Unmoved(pPager);
35a60 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
35a70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69  =SQLITE_OK ){.#i
35a80 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
35a90 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
35aa0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
35ab0 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65  qlite3JournalOpe
35ac0 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n(.             
35ad0 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a   pVfs, pPager->z
35ae0 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
35af0 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e  >jfd, flags, jrn
35b00 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67  lBufferSize(pPag
35b10 65 72 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b  er).          );
35b20 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20  .#else.         
35b30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
35b40 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
35b50 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
35b60 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
35b70 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  0);.#endif.     
35b80 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
35b90 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
35ba0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
35bb0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
35bc0 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20  );.    }.  .  . 
35bd0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
35be0 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
35bf0 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72  ader to the jour
35c00 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65  nal file and ope
35c10 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75  n .    ** the su
35c20 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  b-journal if nec
35c30 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20  essary..    */. 
35c40 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
35c50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
35c60 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20   TODO: Check if 
35c70 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65  all of these are
35c80 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64   really required
35c90 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65  . */.      pPage
35ca0 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
35cb0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
35cc0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
35cd0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
35ce0 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  er = 0;.      pP
35cf0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
35d00 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
35d10 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
35d20 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
35d30 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53    }..  if( rc!=S
35d40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35d50 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
35d60 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
35d70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50  Journal);.    pP
35d80 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
35d90 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
35da0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
35db0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
35dc0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
35dd0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
35de0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49  tate = PAGER_WRI
35df0 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20  TER_CACHEMOD;.  
35e00 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
35e10 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
35e20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
35e30 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  on on the specif
35e40 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74  ied pager object
35e50 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65  . If a .** write
35e60 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73  -transaction has
35e70 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70   already been op
35e80 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ened, this funct
35e90 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
35ea0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46  **.** If the exF
35eb0 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20  lag argument is 
35ec0 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75  false, then acqu
35ed0 69 72 65 20 61 74 20 6c 65 61 73 74 20 61 20 52  ire at least a R
35ee0 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20  ESERVED.** lock 
35ef0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
35f00 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20  file. If exFlag 
35f10 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63  is true, then ac
35f20 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a  quire at least.*
35f30 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  * an EXCLUSIVE l
35f40 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ock. If such a l
35f50 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
35f60 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20  eld, no locking 
35f70 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65  .** functions ne
35f80 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ed be called..**
35f90 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49  .** If the subjI
35fa0 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74  nMemory argument
35fb0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
35fc0 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e  en any sub-journ
35fd0 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74  al opened.** wit
35fe0 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hin this transac
35ff0 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65  tion will be ope
36000 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d  ned as an in-mem
36010 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a  ory file. This.*
36020 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20  * has no effect 
36030 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  if the sub-journ
36040 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  al is already op
36050 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79 20  ened (as it may 
36060 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69  be when.** runni
36070 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
36080 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65 20  mode) or if the 
36090 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73  transaction does
360a0 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a   not require a.*
360b0 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49  * sub-journal. I
360c0 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f  f the subjInMemo
360d0 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a  ry argument is z
360e0 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65  ero, then any re
360f0 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f  quired.** sub-jo
36100 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65  urnal is impleme
36110 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69  nted in-memory i
36120 66 20 70 50 61 67 65 72 20 69 73 20 61 6e 20 69  f pPager is an i
36130 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
36140 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20  e, .** or using 
36150 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
36160 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69   otherwise..*/.i
36170 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42  nt sqlite3PagerB
36180 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  egin(Pager *pPag
36190 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20  er, int exFlag, 
361a0 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  int subjInMemory
361b0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
361c0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
361d0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
361e0 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
361f0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 73 73 65  >errCode;.  asse
36200 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
36210 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
36220 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
36230 74 65 3c 50 41 47 45 52 5f 45 52 52 4f 52 20 29  te<PAGER_ERROR )
36240 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a  ;.  pPager->subj
36250 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73  InMemory = (u8)s
36260 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20  ubjInMemory;..  
36270 69 66 28 20 41 4c 57 41 59 53 28 70 50 61 67 65  if( ALWAYS(pPage
36280 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
36290 5f 52 45 41 44 45 52 29 20 29 7b 0a 20 20 20 20  _READER) ){.    
362a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
362b0 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
362c0 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55  ..    if( pagerU
362d0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
362e0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
362f0 20 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69 67   pager is config
36300 75 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b  ured to use lock
36310 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
36320 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20 20  ve, and an.     
36330 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   ** exclusive lo
36340 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
36350 73 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  se is not alread
36360 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69  y held, obtain i
36370 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a  t now..      */.
36380 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
36390 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
363a0 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63  && sqlite3WalExc
363b0 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65  lusiveMode(pPage
363c0 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a  r->pWal, -1) ){.
363d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
363e0 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
363f0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
36400 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
36410 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
36420 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
36430 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
36440 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
36450 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50  ExclusiveMode(pP
36460 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a  ager->pWal, 1);.
36470 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
36480 2a 20 47 72 61 62 20 74 68 65 20 77 72 69 74 65  * Grab the write
36490 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67   lock on the log
364a0 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73   file. If succes
364b0 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f  sful, upgrade to
364c0 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f  .      ** PAGER_
364d0 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20  RESERVED state. 
364e0 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
364f0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
36500 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  to the caller.. 
36510 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79       ** The busy
36520 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20  -handler is not 
36530 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68  invoked if anoth
36540 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c  er connection al
36550 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68  ready.      ** h
36560 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c  olds the write-l
36570 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ock. If possible
36580 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  , the upper laye
36590 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a  r will call it..
365a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
365b0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65  c = sqlite3WalBe
365c0 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74  ginWriteTransact
365d0 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
365e0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
365f0 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20      /* Obtain a 
36600 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
36610 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
36620 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61  le. If the exFla
36630 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20  g parameter.    
36640 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68    ** is true, th
36650 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75  en immediately u
36660 70 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61  pgrade this to a
36670 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
36680 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62  . The.      ** b
36690 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
366a0 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64  back can be used
366b0 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
366c0 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  to the EXCLUSIVE
366d0 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20  .      ** lock, 
366e0 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74  but not when obt
366f0 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52  aining the RESER
36700 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  VED lock..      
36710 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
36720 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
36730 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
36740 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
36750 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 46  SQLITE_OK && exF
36760 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72  lag ){.        r
36770 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
36780 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
36790 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
367a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
367b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
367c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
367d0 20 43 68 61 6e 67 65 20 74 6f 20 57 52 49 54 45   Change to WRITE
367e0 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 2e 0a  R_LOCKED state..
367f0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
36800 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74 73 20  * WAL mode sets 
36810 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 20  Pager.eState to 
36820 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
36830 4b 45 44 20 6f 72 20 43 41 43 48 45 4d 4f 44 0a  KED or CACHEMOD.
36840 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 69 74        ** when it
36850 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 74 72 61   has an open tra
36860 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65  nsaction, but ne
36870 76 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f 72 20  ver to DBMOD or 
36880 46 49 4e 49 53 48 45 44 2e 0a 20 20 20 20 20 20  FINISHED..      
36890 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61 75  ** This is becau
368a0 73 65 20 69 6e 20 74 68 6f 73 65 20 73 74 61 74  se in those stat
368b0 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72  es the code to r
368c0 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65 70 6f 69  oll back savepoi
368d0 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61  nt .      ** tra
368e0 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79 20 63 6f  nsactions may co
368f0 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  py data from the
36900 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74   sub-journal int
36910 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  o the database .
36920 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73        ** file as
36930 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20 74 68   well as into th
36940 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 57 68  e page cache. Wh
36950 69 63 68 20 77 6f 75 6c 64 20 62 65 20 69 6e 63  ich would be inc
36960 6f 72 72 65 63 74 20 69 6e 20 0a 20 20 20 20 20  orrect in .     
36970 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20   ** WAL mode..  
36980 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61      */.      pPa
36990 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
369a0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
369b0 44 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  D;.      pPager-
369c0 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50  >dbHintSize = pP
369d0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
369e0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
369f0 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  leSize = pPager-
36a00 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  >dbSize;.      p
36a10 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
36a20 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
36a30 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ze;.      pPager
36a40 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
36a50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
36a60 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
36a70 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OK || pPager->eS
36a80 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
36a90 45 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ER );.    assert
36aa0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
36ab0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
36ac0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
36ad0 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 61 73  LOCKED );.    as
36ae0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
36af0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
36b00 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52   );.  }..  PAGER
36b10 54 52 41 43 45 28 28 22 54 52 41 4e 53 41 43 54  TRACE(("TRANSACT
36b20 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ION %d\n", PAGER
36b30 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
36b40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
36b50 0a 2a 2a 20 57 72 69 74 65 20 70 61 67 65 20 70  .** Write page p
36b60 50 67 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  Pg onto the end 
36b70 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  of the rollback 
36b80 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74  journal..*/.stat
36b90 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
36ba0 4e 45 20 69 6e 74 20 70 61 67 65 72 41 64 64 50  NE int pagerAddP
36bb0 61 67 65 54 6f 52 6f 6c 6c 62 61 63 6b 4a 6f 75  ageToRollbackJou
36bc0 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29  rnal(PgHdr *pPg)
36bd0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
36be0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
36bf0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
36c00 20 63 6b 73 75 6d 3b 0a 20 20 63 68 61 72 20 2a   cksum;.  char *
36c10 70 44 61 74 61 32 3b 0a 20 20 69 36 34 20 69 4f  pData2;.  i64 iO
36c20 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
36c30 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57  rnalOff;..  /* W
36c40 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77  e should never w
36c50 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
36c60 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67  nal file the pag
36c70 65 20 74 68 61 74 0a 20 20 2a 2a 20 63 6f 6e 74  e that.  ** cont
36c80 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
36c90 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f  e locks.  The fo
36ca0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76  llowing assert v
36cb0 65 72 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 61  erifies.  ** tha
36cc0 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a  t we do not. */.
36cd0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
36ce0 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno!=PAGER_MJ_PG
36cf0 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20  NO(pPager) );.. 
36d00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
36d10 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d 70 50 61  >journalHdr<=pPa
36d20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
36d30 29 3b 0a 20 20 43 4f 44 45 43 32 28 70 50 61 67  );.  CODEC2(pPag
36d40 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20  er, pPg->pData, 
36d50 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65  pPg->pgno, 7, re
36d60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
36d70 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 63 6b  M, pData2);.  ck
36d80 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75  sum = pager_cksu
36d90 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70  m(pPager, (u8*)p
36da0 44 61 74 61 32 29 3b 0a 0a 20 20 2f 2a 20 45 76  Data2);..  /* Ev
36db0 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20 64  en if an IO or d
36dc0 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63  iskfull error oc
36dd0 63 75 72 73 20 77 68 69 6c 65 20 6a 6f 75 72 6e  curs while journ
36de0 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  alling the.  ** 
36df0 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c 6f 63  page in the bloc
36e00 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74 68 65  k above, set the
36e10 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61 67 20   need-sync flag 
36e20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 20 20  for the page..  
36e30 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68  ** Otherwise, wh
36e40 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
36e50 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
36e60 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a  k, the logic in.
36e70 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e    ** playback_on
36e80 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68  e_page() will th
36e90 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70 61 67  ink that the pag
36ea0 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  e needs to be re
36eb0 73 74 6f 72 65 64 0a 20 20 2a 2a 20 69 6e 20 74  stored.  ** in t
36ec0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
36ed0 2e 20 41 6e 64 20 69 66 20 61 6e 20 49 4f 20 65  . And if an IO e
36ee0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
36ef0 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 2a 2a  e doing so,.  **
36f00 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e   then corruption
36f10 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 2a   may follow..  *
36f20 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c  /.  pPg->flags |
36f30 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
36f40 43 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65  C;..  rc = write
36f50 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
36f60 66 64 2c 20 69 4f 66 66 2c 20 70 50 67 2d 3e 70  fd, iOff, pPg->p
36f70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  gno);.  if( rc!=
36f80 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
36f90 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
36fa0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
36fb0 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32  ger->jfd, pData2
36fc0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
36fd0 7a 65 2c 20 69 4f 66 66 2b 34 29 3b 0a 20 20 69  ze, iOff+4);.  i
36fe0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
36ff0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
37000 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
37010 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f  (pPager->jfd, iO
37020 66 66 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ff+pPager->pageS
37030 69 7a 65 2b 34 2c 20 63 6b 73 75 6d 29 3b 0a 20  ize+4, cksum);. 
37040 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
37050 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
37060 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55  .  IOTRACE(("JOU
37070 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c  T %p %d %lld %d\
37080 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
37090 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20  >pgno, .        
370a0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
370b0 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70  alOff, pPager->p
370c0 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 50 41 47  ageSize));.  PAG
370d0 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
370e0 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75  pager_writej_cou
370f0 6e 74 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  nt);.  PAGERTRAC
37100 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70  E(("JOURNAL %d p
37110 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
37120 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
37130 2c 0a 20 20 20 20 20 20 20 50 41 47 45 52 49 44  ,.       PAGERID
37140 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
37150 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 28 28 70  gno, .       ((p
37160 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
37170 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c  NEED_SYNC)?1:0),
37180 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
37190 70 50 67 29 29 29 3b 0a 0a 20 20 70 50 61 67 65  pPg)));..  pPage
371a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
371b0 20 38 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67   8 + pPager->pag
371c0 65 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  eSize;.  pPager-
371d0 3e 6e 52 65 63 2b 2b 3b 0a 20 20 61 73 73 65 72  >nRec++;.  asser
371e0 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
371f0 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 72 63  urnal!=0 );.  rc
37200 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
37210 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Set(pPager->pInJ
37220 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ournal, pPg->pgn
37230 6f 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  o);.  testcase( 
37240 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
37250 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63   );.  assert( rc
37260 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72  ==SQLITE_OK || r
37270 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
37280 29 3b 0a 20 20 72 63 20 7c 3d 20 61 64 64 54 6f  );.  rc |= addTo
37290 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
372a0 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67  (pPager, pPg->pg
372b0 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  no);.  assert( r
372c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
372d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
372e0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
372f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
37300 20 73 69 6e 67 6c 65 20 64 61 74 61 20 70 61 67   single data pag
37310 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20  e as writeable. 
37320 54 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  The page is writ
37330 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a  ten into the .**
37340 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72   main journal or
37350 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20   sub-journal as 
37360 72 65 71 75 69 72 65 64 2e 20 49 66 20 74 68 65  required. If the
37370 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
37380 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20   into.** one of 
37390 74 68 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68  the journals, th
373a0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
373b0 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 74 68  bit is set in th
373c0 65 20 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a  e .** Pager.pInJ
373d0 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 61 6e  ournal bitvec an
373e0 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  d the PagerSavep
373f0 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
37400 74 20 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20  t bitvecs.** of 
37410 61 6e 79 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  any open savepoi
37420 6e 74 73 20 61 73 20 61 70 70 72 6f 70 72 69 61  nts as appropria
37430 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  te..*/.static in
37440 74 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67  t pager_write(Pg
37450 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
37460 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
37470 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
37480 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
37490 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
374a0 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  ne is not called
374b0 20 75 6e 6c 65 73 73 20 61 20 77 72 69 74 65 2d   unless a write-
374c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
374d0 61 6c 72 65 61 64 79 20 0a 20 20 2a 2a 20 62 65  already .  ** be
374e0 65 6e 20 73 74 61 72 74 65 64 2e 20 54 68 65 20  en started. The 
374f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79  journal file may
37500 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f   or may not be o
37510 70 65 6e 20 61 74 20 74 68 69 73 20 70 6f 69 6e  pen at this poin
37520 74 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e 65  t..  ** It is ne
37530 76 65 72 20 63 61 6c 6c 65 64 20 69 6e 20 74 68  ver called in th
37540 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 0a 20  e ERROR state.. 
37550 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
37560 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
37570 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
37580 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67  D.       || pPag
37590 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
375a0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
375b0 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67  D.       || pPag
375c0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
375d0 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20  R_WRITER_DBMOD. 
375e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73   );.  assert( as
375f0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
37600 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
37610 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
37620 72 43 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 61 73  rCode==0 );.  as
37630 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 72 65  sert( pPager->re
37640 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 43  adOnly==0 );.  C
37650 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a  HECK_PAGE(pPg);.
37660 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61  .  /* The journa
37670 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20  l file needs to 
37680 62 65 20 6f 70 65 6e 65 64 2e 20 48 69 67 68 65  be opened. Highe
37690 72 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73  r level routines
376a0 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20   have already.  
376b0 2a 2a 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20  ** obtained the 
376c0 6e 65 63 65 73 73 61 72 79 20 6c 6f 63 6b 73 20  necessary locks 
376d0 74 6f 20 62 65 67 69 6e 20 74 68 65 20 77 72 69  to begin the wri
376e0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
376f0 62 75 74 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6c  but the.  ** rol
37700 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 69  lback journal mi
37710 67 68 74 20 6e 6f 74 20 79 65 74 20 62 65 20 6f  ght not yet be o
37720 70 65 6e 2e 20 4f 70 65 6e 20 69 74 20 6e 6f 77  pen. Open it now
37730 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
37740 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  case..  **.  ** 
37750 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66  This is done bef
37760 6f 72 65 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69  ore calling sqli
37770 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
37780 74 79 28 29 20 6f 6e 20 74 68 65 20 70 61 67 65  ty() on the page
37790 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  . .  ** Otherwis
377a0 65 2c 20 69 66 20 69 74 20 77 65 72 65 20 64 6f  e, if it were do
377b0 6e 65 20 61 66 74 65 72 20 63 61 6c 6c 69 6e 67  ne after calling
377c0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
377d0 6b 65 44 69 72 74 79 28 29 2c 20 74 68 65 6e 0a  keDirty(), then.
377e0 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6d 69    ** an error mi
377f0 67 68 74 20 6f 63 63 75 72 20 61 6e 64 20 74 68  ght occur and th
37800 65 20 70 61 67 65 72 20 77 6f 75 6c 64 20 65 6e  e pager would en
37810 64 20 75 70 20 69 6e 20 57 52 49 54 45 52 5f 4c  d up in WRITER_L
37820 4f 43 4b 45 44 20 73 74 61 74 65 0a 20 20 2a 2a  OCKED state.  **
37830 20 77 69 74 68 20 70 61 67 65 73 20 6d 61 72 6b   with pages mark
37840 65 64 20 61 73 20 64 69 72 74 79 20 69 6e 20 74  ed as dirty in t
37850 68 65 20 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20  he cache..  */. 
37860 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
37870 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
37880 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20  R_LOCKED ){.    
37890 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
378a0 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
378b0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
378c0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
378d0 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
378e0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
378f0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
37900 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 61 73 73  ACHEMOD );.  ass
37910 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
37920 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
37930 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68  );..  /* Mark th
37940 65 20 70 61 67 65 20 74 68 61 74 20 69 73 20 61  e page that is a
37950 62 6f 75 74 20 74 6f 20 62 65 20 6d 6f 64 69 66  bout to be modif
37960 69 65 64 20 61 73 20 64 69 72 74 79 2e 20 2a 2f  ied as dirty. */
37970 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
37980 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  MakeDirty(pPg);.
37990 0a 20 20 2f 2a 20 49 66 20 61 20 72 6f 6c 6c 62  .  /* If a rollb
379a0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 69 73 20 69  ack journal is i
379b0 6e 20 75 73 65 2c 20 74 68 65 6d 20 6d 61 6b 65  n use, them make
379c0 20 73 75 72 65 20 74 68 65 20 70 61 67 65 20 74   sure the page t
379d0 68 61 74 20 69 73 20 61 62 6f 75 74 0a 20 20 2a  hat is about.  *
379e0 2a 20 74 6f 20 63 68 61 6e 67 65 20 69 73 20 69  * to change is i
379f0 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
37a00 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 74 68  ournal, or if th
37a10 65 20 70 61 67 65 20 69 73 20 61 20 6e 65 77 20  e page is a new 
37a20 70 61 67 65 20 6f 66 66 0a 20 20 2a 2a 20 74 68  page off.  ** th
37a30 65 6e 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  en end of the fi
37a40 6c 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 69 74  le, make sure it
37a50 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 50 47   is marked as PG
37a60 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 2e 0a 20  HDR_NEED_SYNC.. 
37a70 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
37a80 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
37a90 6c 21 3d 30 29 20 3d 3d 20 69 73 4f 70 65 6e 28  l!=0) == isOpen(
37aa0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
37ab0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
37ac0 6e 4a 6f 75 72 6e 61 6c 21 3d 30 0a 20 20 20 26  nJournal!=0.   &
37ad0 26 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  & sqlite3BitvecT
37ae0 65 73 74 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65  estNotNull(pPage
37af0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
37b00 50 67 2d 3e 70 67 6e 6f 29 3d 3d 30 0a 20 20 29  Pg->pgno)==0.  )
37b10 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61  {.    assert( pa
37b20 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
37b30 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  )==0 );.    if( 
37b40 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65  pPg->pgno<=pPage
37b50 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b  r->dbOrigSize ){
37b60 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
37b70 72 41 64 64 50 61 67 65 54 6f 52 6f 6c 6c 62 61  rAddPageToRollba
37b80 63 6b 4a 6f 75 72 6e 61 6c 28 70 50 67 29 3b 0a  ckJournal(pPg);.
37b90 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
37ba0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
37bb0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
37bc0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
37bd0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
37be0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
37bf0 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29 7b  _WRITER_DBMOD ){
37c00 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c  .        pPg->fl
37c10 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
37c20 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 7d 0a  D_SYNC;.      }.
37c30 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
37c40 28 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67  (("APPEND %d pag
37c50 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
37c60 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
37c70 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
37c80 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20  r), pPg->pgno,. 
37c90 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50              ((pP
37ca0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
37cb0 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29  EED_SYNC)?1:0)))
37cc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
37cd0 2a 20 54 68 65 20 50 47 48 44 52 5f 44 49 52 54  * The PGHDR_DIRT
37ce0 59 20 62 69 74 20 69 73 20 73 65 74 20 61 62 6f  Y bit is set abo
37cf0 76 65 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  ve when the page
37d00 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 74 68   was added to th
37d10 65 20 64 69 72 74 79 2d 6c 69 73 74 0a 20 20 2a  e dirty-list.  *
37d20 2a 20 61 6e 64 20 62 65 66 6f 72 65 20 77 72 69  * and before wri
37d30 74 69 6e 67 20 74 68 65 20 70 61 67 65 20 69 6e  ting the page in
37d40 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  to the rollback 
37d50 6a 6f 75 72 6e 61 6c 2e 20 20 57 61 69 74 20 75  journal.  Wait u
37d60 6e 74 69 6c 20 6e 6f 77 2c 0a 20 20 2a 2a 20 61  ntil now,.  ** a
37d70 66 74 65 72 20 74 68 65 20 70 61 67 65 20 68 61  fter the page ha
37d80 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75  s been successfu
37d90 6c 6c 79 20 6a 6f 75 72 6e 61 6c 6c 65 64 2c 20  lly journalled, 
37da0 62 65 66 6f 72 65 20 73 65 74 74 69 6e 67 20 74  before setting t
37db0 68 65 0a 20 20 2a 2a 20 50 47 48 44 52 5f 57 52  he.  ** PGHDR_WR
37dc0 49 54 45 41 42 4c 45 20 62 69 74 20 74 68 61 74  ITEABLE bit that
37dd0 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
37de0 74 68 65 20 70 61 67 65 20 63 61 6e 20 62 65 20  the page can be 
37df0 73 61 66 65 6c 79 20 6d 6f 64 69 66 69 65 64 2e  safely modified.
37e00 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61  .  */.  pPg->fla
37e10 67 73 20 7c 3d 20 50 47 48 44 52 5f 57 52 49 54  gs |= PGHDR_WRIT
37e20 45 41 42 4c 45 3b 0a 20 20 0a 20 20 2f 2a 20 49  EABLE;.  .  /* I
37e30 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
37e40 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
37e50 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
37e60 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 2a 2a 20  not in it,.  ** 
37e70 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 70  then write the p
37e80 61 67 65 20 69 6e 74 6f 20 74 68 65 20 73 74 61  age into the sta
37e90 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
37ea0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
37eb0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20  r->nSavepoint>0 
37ec0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 75 62 6a  ){.    rc = subj
37ed0 6f 75 72 6e 61 6c 50 61 67 65 49 66 52 65 71 75  ournalPageIfRequ
37ee0 69 72 65 64 28 70 50 67 29 3b 0a 20 20 7d 0a 0a  ired(pPg);.  }..
37ef0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
37f00 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e  database size an
37f10 64 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 69  d return. */.  i
37f20 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
37f30 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20  e<pPg->pgno ){. 
37f40 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
37f50 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  e = pPg->pgno;. 
37f60 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
37f70 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
37f80 20 61 20 76 61 72 69 61 6e 74 20 6f 66 20 73 71   a variant of sq
37f90 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
37fa0 29 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e  ) that runs when
37fb0 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
37fc0 0a 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68  .** is larger th
37fd0 61 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  an the page size
37fe0 2e 20 20 53 51 4c 69 74 65 20 6d 61 6b 65 73 20  .  SQLite makes 
37ff0 74 68 65 20 28 72 65 61 73 6f 6e 61 62 6c 65 29  the (reasonable)
38000 20 61 73 73 75 6d 70 74 69 6f 6e 20 74 68 61 74   assumption that
38010 0a 2a 2a 20 61 6c 6c 20 62 79 74 65 73 20 6f 66  .** all bytes of
38020 20 61 20 73 65 63 74 6f 72 20 61 72 65 20 77 72   a sector are wr
38030 69 74 74 65 6e 20 74 6f 67 65 74 68 65 72 20 62  itten together b
38040 79 20 68 61 72 64 77 61 72 65 2e 20 20 48 65 6e  y hardware.  Hen
38050 63 65 2c 20 61 6c 6c 20 62 79 74 65 73 20 6f 66  ce, all bytes of
38060 0a 2a 2a 20 61 20 73 65 63 74 6f 72 20 6e 65 65  .** a sector nee
38070 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 6c  d to be journall
38080 65 64 20 69 6e 20 63 61 73 65 20 6f 66 20 61 20  ed in case of a 
38090 70 6f 77 65 72 20 6c 6f 73 73 20 69 6e 20 74 68  power loss in th
380a0 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 61  e middle of.** a
380b0 20 77 72 69 74 65 2e 0a 2a 2a 0a 2a 2a 20 55 73   write..**.** Us
380c0 75 61 6c 6c 79 2c 20 74 68 65 20 73 65 63 74 6f  ually, the secto
380d0 72 20 73 69 7a 65 20 69 73 20 6c 65 73 73 20 74  r size is less t
380e0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
380f0 74 68 65 20 70 61 67 65 20 73 69 7a 65 2c 20 69  the page size, i
38100 6e 20 77 68 69 63 68 0a 2a 2a 20 63 61 73 65 20  n which.** case 
38110 70 61 67 65 73 20 63 61 6e 20 62 65 20 69 6e 64  pages can be ind
38120 69 76 69 64 75 61 6c 6c 79 20 77 72 69 74 74 65  ividually writte
38130 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
38140 20 6f 6e 6c 79 20 72 75 6e 73 20 69 6e 20 74 68   only runs in th
38150 65 0a 2a 2a 20 65 78 63 65 70 74 69 6f 6e 61 6c  e.** exceptional
38160 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
38170 70 61 67 65 20 73 69 7a 65 20 69 73 20 73 6d 61  page size is sma
38180 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 73 65  ller than the se
38190 63 74 6f 72 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  ctor size..*/.st
381a0 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
381b0 4c 49 4e 45 20 69 6e 74 20 70 61 67 65 72 57 72  LINE int pagerWr
381c0 69 74 65 4c 61 72 67 65 53 65 63 74 6f 72 28 50  iteLargeSector(P
381d0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e  gHdr *pPg){.  in
381e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
381f0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
38200 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50  turn code */.  P
38210 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20  gno nPageCount; 
38220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
38230 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
38240 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
38250 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
38260 70 67 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  pg1;            
38270 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
38280 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63   page of the sec
38290 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74  tor pPg is locat
382a0 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 69 6e 74 20  ed on. */.  int 
382b0 6e 50 61 67 65 20 3d 20 30 3b 20 20 20 20 20 20  nPage = 0;      
382c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
382d0 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72  er of pages star
382e0 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a  ting at pg1 to j
382f0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
38300 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
38310 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
38320 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
38330 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20  t needSync = 0; 
38340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
38350 75 65 20 69 66 20 61 6e 79 20 70 61 67 65 20 68  ue if any page h
38360 61 73 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  as PGHDR_NEED_SY
38370 4e 43 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70  NC */.  Pager *p
38380 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
38390 67 65 72 3b 20 2f 2a 20 54 68 65 20 70 61 67 65  ger; /* The page
383a0 72 20 74 68 61 74 20 6f 77 6e 73 20 70 50 67 20  r that owns pPg 
383b0 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50  */.  Pgno nPageP
383c0 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67  erSector = (pPag
383d0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70  er->sectorSize/p
383e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
383f0 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
38400 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53 59 4e  doNotSpill NOSYN
38410 43 20 62 69 74 20 74 6f 20 31 2e 20 54 68 69 73  C bit to 1. This
38420 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20 63   is because we c
38430 61 6e 6e 6f 74 20 61 6c 6c 6f 77 0a 20 20 2a 2a  annot allow.  **
38440 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
38450 72 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  r to be written 
38460 62 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65  between the page
38470 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 0a 20  s journaled by. 
38480 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f   ** this functio
38490 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  n..  */.  assert
384a0 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73  ( !MEMDB );.  as
384b0 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64  sert( (pPager->d
384c0 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c  oNotSpill & SPIL
384d0 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 29 3d 3d 30  LFLAG_NOSYNC)==0
384e0 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 6f   );.  pPager->do
384f0 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c  NotSpill |= SPIL
38500 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 3b 0a 0a 20  LFLAG_NOSYNC;.. 
38510 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61   /* This trick a
38520 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68  ssumes that both
38530 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
38540 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61  nd sector-size a
38550 72 65 0a 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67  re.  ** an integ
38560 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49  er power of 2. I
38570 74 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20  t sets variable 
38580 70 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74  pg1 to the ident
38590 69 66 69 65 72 0a 20 20 2a 2a 20 6f 66 20 74 68  ifier.  ** of th
385a0 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
385b0 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
385c0 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20  s located on..  
385d0 2a 2f 0a 20 20 70 67 31 20 3d 20 28 28 70 50 67  */.  pg1 = ((pPg
385e0 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50  ->pgno-1) & ~(nP
385f0 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29  agePerSector-1))
38600 20 2b 20 31 3b 0a 0a 20 20 6e 50 61 67 65 43 6f   + 1;..  nPageCo
38610 75 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  unt = pPager->db
38620 53 69 7a 65 3b 0a 20 20 69 66 28 20 70 50 67 2d  Size;.  if( pPg-
38630 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74  >pgno>nPageCount
38640 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20   ){.    nPage = 
38650 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31  (pPg->pgno - pg1
38660 29 2b 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  )+1;.  }else if(
38670 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65   (pg1+nPagePerSe
38680 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75  ctor-1)>nPageCou
38690 6e 74 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20  nt ){.    nPage 
386a0 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70  = nPageCount+1-p
386b0 67 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  g1;.  }else{.   
386c0 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65   nPage = nPagePe
386d0 72 53 65 63 74 6f 72 3b 0a 20 20 7d 0a 20 20 61  r