/ Hex Artifact Content
Login

Artifact 1c08e5199b736756d3c5d84743ab4bfddbdb54495117ab63d6a56e5fc50fe614:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 53 51 4c 49  PAGERID(p) (SQLI
15a0: 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 2d  TE_PTR_TO_INT(p-
15b0: 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46 49  >fd)).#define FI
15c0: 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28  LEHANDLEID(fd) (
15d0: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
15e0: 54 28 66 64 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  T(fd))../*.** Th
15f0: 65 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 76  e Pager.eState v
1600: 61 72 69 61 62 6c 65 20 73 74 6f 72 65 73 20 74  ariable stores t
1610: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
1620: 65 27 20 6f 66 20 61 20 70 61 67 65 72 2e 20 41  e' of a pager. A
1630: 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79 20 62 65  .** pager may be
1640: 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f 66 20 74   in any one of t
1650: 68 65 20 73 65 76 65 6e 20 73 74 61 74 65 73 20  he seven states 
1660: 73 68 6f 77 6e 20 69 6e 20 74 68 65 20 66 6f 6c  shown in the fol
1670: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 20  lowing.** state 
1680: 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 20  diagram..**.**  
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a0: 20 20 20 20 20 20 20 20 20 20 4f 50 45 4e 20 3c            OPEN <
16b0: 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d 2b 0a 2a  ------+------+.*
16c0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
16e0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
16f0: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 20 20 56 20 20 20 20 20 20 20 20 20 7c 20 20 20    V         |   
1720: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
1730: 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d 2d 2d 2d        +---------
1740: 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d 2d 2d 2b  > READER-------+
1750: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1760: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1770: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1780: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1790: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
17a0: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17d0: 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 4c  <-------WRITER_L
17e0: 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20 45 52 52  OCKED------> ERR
17f0: 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  OR.**           
1800: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
1810: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1820: 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20 20 20 20      ^  .**      
1830: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1840: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1850: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1860: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
1870: 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41 43 48 45  ----WRITER_CACHE
1880: 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  MOD-------->|.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
18d0: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
18e0: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
18f0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1900: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
1910: 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d 2d 2d 2d  ITER_DBMOD------
1920: 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20  ---->|.**       
1930: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1940: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
1950: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
1960: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1970: 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20            V     
1980: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 3c                +<
19a0: 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 46 49 4e  ------WRITER_FIN
19b0: 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 2b 0a  ISHED-------->+.
19c0: 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74 20 6f 66  **.**.** List of
19d0: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
19e0: 6e 73 20 61 6e 64 20 74 68 65 20 43 20 5b 66 75  ns and the C [fu
19f0: 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20 70 65 72  nction] that per
1a00: 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a 2a 20 0a  forms each:.** .
1a10: 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20 20 20 20  **   OPEN       
1a20: 20 20 20 20 20 20 20 2d 3e 20 52 45 41 44 45 52         -> READER
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
1a40: 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
1a50: 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52 45 41 44  dLock].**   READ
1a60: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1a70: 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20 20   OPEN           
1a80: 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c 6f       [pager_unlo
1a90: 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52 45 41 44  ck].**.**   READ
1aa0: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1ab0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ac0: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1ad0: 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20 20 57 52  erBegin].**   WR
1ae0: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 20 20  ITER_LOCKED     
1af0: 2d 3e 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d  -> WRITER_CACHEM
1b00: 4f 44 20 20 20 20 20 5b 70 61 67 65 72 5f 6f 70  OD     [pager_op
1b10: 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20  en_journal].**  
1b20: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
1b30: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 44 42 4d     -> WRITER_DBM
1b40: 4f 44 20 20 20 20 20 20 20 20 5b 73 79 6e 63 4a  OD        [syncJ
1b50: 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20 57 52 49  ournal].**   WRI
1b60: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 2d  TER_DBMOD      -
1b70: 3e 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  > WRITER_FINISHE
1b80: 44 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61  D     [sqlite3Pa
1b90: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
1ba0: 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  e].**   WRITER_*
1bb0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41  **        -> REA
1bc0: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1bd0: 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e   [pager_end_tran
1be0: 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a 2a 20 20  saction].**.**  
1bf0: 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20   WRITER_***     
1c00: 20 20 20 2d 3e 20 45 52 52 4f 52 20 20 20 20 20     -> ERROR     
1c10: 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72            [pager
1c20: 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20 45 52 52  _error].**   ERR
1c30: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  OR             -
1c40: 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20  > OPEN          
1c50: 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c        [pager_unl
1c60: 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 20 20  ock].** .**.**  
1c70: 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  OPEN:.**.**    T
1c80: 68 65 20 70 61 67 65 72 20 73 74 61 72 74 73 20  he pager starts 
1c90: 75 70 20 69 6e 20 74 68 69 73 20 73 74 61 74 65  up in this state
1ca0: 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20 67 75 61  . Nothing is gua
1cb0: 72 61 6e 74 65 65 64 20 69 6e 20 74 68 69 73 0a  ranteed in this.
1cc0: 2a 2a 20 20 20 20 73 74 61 74 65 20 2d 20 74 68  **    state - th
1cd0: 65 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61  e file may or ma
1ce0: 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b 65 64 20  y not be locked 
1cf0: 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
1d00: 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20 20 20 75   size is.**    u
1d10: 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64 61 74 61  nknown. The data
1d20: 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  base may not be 
1d30: 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
1d40: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e 6f 20 72  .**.**    * No r
1d50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
1d60: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
1d70: 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 79 20  ve..**    * Any 
1d80: 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c 6f 63 6b  lock, or no lock
1d90: 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20 62 65 20   at all, may be 
1da0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1db0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
1dc0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
1dd0: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
1de0: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
1df0: 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72  es may not be tr
1e00: 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 52 45  usted..**.**  RE
1e10: 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 49  ADER:.**.**    I
1e20: 6e 20 74 68 69 73 20 73 74 61 74 65 20 61 6c 6c  n this state all
1e30: 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   the requirement
1e40: 73 20 66 6f 72 20 72 65 61 64 69 6e 67 20 74 68  s for reading th
1e50: 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 0a 2a  e database in .*
1e60: 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 28 6e  *    rollback (n
1e70: 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20 61 72 65  on-WAL) mode are
1e80: 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20 74 68 65   met. Unless the
1e90: 20 70 61 67 65 72 20 69 73 20 28 6f 72 20 72 65   pager is (or re
1ea0: 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 77 61 73  cently.**    was
1eb0: 29 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6c  ) in exclusive-l
1ec0: 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 61 20 75  ocking mode, a u
1ed0: 73 65 72 2d 6c 65 76 65 6c 20 72 65 61 64 20 74  ser-level read t
1ee0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a  ransaction is .*
1ef0: 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68 65 20 64  *    open. The d
1f00: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
1f10: 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73 20 73 74  known in this st
1f20: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
1f30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75 6e 6e 69  connection runni
1f40: 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f  ng with locking_
1f50: 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65 6e 74 65  mode=normal ente
1f60: 72 73 20 74 68 69 73 20 73 74 61 74 65 20 77 68  rs this state wh
1f70: 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f 70 65 6e  en.**    it open
1f80: 73 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  s a read-transac
1f90: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  tion on the data
1fa0: 62 61 73 65 20 61 6e 64 20 72 65 74 75 72 6e 73  base and returns
1fb0: 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20 20 20 20   to state.**    
1fc0: 4f 50 45 4e 20 61 66 74 65 72 20 74 68 65 20 72  OPEN after the r
1fd0: 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
1fe0: 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e 20 48 6f  is completed. Ho
1ff0: 77 65 76 65 72 20 61 20 63 6f 6e 6e 65 63 74 69  wever a connecti
2000: 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e 69 6e 67  on.**    running
2010: 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
2020: 3d 65 78 63 6c 75 73 69 76 65 20 28 69 6e 63 6c  =exclusive (incl
2030: 75 64 69 6e 67 20 74 65 6d 70 20 64 61 74 61 62  uding temp datab
2040: 61 73 65 73 29 20 72 65 6d 61 69 6e 73 20 69 6e  ases) remains in
2050: 0a 2a 2a 20 20 20 20 74 68 69 73 20 73 74 61 74  .**    this stat
2060: 65 20 65 76 65 6e 20 61 66 74 65 72 20 74 68 65  e even after the
2070: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
2080: 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20 54 68 65  n is closed. The
2090: 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20 20 20 20   only way.**    
20a0: 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  a locking_mode=e
20b0: 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e 65 63 74  xclusive connect
20c0: 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73 69 74 69  ion can transiti
20d0: 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45 52 20 74  on from READER t
20e0: 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20 69 73 20  o OPEN.**    is 
20f0: 76 69 61 20 74 68 65 20 45 52 52 4f 52 20 73 74  via the ERROR st
2100: 61 74 65 20 28 73 65 65 20 62 65 6c 6f 77 29 2e  ate (see below).
2110: 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20 41 20 72  .** .**    * A r
2120: 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead transaction 
2130: 6d 61 79 20 62 65 20 61 63 74 69 76 65 20 28 62  may be active (b
2140: 75 74 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ut a write-trans
2150: 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 29 2e 0a  action cannot)..
2160: 2a 2a 20 20 20 20 2a 20 41 20 53 48 41 52 45 44  **    * A SHARED
2170: 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
2180: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2190: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
21a0: 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a  *    * The dbSiz
21b0: 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62  e variable may b
21c0: 65 20 74 72 75 73 74 65 64 20 28 65 76 65 6e 20  e trusted (even 
21d0: 69 66 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  if a user-level 
21e0: 72 65 61 64 20 0a 2a 2a 20 20 20 20 20 20 74 72  read .**      tr
21f0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74  ansaction is not
2200: 20 61 63 74 69 76 65 29 2e 20 54 68 65 20 64 62   active). The db
2210: 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46  OrigSize and dbF
2220: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
2230: 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79 20 6e 6f  s.**      may no
2240: 74 20 62 65 20 74 72 75 73 74 65 64 20 61 74 20  t be trusted at 
2250: 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2a 20 20  this point..**  
2260: 20 20 2a 20 49 66 20 74 68 65 20 64 61 74 61 62    * If the datab
2270: 61 73 65 20 69 73 20 61 20 57 41 4c 20 64 61 74  ase is a WAL dat
2280: 61 62 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20  abase, then the 
2290: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  WAL connection i
22a0: 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20  s open..**    * 
22b0: 45 76 65 6e 20 69 66 20 61 20 72 65 61 64 2d 74  Even if a read-t
22c0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f  ransaction is no
22d0: 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 67 75  t open, it is gu
22e0: 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 0a 2a  aranteed that .*
22f0: 2a 20 20 20 20 20 20 74 68 65 72 65 20 69 73 20  *      there is 
2300: 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69  no hot-journal i
2310: 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
2320: 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52  m..**.**  WRITER
2330: 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  _LOCKED:.**.**  
2340: 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65    The pager move
2350: 73 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  s to this state 
2360: 66 72 6f 6d 20 52 45 41 44 45 52 20 77 68 65 6e  from READER when
2370: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
2380: 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73 20 66 69  tion.**    is fi
2390: 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  rst opened on th
23a0: 65 20 64 61 74 61 62 61 73 65 2e 20 49 6e 20 57  e database. In W
23b0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
23c0: 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73 20 0a 2a  te, all locks .*
23d0: 2a 20 20 20 20 72 65 71 75 69 72 65 64 20 74 6f  *    required to
23e0: 20 73 74 61 72 74 20 61 20 77 72 69 74 65 2d 74   start a write-t
23f0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 68  ransaction are h
2400: 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61 63 74 75  eld, but no actu
2410: 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64 69 66 69  al .**    modifi
2420: 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 63  cations to the c
2430: 61 63 68 65 20 6f 72 20 64 61 74 61 62 61 73 65  ache or database
2440: 20 68 61 76 65 20 74 61 6b 65 6e 20 70 6c 61 63   have taken plac
2450: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 72  e..**.**    In r
2460: 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 61 20  ollback mode, a 
2470: 52 45 53 45 52 56 45 44 20 6f 72 20 28 69 66 20  RESERVED or (if 
2480: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2490: 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20  was opened with 
24a0: 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20 45 58 43  .**    BEGIN EXC
24b0: 4c 55 53 49 56 45 29 20 45 58 43 4c 55 53 49 56  LUSIVE) EXCLUSIV
24c0: 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  E lock is obtain
24d0: 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
24e0: 73 65 20 66 69 6c 65 20 77 68 65 6e 0a 2a 2a 20  se file when.** 
24f0: 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20 74 68 69     moving to thi
2500: 73 20 73 74 61 74 65 2c 20 62 75 74 20 74 68 65  s state, but the
2510: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2520: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
2530: 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 20 20  or opened .**   
2540: 20 74 6f 20 69 6e 20 74 68 69 73 20 73 74 61 74   to in this stat
2550: 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  e. If the transa
2560: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
2570: 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
2580: 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20 20 20 69  k while .**    i
2590: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
25a0: 73 74 61 74 65 2c 20 61 6c 6c 20 74 68 61 74 20  state, all that 
25b0: 69 73 20 72 65 71 75 69 72 65 64 20 69 73 20 74  is required is t
25c0: 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
25d0: 61 62 61 73 65 20 0a 2a 2a 20 20 20 20 66 69 6c  abase .**    fil
25e0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 4e 20 57  e..**.**    IN W
25f0: 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42 65 67 69  AL mode, WalBegi
2600: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
2610: 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  n() is called to
2620: 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67 20 66 69   lock the log fi
2630: 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20 74 68 65  le..**    If the
2640: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72   connection is r
2650: 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b  unning with lock
2660: 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
2670: 76 65 2c 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ve, an attempt.*
2680: 2a 20 20 20 20 69 73 20 6d 61 64 65 20 74 6f 20  *    is made to 
2690: 6f 62 74 61 69 6e 20 61 6e 20 45 58 43 4c 55 53  obtain an EXCLUS
26a0: 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
26b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
26c0: 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74  *.**    * A writ
26d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
26e0: 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a   active..**    *
26f0: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2700: 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20 72 6f  on is open in ro
2710: 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20 61 20 52  llback-mode, a R
2720: 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74  ESERVED or great
2730: 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c 6f 63 6b  er .**      lock
2740: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2750: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2760: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
2770: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
2780: 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c 20 61 20   in WAL-mode, a 
2790: 57 41 4c 20 77 72 69 74 65 20 74 72 61 6e 73 61  WAL write transa
27a0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 69 73  ction.**      is
27b0: 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73 71 6c 69   open (i.e. sqli
27c0: 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65  te3WalBeginWrite
27d0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 68 61  Transaction() ha
27e0: 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75  s been successfu
27f0: 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63 61 6c 6c  lly.**      call
2800: 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ed)..**    * The
2810: 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53   dbSize, dbOrigS
2820: 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69  ize and dbFileSi
2830: 7a 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  ze variables are
2840: 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a 2a 20 20   all valid..**  
2850: 20 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73    * The contents
2860: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
2870: 63 68 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65  che have not bee
2880: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 20  n modified..**  
2890: 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20    * The journal 
28a0: 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20  file may or may 
28b0: 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20  not be open..** 
28c0: 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20 28 6e 6f     * Nothing (no
28d0: 74 20 65 76 65 6e 20 74 68 65 20 66 69 72 73 74  t even the first
28e0: 20 68 65 61 64 65 72 29 20 68 61 73 20 62 65 65   header) has bee
28f0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
2900: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
2910: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
2920: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 70 61 67  :.**.**    A pag
2930: 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d 20 57 52  er moves from WR
2940: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74  ITER_LOCKED stat
2950: 65 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  e to this state 
2960: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 0a 2a  when a page is.*
2970: 2a 20 20 20 20 66 69 72 73 74 20 6d 6f 64 69 66  *    first modif
2980: 69 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ied by the upper
2990: 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f 6c 6c 62   layer. In rollb
29a0: 61 63 6b 20 6d 6f 64 65 20 74 68 65 20 6a 6f 75  ack mode the jou
29b0: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
29c0: 69 73 20 6f 70 65 6e 65 64 20 28 69 66 20 69 74  is opened (if it
29d0: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
29e0: 6f 70 65 6e 29 20 61 6e 64 20 61 20 68 65 61 64  open) and a head
29f0: 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  er written to th
2a00: 65 0a 2a 2a 20 20 20 20 73 74 61 72 74 20 6f 66  e.**    start of
2a10: 20 69 74 2e 20 54 68 65 20 64 61 74 61 62 61 73   it. The databas
2a20: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 68  e file on disk h
2a30: 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69  as not been modi
2a40: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  fied..**.**    *
2a50: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
2a60: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
2a70: 2a 2a 20 20 20 20 2a 20 41 20 52 45 53 45 52 56  **    * A RESERV
2a80: 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
2a90: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2aa0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2ab0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ac0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2ad0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2ae0: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2af0: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2b00: 20 74 6f 20 69 74 2c 20 62 75 74 20 74 68 65 20   to it, but the 
2b10: 68 65 61 64 65 72 20 68 61 73 20 6e 6f 74 20 62  header has not b
2b20: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69  een synced to di
2b30: 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  sk..**    * The 
2b40: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2b50: 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65 20  page cache have 
2b60: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2b70: 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 44 42 4d  *.**  WRITER_DBM
2b80: 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54 68 65  OD:.**.**    The
2b90: 20 70 61 67 65 72 20 74 72 61 6e 73 69 74 69 6f   pager transitio
2ba0: 6e 73 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 43  ns from WRITER_C
2bb0: 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20 57 52 49  ACHEMOD into WRI
2bc0: 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 0a  TER_DBMOD state.
2bd0: 2a 2a 20 20 20 20 77 68 65 6e 20 69 74 20 6d 6f  **    when it mo
2be0: 64 69 66 69 65 73 20 74 68 65 20 63 6f 6e 74 65  difies the conte
2bf0: 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
2c00: 61 73 65 20 66 69 6c 65 2e 20 57 41 4c 20 63 6f  ase file. WAL co
2c10: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 20 20 20  nnections.**    
2c20: 6e 65 76 65 72 20 65 6e 74 65 72 20 74 68 69 73  never enter this
2c30: 20 73 74 61 74 65 20 28 73 69 6e 63 65 20 74 68   state (since th
2c40: 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  ey do not modify
2c50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c60: 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73 74 20 74  le,.**    just t
2c70: 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e 0a 2a 2a  he log file)..**
2c80: 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65  .**    * A write
2c90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2ca0: 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20  active..**    * 
2cb0: 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6f 72 20  An EXCLUSIVE or 
2cc0: 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
2cd0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
2ce0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
2cf0: 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66   * The journal f
2d00: 69 6c 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  ile is open and 
2d10: 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
2d20: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
2d30: 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e 64 20 73  n .**      and s
2d40: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
2d50: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2d60: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
2d70: 63 61 63 68 65 20 68 61 76 65 20 62 65 65 6e 20  cache have been 
2d80: 6d 6f 64 69 66 69 65 64 20 28 61 6e 64 20 70 6f  modified (and po
2d90: 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20 20 20 77  ssibly.**      w
2da0: 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 29 2e  ritten to disk).
2db0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 46  .**.**  WRITER_F
2dc0: 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  INISHED:.**.**  
2dd0: 20 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73    It is not poss
2de0: 69 62 6c 65 20 66 6f 72 20 61 20 57 41 4c 20 63  ible for a WAL c
2df0: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 65 6e 74  onnection to ent
2e00: 65 72 20 74 68 69 73 20 73 74 61 74 65 2e 0a 2a  er this state..*
2e10: 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c 6c 62 61  *.**    A rollba
2e20: 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72 20 63 68  ck-mode pager ch
2e30: 61 6e 67 65 73 20 74 6f 20 57 52 49 54 45 52 5f  anges to WRITER_
2e40: 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 20 66  FINISHED state f
2e50: 72 6f 6d 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  rom WRITER_DBMOD
2e60: 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 61 66 74  .**    state aft
2e70: 65 72 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  er the entire tr
2e80: 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
2e90: 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
2ea0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
2eb0: 0a 2a 2a 20 20 20 20 64 61 74 61 62 61 73 65 20  .**    database 
2ec0: 66 69 6c 65 2e 20 49 6e 20 74 68 69 73 20 73 74  file. In this st
2ed0: 61 74 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ate the transact
2ee0: 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f 6d 6d 69  ion may be commi
2ef0: 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a 2a 20 20  tted simply.**  
2f00: 20 20 62 79 20 66 69 6e 61 6c 69 7a 69 6e 67 20    by finalizing 
2f10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f20: 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49 54 45 52  . Once in WRITER
2f30: 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 2c  _FINISHED state,
2f40: 20 69 74 20 69 73 20 0a 2a 2a 20 20 20 20 6e 6f   it is .**    no
2f50: 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6d 6f  t possible to mo
2f60: 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73  dify the databas
2f70: 65 20 66 75 72 74 68 65 72 2e 20 41 74 20 74 68  e further. At th
2f80: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 75 70  is point, the up
2f90: 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61 79 65 72  per .**    layer
2fa0: 20 6d 75 73 74 20 65 69 74 68 65 72 20 63 6f 6d   must either com
2fb0: 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
2fc0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
2fd0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2fe0: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2ff0: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
3000: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
3010: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
3020: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
3030: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
3040: 20 20 20 20 2a 20 41 6c 6c 20 77 72 69 74 69 6e      * All writin
3050: 67 20 61 6e 64 20 73 79 6e 63 69 6e 67 20 6f 66  g and syncing of
3060: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 61 74   journal and dat
3070: 61 62 61 73 65 20 64 61 74 61 20 68 61 73 20 66  abase data has f
3080: 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20 20 20 20  inished..**     
3090: 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
30a0: 75 72 72 65 64 2c 20 61 6c 6c 20 74 68 61 74 20  urred, all that 
30b0: 72 65 6d 61 69 6e 73 20 69 73 20 74 6f 20 66 69  remains is to fi
30c0: 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
30d0: 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20 20 63 6f  al to.**      co
30e0: 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
30f0: 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f  tion. If an erro
3100: 72 20 64 69 64 20 6f 63 63 75 72 2c 20 74 68 65  r did occur, the
3110: 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6e 65 65   caller will nee
3120: 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20 72 6f 6c  d.**      to rol
3130: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
3140: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 20 45  ction. .**.**  E
3150: 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  RROR:.**.**    T
3160: 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  he ERROR state i
3170: 73 20 65 6e 74 65 72 65 64 20 77 68 65 6e 20 61  s entered when a
3180: 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d 66 75 6c  n IO or disk-ful
3190: 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c 75 64 69  l error (includi
31a0: 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f  ng.**    SQLITE_
31b0: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20 6f 63 63  IOERR_NOMEM) occ
31c0: 75 72 73 20 61 74 20 61 20 70 6f 69 6e 74 20 69  urs at a point i
31d0: 6e 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  n the code that 
31e0: 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20 20 20 20  makes it .**    
31f0: 64 69 66 66 69 63 75 6c 74 20 74 6f 20 62 65 20  difficult to be 
3200: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 69 6e  sure that the in
3210: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 73 74  -memory pager st
3220: 61 74 65 20 28 63 61 63 68 65 20 63 6f 6e 74 65  ate (cache conte
3230: 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64 62 20 73  nts, .**    db s
3240: 69 7a 65 20 65 74 63 2e 29 20 61 72 65 20 63 6f  ize etc.) are co
3250: 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 74 68  nsistent with th
3260: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3270: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 2a  e file-system..*
3280: 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f 72 61 72  *.**    Temporar
3290: 79 20 70 61 67 65 72 20 66 69 6c 65 73 20 6d 61  y pager files ma
32a0: 79 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f  y enter the ERRO
32b0: 52 20 73 74 61 74 65 2c 20 62 75 74 20 69 6e 2d  R state, but in-
32c0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 73 0a 2a 2a  memory pagers.**
32d0: 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a 2a 0a 2a      cannot..**.*
32e0: 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  *    For example
32f0: 2c 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  , if an IO error
3300: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70 65   occurs while pe
3310: 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f 6c 6c 62  rforming a rollb
3320: 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74 68 65 20  ack, .**    the 
3330: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
3340: 70 61 67 65 2d 63 61 63 68 65 20 6d 61 79 20 62  page-cache may b
3350: 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
3360: 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
3370: 0a 2a 2a 20 20 20 20 41 74 20 74 68 69 73 20 70  .**    At this p
3380: 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64 20 62 65  oint it would be
3390: 20 64 61 6e 67 65 72 6f 75 73 20 74 6f 20 63 68   dangerous to ch
33a0: 61 6e 67 65 20 62 61 63 6b 20 74 6f 20 52 45 41  ange back to REA
33b0: 44 45 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20  DER state.**    
33c0: 28 61 73 20 75 73 75 61 6c 6c 79 20 68 61 70 70  (as usually happ
33d0: 65 6e 73 20 61 66 74 65 72 20 61 20 72 6f 6c 6c  ens after a roll
33e0: 62 61 63 6b 29 2e 20 41 6e 79 20 73 75 62 73 65  back). Any subse
33f0: 71 75 65 6e 74 20 72 65 61 64 65 72 73 20 6d 69  quent readers mi
3400: 67 68 74 0a 2a 2a 20 20 20 20 72 65 70 6f 72 74  ght.**    report
3410: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
3420: 74 69 6f 6e 20 28 64 75 65 20 74 6f 20 74 68 65  tion (due to the
3430: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61   inconsistent ca
3440: 63 68 65 29 2c 20 61 6e 64 20 69 66 0a 2a 2a 20  che), and if.** 
3450: 20 20 20 74 68 65 79 20 75 70 67 72 61 64 65 20     they upgrade 
3460: 74 6f 20 77 72 69 74 65 72 73 2c 20 74 68 65 79  to writers, they
3470: 20 6d 61 79 20 69 6e 61 64 76 65 72 74 65 6e 74   may inadvertent
3480: 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64  ly corrupt the d
3490: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 66 69  atabase.**    fi
34a0: 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20 74 68 69  le. To avoid thi
34b0: 73 20 68 61 7a 61 72 64 2c 20 74 68 65 20 70 61  s hazard, the pa
34c0: 67 65 72 20 73 77 69 74 63 68 65 73 20 69 6e 74  ger switches int
34d0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
34e0: 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65 61 64 20  e.**    instead 
34f0: 6f 66 20 52 45 41 44 45 52 20 66 6f 6c 6c 6f 77  of READER follow
3500: 69 6e 67 20 73 75 63 68 20 61 6e 20 65 72 72 6f  ing such an erro
3510: 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 6e 63 65  r..**.**    Once
3520: 20 69 74 20 68 61 73 20 65 6e 74 65 72 65 64 20   it has entered 
3530: 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
3540: 20 61 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   any attempt to 
3550: 75 73 65 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  use the pager.**
3560: 20 20 20 20 74 6f 20 72 65 61 64 20 6f 72 20 77      to read or w
3570: 72 69 74 65 20 64 61 74 61 20 72 65 74 75 72 6e  rite data return
3580: 73 20 61 6e 20 65 72 72 6f 72 2e 20 45 76 65 6e  s an error. Even
3590: 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20 61 6c 6c  tually, once all
35a0: 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74 61 6e 64   .**    outstand
35b0: 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ing transactions
35c0: 20 68 61 76 65 20 62 65 65 6e 20 61 62 61 6e 64   have been aband
35d0: 6f 6e 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  oned, the pager 
35e0: 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 20 20  is able to.**   
35f0: 20 74 72 61 6e 73 69 74 69 6f 6e 20 62 61 63 6b   transition back
3600: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   to OPEN state, 
3610: 64 69 73 63 61 72 64 69 6e 67 20 74 68 65 20 63  discarding the c
3620: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a  ontents of the .
3630: 2a 2a 20 20 20 20 70 61 67 65 2d 63 61 63 68 65  **    page-cache
3640: 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 69   and any other i
3650: 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74 65 20 61  n-memory state a
3660: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
3670: 20 45 76 65 72 79 74 68 69 6e 67 0a 2a 2a 20 20   Everything.**  
3680: 20 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72    is reloaded fr
3690: 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c 20 69 66  om disk (and, if
36a0: 20 6e 65 63 65 73 73 61 72 79 2c 20 68 6f 74 2d   necessary, hot-
36b0: 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
36c0: 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a 20 20 20   peformed).**   
36d0: 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
36e0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 65 78 74  nsaction is next
36f0: 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 70   opened on the p
3700: 61 67 65 72 20 28 74 72 61 6e 73 69 74 69 6f 6e  ager (transition
3710: 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65 20 70 61  ing.**    the pa
3720: 67 65 72 20 69 6e 74 6f 20 52 45 41 44 45 52 20  ger into READER 
3730: 73 74 61 74 65 29 2e 20 41 74 20 74 68 61 74 20  state). At that 
3740: 70 6f 69 6e 74 20 74 68 65 20 73 79 73 74 65 6d  point the system
3750: 20 68 61 73 20 72 65 63 6f 76 65 72 65 64 20 0a   has recovered .
3760: 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68 65 20 65  **    from the e
3770: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  rror..**.**    S
3780: 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65  pecifically, the
3790: 20 70 61 67 65 72 20 6a 75 6d 70 73 20 69 6e 74   pager jumps int
37a0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
37b0: 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e if:.**.**     
37c0: 20 31 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63   1. An error occ
37d0: 75 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70  urs while attemp
37e0: 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ting a rollback.
37f0: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   This happens in
3800: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 75 6e 63  .**         func
3810: 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65  tion sqlite3Page
3820: 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 2a 2a 0a  rRollback()..**.
3830: 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e 20 65 72  **      2. An er
3840: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
3850: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 66   attempting to f
3860: 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75 72 6e 61  inalize a journa
3870: 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20  l file.**       
3880: 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 63 6f    following a co
3890: 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e  mmit in function
38a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
38b0: 6d 69 74 50 68 61 73 65 54 77 6f 28 29 2e 0a 2a  mitPhaseTwo()..*
38c0: 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20 41 6e 20  *.**      3. An 
38d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
38e0: 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  le attempting to
38f0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
3900: 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20 20 20 20  urnal or.**     
3910: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
3920: 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 70 61  e in function pa
3930: 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 6f  gerStress() in o
3940: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 0a  rder to free up.
3950: 2a 2a 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72  **         memor
3960: 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 6f  y..**.**    In o
3970: 74 68 65 72 20 63 61 73 65 73 2c 20 74 68 65 20  ther cases, the 
3980: 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
3990: 64 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20  d to the b-tree 
39a0: 6c 61 79 65 72 2e 20 54 68 65 20 62 2d 74 72 65  layer. The b-tre
39b0: 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72 20 74 68  e.**    layer th
39c0: 65 6e 20 61 74 74 65 6d 70 74 73 20 61 20 72 6f  en attempts a ro
39d0: 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
39e0: 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 63  . If the error c
39f0: 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  ondition .**    
3a00: 70 65 72 73 69 73 74 73 2c 20 74 68 65 20 70 61  persists, the pa
3a10: 67 65 72 20 65 6e 74 65 72 73 20 74 68 65 20 45  ger enters the E
3a20: 52 52 4f 52 20 73 74 61 74 65 20 76 69 61 20 63  RROR state via c
3a30: 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 61 62 6f  ondition (1) abo
3a40: 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 6f 6e  ve..**.**    Con
3a50: 64 69 74 69 6f 6e 20 28 33 29 20 69 73 20 6e 65  dition (3) is ne
3a60: 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20  cessary because 
3a70: 69 74 20 63 61 6e 20 62 65 20 74 72 69 67 67 65  it can be trigge
3a80: 72 65 64 20 62 79 20 61 20 72 65 61 64 2d 6f 6e  red by a read-on
3a90: 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74 65 6d 65  ly.**    stateme
3aa0: 6e 74 20 65 78 65 63 75 74 65 64 20 77 69 74 68  nt executed with
3ab0: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
3ac0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
3ad0: 69 66 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  if the error.** 
3ae0: 20 20 20 63 6f 64 65 20 77 65 72 65 20 73 69 6d     code were sim
3af0: 70 6c 79 20 72 65 74 75 72 6e 65 64 20 74 6f 20  ply returned to 
3b00: 74 68 65 20 75 73 65 72 2c 20 74 68 65 20 62 2d  the user, the b-
3b10: 74 72 65 65 20 6c 61 79 65 72 20 77 6f 75 6c 64  tree layer would
3b20: 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75 74 6f 6d   not.**    autom
3b30: 61 74 69 63 61 6c 6c 79 20 61 74 74 65 6d 70 74  atically attempt
3b40: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20   a rollback, as 
3b50: 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  it assumes that 
3b60: 61 6e 20 65 72 72 6f 72 20 69 6e 20 61 0a 2a 2a  an error in a.**
3b70: 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79 20 73 74      read-only st
3b80: 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f 74 20 6c  atement cannot l
3b90: 65 61 76 65 20 74 68 65 20 70 61 67 65 72 20 69  eave the pager i
3ba0: 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 20  n an internally 
3bb0: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 0a 2a 2a  inconsistent .**
3bc0: 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a      state..**.**
3bd0: 20 20 20 20 2a 20 54 68 65 20 50 61 67 65 72 2e      * The Pager.
3be0: 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
3bf0: 20 69 73 20 73 65 74 20 74 6f 20 73 6f 6d 65 74   is set to somet
3c00: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
3c10: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 20 20  SQLITE_OK..**   
3c20: 20 2a 20 54 68 65 72 65 20 61 72 65 20 6f 6e 65   * There are one
3c30: 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e   or more outstan
3c40: 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
3c50: 74 6f 20 70 61 67 65 73 20 28 61 66 74 65 72 20  to pages (after 
3c60: 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c 61 73 74  the.**      last
3c70: 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 64 72   reference is dr
3c80: 6f 70 70 65 64 20 74 68 65 20 70 61 67 65 72 20  opped the pager 
3c90: 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62 61 63 6b  should move back
3ca0: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 29 2e   to OPEN state).
3cb0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 70 61 67  .**    * The pag
3cc0: 65 72 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 2d  er is not an in-
3cd0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a 2a 2a  memory pager..**
3ce0: 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 73      .**.** Notes
3cf0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 20 70 61  :.**.**   * A pa
3d00: 67 65 72 20 69 73 20 6e 65 76 65 72 20 69 6e 20  ger is never in 
3d10: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 6f 72 20  WRITER_DBMOD or 
3d20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
3d30: 73 74 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20  state if the.** 
3d40: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69      connection i
3d50: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f  s open in WAL mo
3d60: 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e 6e 65 63  de. A WAL connec
3d70: 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69  tion is always i
3d80: 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 6f 66 20  n one.**     of 
3d90: 74 68 65 20 66 69 72 73 74 20 66 6f 75 72 20 73  the first four s
3da0: 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  tates..**.**   *
3db0: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20 63 6f 6e   Normally, a con
3dc0: 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20 69 6e 20  nection open in 
3dd0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 69  exclusive mode i
3de0: 73 20 6e 65 76 65 72 20 69 6e 20 50 41 47 45 52  s never in PAGER
3df0: 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20 73 74 61  _OPEN.**     sta
3e00: 74 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  te. There are tw
3e10: 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a 20 69 6d  o exceptions: im
3e20: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
3e30: 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 68  exclusive-mode h
3e40: 61 73 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 74  as.**     been t
3e50: 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64 20 62 65  urned on (and be
3e60: 66 6f 72 65 20 61 6e 79 20 72 65 61 64 20 6f 72  fore any read or
3e70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
3e80: 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20 20 20 20  ons are .**     
3e90: 65 78 65 63 75 74 65 64 29 2c 20 61 6e 64 20 77  executed), and w
3ea0: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
3eb0: 20 6c 65 61 76 69 6e 67 20 74 68 65 20 22 65 72   leaving the "er
3ec0: 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a 2a 0a 2a  ror state"..**.*
3ed0: 2a 20 20 20 2a 20 53 65 65 20 61 6c 73 6f 3a 20  *   * See also: 
3ee0: 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
3ef0: 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  te()..*/.#define
3f00: 20 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20   PAGER_OPEN     
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 23               0.#
3f20: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52 45 41  define PAGER_REA
3f30: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
3f40: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41 47     1.#define PAG
3f50: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
3f60: 20 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69           2.#defi
3f70: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f80: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 20 20 33  CACHEMOD       3
3f90: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3fa0: 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20  RITER_DBMOD     
3fb0: 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 50       4.#define P
3fc0: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
3fd0: 53 48 45 44 20 20 20 20 20 20 20 35 0a 23 64 65  SHED       5.#de
3fe0: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 4f 52  fine PAGER_ERROR
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 50 61   6../*.** The Pa
4010: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
4020: 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  le is almost alw
4030: 61 79 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6f  ays set to one o
4040: 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  f the .** follow
4050: 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73 74 61 74  ing locking-stat
4060: 65 73 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  es, according to
4070: 20 74 68 65 20 6c 6f 63 6b 20 63 75 72 72 65 6e   the lock curren
4080: 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a 2a 20 74  tly held on.** t
4090: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
40a0: 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45  : NO_LOCK, SHARE
40b0: 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
40c0: 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49  _LOCK or EXCLUSI
40d0: 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54 68 69 73  VE_LOCK..** This
40e0: 20 76 61 72 69 61 62 6c 65 20 69 73 20 6b 65 70   variable is kep
40f0: 74 20 75 70 20 74 6f 20 64 61 74 65 20 61 73 20  t up to date as 
4100: 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b 65 6e 20  locks are taken 
4110: 61 6e 64 20 72 65 6c 65 61 73 65 64 20 62 79 0a  and released by.
4120: 2a 2a 20 74 68 65 20 70 61 67 65 72 4c 6f 63 6b  ** the pagerLock
4130: 44 62 28 29 20 61 6e 64 20 70 61 67 65 72 55 6e  Db() and pagerUn
4140: 6c 6f 63 6b 44 62 28 29 20 77 72 61 70 70 65 72  lockDb() wrapper
4150: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
4160: 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f 72 20 78  VFS xLock() or x
4170: 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73  Unlock() returns
4180: 20 61 6e 20 65 72 72 6f 72 20 6f 74 68 65 72 20   an error other 
4190: 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  than SQLITE_BUSY
41a0: 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65 20 6f 66  .** (i.e. one of
41b0: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
41c0: 52 20 73 75 62 74 79 70 65 73 29 2c 20 69 74 20  R subtypes), it 
41d0: 69 73 20 6e 6f 74 20 63 6c 65 61 72 20 77 68 65  is not clear whe
41e0: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
41f0: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 61 73  he operation was
4200: 20 73 75 63 63 65 73 73 66 75 6c 2e 20 49 6e 20   successful. In 
4210: 74 68 65 73 65 20 63 69 72 63 75 6d 73 74 61 6e  these circumstan
4220: 63 65 73 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  ces pagerLockDb(
4230: 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65 72 55 6e  ) and.** pagerUn
4240: 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65 20 61 20  lockDb() take a 
4250: 63 6f 6e 73 65 72 76 61 74 69 76 65 20 61 70 70  conservative app
4260: 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b 20 69 73  roach - eLock is
4270: 20 61 6c 77 61 79 73 20 75 70 64 61 74 65 64 0a   always updated.
4280: 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63 6b 69 6e  ** when unlockin
4290: 67 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  g the file, and 
42a0: 6f 6e 6c 79 20 75 70 64 61 74 65 64 20 77 68 65  only updated whe
42b0: 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69  n locking the fi
42c0: 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20 56 46 53  le if the.** VFS
42d0: 20 63 61 6c 6c 20 69 73 20 73 75 63 63 65 73 73   call is success
42e0: 66 75 6c 2e 20 54 68 69 73 20 77 61 79 2c 20 74  ful. This way, t
42f0: 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76  he Pager.eLock v
4300: 61 72 69 61 62 6c 65 20 6d 61 79 20 62 65 20 73  ariable may be s
4310: 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65 73 73 20  et.** to a less 
4320: 65 78 63 6c 75 73 69 76 65 20 28 6c 6f 77 65 72  exclusive (lower
4330: 29 20 76 61 6c 75 65 20 74 68 61 6e 20 74 68 65  ) value than the
4340: 20 6c 6f 63 6b 20 74 68 61 74 20 69 73 20 61 63   lock that is ac
4350: 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a 2a 20 61  tually held.** a
4360: 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
4370: 65 6c 2c 20 62 75 74 20 69 74 20 69 73 20 6e 65  el, but it is ne
4380: 76 65 72 20 73 65 74 20 74 6f 20 61 20 6d 6f 72  ver set to a mor
4390: 65 20 65 78 63 6c 75 73 69 76 65 20 76 61 6c 75  e exclusive valu
43a0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  e..**.** This is
43b0: 20 75 73 75 61 6c 6c 79 20 73 61 66 65 2e 20 49   usually safe. I
43c0: 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20 66 61 69  f an xUnlock fai
43d0: 6c 73 20 6f 72 20 61 70 70 65 61 72 73 20 74 6f  ls or appears to
43e0: 20 66 61 69 6c 2c 20 74 68 65 72 65 20 6d 61 79   fail, there may
43f0: 20 0a 2a 2a 20 62 65 20 61 20 66 65 77 20 72 65   .** be a few re
4400: 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b 28 29 20  dundant xLock() 
4410: 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f 63 6b 20  calls or a lock 
4420: 6d 61 79 20 62 65 20 68 65 6c 64 20 66 6f 72 20  may be held for 
4430: 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a 2a 20 72  longer than.** r
4440: 65 71 75 69 72 65 64 2c 20 62 75 74 20 6e 6f 74  equired, but not
4450: 68 69 6e 67 20 72 65 61 6c 6c 79 20 67 6f 65 73  hing really goes
4460: 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68   wrong..**.** Th
4470: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77  e exception is w
4480: 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
4490: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
44a0: 64 20 61 73 20 74 68 65 20 70 61 67 65 72 20 6d  d as the pager m
44b0: 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20 45 52 52  oves.** from ERR
44c0: 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  OR to OPEN state
44d0: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
44e0: 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 68  there may be a h
44f0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
4500: 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  .** in the file-
4510: 73 79 73 74 65 6d 20 74 68 61 74 20 6e 65 65 64  system that need
4520: 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
4530: 61 63 6b 20 28 61 73 20 70 61 72 74 20 6f 66 20  ack (as part of 
4540: 61 6e 20 4f 50 45 4e 2d 3e 53 48 41 52 45 44 0a  an OPEN->SHARED.
4550: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c 20 62  ** transition, b
4560: 79 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  y the same pager
4570: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29 2e 20   or any other). 
4580: 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78  If the call to x
4590: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61 69 6c  Unlock().** fail
45a0: 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
45b0: 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
45c0: 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20 61 6e   left holding an
45d0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
45e0: 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63 6f 6e   this.** can con
45f0: 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  fuse the call to
4600: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4610: 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64 65 20  ock() call made 
4620: 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a 2a 2a  later as part.**
4630: 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   of hot-journal 
4640: 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  detection..**.**
4650: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4660: 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e 65 64  ock() is defined
4670: 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20 74 72   as returning tr
4680: 75 65 20 22 69 66 20 74 68 65 72 65 20 69 73 20  ue "if there is 
4690: 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a 20 6c  a RESERVED .** l
46a0: 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68 69 73  ock held by this
46b0: 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e 79 20   process or any 
46c0: 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43 68 65  others". So xChe
46d0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
46e0: 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 72  ay .** return tr
46f0: 75 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63  ue because the c
4700: 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69 73 20  aller itself is 
4710: 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
4720: 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74 0a 2a  SIVE lock (but.*
4730: 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77 20 69  * doesn't know i
4740: 74 20 62 65 63 61 75 73 65 20 6f 66 20 61 20 70  t because of a p
4750: 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20 69 6e  revious error in
4760: 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20 74 68   xUnlock). If th
4770: 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 61 20  is happens.** a 
4780: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot-journal may 
4790: 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f 72 20  be mistaken for 
47a0: 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e 67 20  a journal being 
47b0: 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 61 63  created by an ac
47c0: 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
47d0: 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 70  ion in another p
47e0: 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e 67 20  rocess, causing 
47f0: 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64 20 66  SQLite to read f
4800: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
4810: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f 6c 6c  .** without roll
4820: 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  ing it back..**.
4830: 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
4840: 64 20 74 68 69 73 2c 20 69 66 20 61 20 63 61 6c  d this, if a cal
4850: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 20 66  l to xUnlock() f
4860: 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f 63 6b  ails when unlock
4870: 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ing the.** datab
4880: 61 73 65 20 69 6e 20 74 68 65 20 45 52 52 4f 52  ase in the ERROR
4890: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 4c   state, Pager.eL
48a0: 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e  ock is set to UN
48b0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74 0a 2a  KNOWN_LOCK. It.*
48c0: 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65  * is only change
48d0: 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65 61 6c  d back to a real
48e0: 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 61   locking state a
48f0: 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66 75  fter a successfu
4900: 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78 4c 6f  l call.** to xLo
4910: 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e 20 41  ck(EXCLUSIVE). A
4920: 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20 74 6f  lso, the code to
4930: 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e 53 48   do the OPEN->SH
4940: 41 52 45 44 20 73 74 61 74 65 20 74 72 61 6e 73  ARED state trans
4950: 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73 20 74  ition.** omits t
4960: 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68  he check for a h
4970: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 50 61  ot-journal if Pa
4980: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4990: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
49a0: 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73 74 65   .** lock. Inste
49b0: 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73 20 61  ad, it assumes a
49c0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65 78 69   hot-journal exi
49d0: 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e 73 20  sts and obtains 
49e0: 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  an EXCLUSIVE.** 
49f0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
4a00: 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
4a10: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
4a20: 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53 65 65  oll it back. See
4a30: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50 61 67   function.** Pag
4a40: 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 66  erSharedLock() f
4a50: 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 2e 0a  or more detail..
4a60: 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63  **.** Pager.eLoc
4a70: 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 73 65  k may only be se
4a80: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
4a90: 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  K when the pager
4aa0: 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47 45 52   is in .** PAGER
4ab0: 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a 2f 0a  _OPEN state..*/.
4ac0: 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57 4e 5f  #define UNKNOWN_
4ad0: 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20 20 20  LOCK            
4ae0: 20 20 20 20 28 45 58 43 4c 55 53 49 56 45 5f 4c      (EXCLUSIVE_L
4af0: 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 41 20  OCK+1)../*.** A 
4b00: 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69  macro used for i
4b10: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65  nvoking the code
4b20: 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  c if there is on
4b30: 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e.*/.#ifdef SQLI
4b40: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64  TE_HAS_CODEC.# d
4b50: 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44  efine CODEC1(P,D
4b60: 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69 66  ,N,X,E) \.    if
4b70: 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20 50  ( P->xCodec && P
4b80: 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64  ->xCodec(P->pCod
4b90: 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b 20  ec,D,N,X)==0 ){ 
4ba0: 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f  E; }.# define CO
4bb0: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f  DEC2(P,D,N,X,E,O
4bc0: 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e 78  ) \.    if( P->x
4bd0: 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28 63  Codec==0 ){ O=(c
4be0: 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c 0a  har*)D; }else \.
4bf0: 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61 72      if( (O=(char
4c00: 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  *)(P->xCodec(P->
4c10: 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29 3d  pCodec,D,N,X)))=
4c20: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73 65  =0 ){ E; }.#else
4c30: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
4c40: 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f 2a  (P,D,N,X,E)   /*
4c50: 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69   NO-OP */.# defi
4c60: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4c70: 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a 29  X,E,O) O=(char*)
4c80: 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  D.#endif../*.** 
4c90: 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  The maximum allo
4ca0: 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  wed sector size.
4cb0: 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65 20 78   64KiB. If the x
4cc0: 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74  Sectorsize() met
4cd0: 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20  hod .** returns 
4ce0: 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74  a value larger t
4cf0: 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d  han this, then M
4d00: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69  AX_SECTOR_SIZE i
4d10: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
4d20: 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f  ** This could co
4d30: 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73 65 20  nceivably cause 
4d40: 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f  corruption follo
4d50: 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69  wing a power fai
4d60: 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20  lure on.** such 
4d70: 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69  a system. This i
4d80: 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75  s currently an u
4d90: 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69  ndocumented limi
4da0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41  t..*/.#define MA
4db0: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78  X_SECTOR_SIZE 0x
4dc0: 31 30 30 30 30 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e  10000.../*.** An
4dd0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4de0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
4df0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
4e00: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
4e10: 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61  e.** savepoint a
4e20: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  nd statement tra
4e30: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
4e40: 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68  system. All such
4e50: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61   structures.** a
4e60: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
4e70: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
4e80: 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68  t[] array, which
4e90: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
4ea0: 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69  d.** resized usi
4eb0: 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  ng sqlite3Reallo
4ec0: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  c()..**.** When 
4ed0: 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63  a savepoint is c
4ee0: 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65  reated, the Page
4ef0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
4f00: 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a  ffset field is.*
4f10: 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61  * set to 0. If a
4f20: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
4f30: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
4f40: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
4f50: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61   while.** the sa
4f60: 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
4f70: 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73  e, then iHdrOffs
4f80: 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
4f90: 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a   byte offset .**
4fa0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
4fb0: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
4fc0: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
4fd0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
4fe0: 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
4ff0: 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e  before the journ
5000: 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20  al-header. This 
5010: 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69  is required duri
5020: 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  ng savepoint.** 
5030: 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61  rollback (see pa
5040: 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
5050: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65  oint())..*/.type
5060: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
5070: 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53  Savepoint PagerS
5080: 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74  avepoint;.struct
5090: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
50a0: 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  {.  i64 iOffset;
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66   /* Starting off
50d0: 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72  set in main jour
50e0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
50f0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
5100: 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
5110: 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ve */.  Bitvec *
5120: 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  pInSavepoint;   
5130: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70       /* Set of p
5140: 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76  ages in this sav
5150: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f  epoint */.  Pgno
5160: 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20   nOrig;         
5170: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
5180: 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  inal number of p
5190: 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a  ages in file */.
51a0: 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20    Pgno iSubRec; 
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51c0: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
51d0: 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a   record in sub-j
51e0: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
51f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
5200: 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61  L.  u32 aWalData
5210: 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e  [WAL_SAVEPOINT_N
5220: 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a  DATA];        /*
5230: 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63   WAL savepoint c
5240: 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66  ontext */.#endif
5250: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 73 20  .};../*.** Bits 
5260: 6f 66 20 74 68 65 20 50 61 67 65 72 2e 64 6f 4e  of the Pager.doN
5270: 6f 74 53 70 69 6c 6c 20 66 6c 61 67 2e 20 20 53  otSpill flag.  S
5280: 65 65 20 66 75 72 74 68 65 72 20 64 65 73 63 72  ee further descr
5290: 69 70 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a 2a 2f  iption below..*/
52a0: 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c  .#define SPILLFL
52b0: 41 47 5f 4f 46 46 20 20 20 20 20 20 20 20 20 30  AG_OFF         0
52c0: 78 30 31 20 2f 2a 20 4e 65 76 65 72 20 73 70 69  x01 /* Never spi
52d0: 6c 6c 20 63 61 63 68 65 2e 20 20 53 65 74 20 76  ll cache.  Set v
52e0: 69 61 20 70 72 61 67 6d 61 20 2a 2f 0a 23 64 65  ia pragma */.#de
52f0: 66 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 52  fine SPILLFLAG_R
5300: 4f 4c 4c 42 41 43 4b 20 20 20 20 30 78 30 32 20  OLLBACK    0x02 
5310: 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69  /* Current rolli
5320: 6e 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e  ng back, so do n
5330: 6f 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66  ot spill */.#def
5340: 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f  ine SPILLFLAG_NO
5350: 53 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 2f  SYNC      0x04 /
5360: 2a 20 53 70 69 6c 6c 20 69 73 20 6f 6b 2c 20 62  * Spill is ok, b
5370: 75 74 20 64 6f 20 6e 6f 74 20 73 79 6e 63 20 2a  ut do not sync *
5380: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 70 65 6e  /../*.** An open
5390: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61   page cache is a
53a0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74  n instance of st
53b0: 72 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65  ruct Pager. A de
53c0: 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20  scription of.** 
53d0: 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65  some of the more
53e0: 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65   important membe
53f0: 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c  r variables foll
5400: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74  ows:.**.** eStat
5410: 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75  e.**.**   The cu
5420: 72 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66  rrent 'state' of
5430: 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
5440: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
5450: 6e 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20  nt and state.** 
5460: 20 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20    diagram above 
5470: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
5480: 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73  n of the pager s
5490: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63  tate..**.** eLoc
54a0: 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20  k.**.**   For a 
54b0: 72 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74  real on-disk dat
54c0: 61 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65  abase, the curre
54d0: 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  nt lock held on 
54e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
54f0: 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b  e -.**   NO_LOCK
5500: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52  , SHARED_LOCK, R
5510: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20  ESERVED_LOCK or 
5520: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a  EXCLUSIVE_LOCK..
5530: 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65  **.**   For a te
5540: 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
5550: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e  mory database (n
5560: 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20  either of which 
5570: 72 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20  require any.**  
5580: 20 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61   locks), this va
5590: 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73  riable is always
55a0: 20 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56   set to EXCLUSIV
55b0: 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75  E_LOCK. Since su
55c0: 63 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65  ch.**   database
55d0: 73 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61  s always have Pa
55e0: 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64  ger.exclusiveMod
55f0: 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b  e==1, this trick
5600: 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20  s the pager.**  
5610: 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e   logic into thin
5620: 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72  king that it alr
5630: 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65  eady has all the
5640: 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65   locks it will e
5650: 76 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61  ver.**   need (a
5660: 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20  nd no reason to 
5670: 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a  release them)..*
5680: 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28  *.**   In some (
5690: 6f 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73  obscure) circums
56a0: 74 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72  tances, this var
56b0: 69 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62  iable may also b
56c0: 65 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e  e set to.**   UN
56d0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20  KNOWN_LOCK. See 
56e0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
56f0: 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66  e the #define of
5700: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
5710: 72 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a  r.**   details..
5720: 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e  **.** changeCoun
5730: 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  tDone.**.**   Th
5740: 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  is boolean varia
5750: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ble is used to m
5760: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
5770: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5780: 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79   .**   (the 4-by
5790: 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  te header field 
57a0: 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32  at byte offset 2
57b0: 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  4 of the databas
57c0: 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20  e file) is .**  
57d0: 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72   not updated mor
57e0: 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63  e often than nec
57f0: 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20  essary. .**.**  
5800: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72   It is set to tr
5810: 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e  ue when the chan
5820: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
5830: 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69   is updated, whi
5840: 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c  ch .**   can onl
5850: 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65  y happen if an e
5860: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5870: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
5880: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
5890: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28   It is cleared (
58a0: 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68  set to false) wh
58b0: 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73  enever an exclus
58c0: 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  ive lock is .** 
58d0: 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f    relinquished o
58e0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
58f0: 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61  ile. Each time a
5900: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
5910: 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20  committed,.**   
5920: 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  The changeCountD
5930: 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70  one flag is insp
5940: 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20  ected. If it is 
5950: 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f  true, the work o
5960: 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20  f.**   updating 
5970: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5980: 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f  er is omitted fo
5990: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  r the current tr
59a0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
59b0: 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73     This mechanis
59c0: 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65  m means that whe
59d0: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  n running in exc
59e0: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63  lusive mode, a c
59f0: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  onnection .**   
5a00: 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65  need only update
5a10: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
5a20: 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68  ter once, for th
5a30: 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74  e first transact
5a40: 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74  ion.**   committ
5a50: 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73  ed..**.** setMas
5a60: 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e  ter.**.**   When
5a70: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
5a80: 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64  eOne() is called
5a90: 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61   to commit a tra
5aa0: 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79  nsaction, it may
5ab0: 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f  .**   (or may no
5ac0: 74 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73  t) specify a mas
5ad0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
5ae0: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
5af0: 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f  nto the .**   jo
5b00: 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
5b10: 65 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74  e it is synced t
5b20: 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  o disk..**.**   
5b30: 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
5b40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
5b50: 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d  ntains a master-
5b60: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
5b70: 61 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68  affects .**   th
5b80: 65 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74  e way in which t
5b90: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ba0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74  is finalized aft
5bb0: 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  er the transacti
5bc0: 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d  on is .**   comm
5bd0: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
5be0: 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e  back when runnin
5bf0: 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  g in "journal_mo
5c00: 64 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 65  de=PERSIST" mode
5c10: 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72  ..**   If a jour
5c20: 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
5c30: 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74  t contain a mast
5c40: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er-journal point
5c50: 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66  er, it is.**   f
5c60: 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72  inalized by over
5c70: 77 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73  writing the firs
5c80: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
5c90: 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66   with zeroes. If
5ca0: 0a 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f  .**   it does co
5cb0: 6e 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a  ntain a master-j
5cc0: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74  ournal pointer t
5cd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ce0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a  is finalized .**
5cf0: 20 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67     by truncating
5d00: 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65   it to zero byte
5d10: 73 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68  s, just as if th
5d20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72  e connection wer
5d30: 65 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20  e .**   running 
5d40: 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  in "journal_mode
5d50: 3d 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e  =truncate" mode.
5d60: 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c  .**.**   Journal
5d70: 20 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74   files that cont
5d80: 61 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ain master journ
5d90: 61 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e  al pointers cann
5da0: 6f 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a  ot be finalized.
5db0: 2a 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f  **   simply by o
5dc0: 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66  verwriting the f
5dd0: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
5de0: 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c  der with zeroes,
5df0: 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73   as the.**   mas
5e00: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
5e10: 74 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66  ter could interf
5e20: 65 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75  ere with hot-jou
5e30: 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  rnal rollback of
5e40: 20 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71   any.**   subseq
5e50: 75 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74  uently interrupt
5e60: 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ed transaction t
5e70: 68 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a  hat reuses the j
5e80: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
5e90: 2a 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73  **   The flag is
5ea0: 20 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e   cleared as soon
5eb0: 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
5ec0: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ed0: 64 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62  d (either.**   b
5ee0: 79 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  y PagerCommitPha
5ef0: 73 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f  seTwo or PagerRo
5f00: 6c 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49  llback). If an I
5f10: 4f 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73  O error prevents
5f20: 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61   the.**   journa
5f30: 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e  l file from bein
5f40: 67 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66  g successfully f
5f50: 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65  inalized, the se
5f60: 74 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20  tMaster flag.** 
5f70: 20 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79    is cleared any
5f80: 77 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67  way (and the pag
5f90: 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20  er will move to 
5fa0: 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a  ERROR state)..**
5fb0: 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a 2a  .** doNotSpill.*
5fc0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69  *.**   This vari
5fd0: 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68  ables control th
5fe0: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61  e behavior of ca
5ff0: 63 68 65 2d 73 70 69 6c 6c 73 20 20 28 63 61 6c  che-spills  (cal
6000: 6c 73 20 6d 61 64 65 20 62 79 0a 2a 2a 20 20 20  ls made by.**   
6010: 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c  the pcache modul
6020: 65 20 74 6f 20 74 68 65 20 70 61 67 65 72 53 74  e to the pagerSt
6030: 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74  ress() routine t
6040: 6f 20 77 72 69 74 65 20 63 61 63 68 65 64 20 64  o write cached d
6050: 61 74 61 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20  ata.**   to the 
6060: 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f  file-system in o
6070: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20  rder to free up 
6080: 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20  memory)..**.**  
6090: 20 57 68 65 6e 20 62 69 74 73 20 53 50 49 4c 4c   When bits SPILL
60a0: 46 4c 41 47 5f 4f 46 46 20 6f 72 20 53 50 49 4c  FLAG_OFF or SPIL
60b0: 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 6f  LFLAG_ROLLBACK o
60c0: 66 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 61 72 65  f doNotSpill are
60d0: 20 73 65 74 2c 0a 2a 2a 20 20 20 77 72 69 74 69   set,.**   writi
60e0: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
60f0: 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72  se from pagerStr
6100: 65 73 73 28 29 20 69 73 20 64 69 73 61 62 6c 65  ess() is disable
6110: 64 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a  d altogether..**
6120: 20 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41 47     The SPILLFLAG
6130: 5f 52 4f 4c 4c 42 41 43 4b 20 63 61 73 65 20 69  _ROLLBACK case i
6140: 73 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79  s done in a very
6150: 20 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68   obscure case th
6160: 61 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70  at.**   comes up
6170: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
6180: 74 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20  t rollback that 
6190: 72 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61  requires the pca
61a0: 63 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20  che module.**   
61b0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
61c0: 77 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e  w page to preven
61d0: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
61e0: 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72  le from being wr
61f0: 69 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65  itten.**   while
6200: 20 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61   it is being tra
6210: 76 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69  versed by code i
6220: 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
6230: 28 29 2e 20 20 54 68 65 20 53 50 49 4c 4c 46 4c  ().  The SPILLFL
6240: 41 47 5f 4f 46 46 0a 2a 2a 20 20 20 63 61 73 65  AG_OFF.**   case
6250: 20 69 73 20 61 20 75 73 65 72 20 70 72 65 66 65   is a user prefe
6260: 72 65 6e 63 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  rence..** .**   
6270: 49 66 20 74 68 65 20 53 50 49 4c 4c 46 4c 41 47  If the SPILLFLAG
6280: 5f 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73  _NOSYNC bit is s
6290: 65 74 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74  et, writing to t
62a0: 68 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d  he database from
62b0: 0a 2a 2a 20 20 20 70 61 67 65 72 53 74 72 65 73  .**   pagerStres
62c0: 73 28 29 20 69 73 20 70 65 72 6d 69 74 74 65 64  s() is permitted
62d0: 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68  , but syncing th
62e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
62f0: 73 20 6e 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73  s not..**   This
6300: 20 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20   flag is set by 
6310: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
6320: 65 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 6c  e() when the fil
6330: 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 2d  e-system sector-
6340: 73 69 7a 65 0a 2a 2a 20 20 20 69 73 20 6c 61 72  size.**   is lar
6350: 67 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74  ger than the dat
6360: 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20  abase page-size 
6370: 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76  in order to prev
6380: 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79  ent a journal sy
6390: 6e 63 0a 2a 2a 20 20 20 66 72 6f 6d 20 68 61 70  nc.**   from hap
63a0: 70 65 6e 69 6e 67 20 69 6e 20 62 65 74 77 65 65  pening in betwee
63b0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  n the journallin
63c0: 67 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f  g of two pages o
63d0: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  n the same secto
63e0: 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e  r. .**.** subjIn
63f0: 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54  Memory.**.**   T
6400: 68 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e  his is a boolean
6410: 20 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72   variable. If tr
6420: 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ue, then any req
6430: 75 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61  uired sub-journa
6440: 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64  l.**   is opened
6450: 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
6460: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
6470: 66 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e  f false, then in
6480: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62  -memory.**   sub
6490: 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e  -journals are on
64a0: 6c 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ly used for in-m
64b0: 65 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65  emory pager file
64c0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  s..**.**   This 
64d0: 76 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61  variable is upda
64e0: 74 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ted by the upper
64f0: 20 6c 61 79 65 72 20 65 61 63 68 20 74 69 6d 65   layer each time
6500: 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77 72 69   a new .**   wri
6510: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6520: 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  s opened..**.** 
6530: 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69  dbSize, dbOrigSi
6540: 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a  ze, dbFileSize.*
6550: 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 20  *.**   Variable 
6560: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
6570: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
6580: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
6590: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
65a0: 49 74 20 69 73 20 76 61 6c 69 64 20 69 6e 20 50  It is valid in P
65b0: 41 47 45 52 5f 52 45 41 44 45 52 20 61 6e 64 20  AGER_READER and 
65c0: 68 69 67 68 65 72 20 73 74 61 74 65 73 20 28 61  higher states (a
65d0: 6c 6c 20 73 74 61 74 65 73 20 65 78 63 65 70 74  ll states except
65e0: 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e 20 61   for.**   OPEN a
65f0: 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a 0a 2a  nd ERROR). .**.*
6600: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 73 65  *   dbSize is se
6610: 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
6620: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
6630: 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
6640: 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c 61 72  may be .**   lar
6650: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a  ger than the siz
6660: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
6670: 65 20 28 74 68 65 20 76 61 6c 75 65 20 73 74 6f  e (the value sto
6680: 72 65 64 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a  red at offset.**
6690: 20 20 20 32 38 20 6f 66 20 74 68 65 20 64 61 74     28 of the dat
66a0: 61 62 61 73 65 20 68 65 61 64 65 72 20 62 79 20  abase header by 
66b0: 74 68 65 20 62 74 72 65 65 29 2e 20 49 66 20 74  the btree). If t
66c0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
66d0: 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20  ile.**   is not 
66e0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
66f0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d  ple of the page-
6700: 73 69 7a 65 2c 20 74 68 65 20 76 61 6c 75 65 20  size, the value 
6710: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 64  stored in.**   d
6720: 62 53 69 7a 65 20 69 73 20 72 6f 75 6e 64 65 64  bSize is rounded
6730: 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20 35 4b   down (i.e. a 5K
6740: 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70  B file with 2K p
6750: 61 67 65 2d 73 69 7a 65 20 68 61 73 20 64 62 53  age-size has dbS
6760: 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20 45 78  ize==2)..**   Ex
6770: 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 74  cept, any file t
6780: 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
6790: 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
67a0: 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ize is considere
67b0: 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65 20 61  d.**   to have a
67c0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65  t least one page
67d0: 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42 20 66 69  . (i.e. a 1KB fi
67e0: 6c 65 20 77 69 74 68 20 32 4b 20 70 61 67 65 2d  le with 2K page-
67f0: 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20 20 20  size leads.**   
6800: 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e 0a 2a  to dbSize==1)..*
6810: 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20  *.**   During a 
6820: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6830: 6e 2c 20 69 66 20 70 61 67 65 73 20 77 69 74 68  n, if pages with
6840: 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72   page-numbers gr
6850: 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20  eater than.**   
6860: 64 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66  dbSize are modif
6870: 69 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  ied in the cache
6880: 2c 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61  , dbSize is upda
6890: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
68a0: 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c  .**   Similarly,
68b0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
68c0: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73   is truncated us
68d0: 69 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74  ing PagerTruncat
68e0: 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20 20 20  eImage(), .**   
68f0: 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 65  dbSize is update
6900: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61  d..**.**   Varia
6910: 62 6c 65 73 20 64 62 4f 72 69 67 53 69 7a 65 20  bles dbOrigSize 
6920: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 61  and dbFileSize a
6930: 72 65 20 76 61 6c 69 64 20 69 6e 20 73 74 61 74  re valid in stat
6940: 65 73 20 0a 2a 2a 20 20 20 50 41 47 45 52 5f 57  es .**   PAGER_W
6950: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61 6e 64  RITER_LOCKED and
6960: 20 68 69 67 68 65 72 2e 20 64 62 4f 72 69 67 53   higher. dbOrigS
6970: 69 7a 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ize is a copy of
6980: 20 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a 20 20   the dbSize.**  
6990: 20 76 61 72 69 61 62 6c 65 20 61 74 20 74 68 65   variable at the
69a0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
69b0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
69c0: 20 75 73 65 64 20 64 75 72 69 6e 67 20 72 6f 6c   used during rol
69d0: 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e 64 20  lback,.**   and 
69e0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
69f0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 67 65  ther or not page
6a00: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  s need to be jou
6a10: 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65 0a 2a  rnalled before.*
6a20: 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  *   being modifi
6a30: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 72 6f  ed..**.**   Thro
6a40: 75 67 68 6f 75 74 20 61 20 77 72 69 74 65 2d 74  ughout a write-t
6a50: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62 46 69  ransaction, dbFi
6a60: 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20  leSize contains 
6a70: 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 20  the size of.**  
6a80: 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
6a90: 6b 20 69 6e 20 70 61 67 65 73 2e 20 49 74 20 69  k in pages. It i
6aa0: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6ab0: 6f 66 20 64 62 53 69 7a 65 20 77 68 65 6e 20 74  of dbSize when t
6ac0: 68 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72  he.**   write-tr
6ad0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72  ansaction is fir
6ae0: 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 75  st opened, and u
6af0: 70 64 61 74 65 64 20 77 68 65 6e 20 56 46 53 20  pdated when VFS 
6b00: 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a  calls are made.*
6b10: 2a 20 20 20 74 6f 20 77 72 69 74 65 20 6f 72 20  *   to write or 
6b20: 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  truncate the dat
6b30: 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
6b40: 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  sk. .**.**   The
6b50: 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65   only reason the
6b60: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
6b70: 61 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  able is required
6b80: 20 69 73 20 74 6f 20 73 75 70 70 72 65 73 73 20   is to suppress 
6b90: 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72  .**   unnecessar
6ba0: 79 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e  y calls to xTrun
6bb0: 63 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d  cate() after com
6bc0: 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
6bd0: 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a 2a 20 20  ction. If, .**  
6be0: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
6bf0: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
6c00: 2c 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  , the dbFileSize
6c10: 20 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61   variable indica
6c20: 74 65 73 20 0a 2a 2a 20 20 20 74 68 61 74 20 74  tes .**   that t
6c30: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6c40: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
6c50: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
6c60: 67 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a 65  ge (Pager.dbSize
6c70: 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  ), .**   pager_t
6c80: 72 75 6e 63 61 74 65 28 29 20 69 73 20 63 61 6c  runcate() is cal
6c90: 6c 65 64 2e 20 54 68 65 20 70 61 67 65 72 5f 74  led. The pager_t
6ca0: 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75  runcate() call u
6cb0: 73 65 73 20 78 46 69 6c 65 73 69 7a 65 28 29 0a  ses xFilesize().
6cc0: 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75 72 65 20  **   to measure 
6cd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6ce0: 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 74  e on disk, and t
6cf0: 68 65 6e 20 74 72 75 6e 63 61 74 65 73 20 69 74  hen truncates it
6d00: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
6d10: 20 20 20 64 62 46 69 6c 65 53 69 7a 65 20 69 73     dbFileSize is
6d20: 20 6e 6f 74 20 75 73 65 64 20 77 68 65 6e 20 72   not used when r
6d30: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
6d40: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
6d50: 69 73 20 63 61 73 65 0a 2a 2a 20 20 20 70 61 67  is case.**   pag
6d60: 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73  er_truncate() is
6d70: 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e 64 69 74   called uncondit
6d80: 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63 68 20 6d  ionally (which m
6d90: 65 61 6e 73 20 74 68 65 72 65 20 6d 61 79 20 62  eans there may b
6da0: 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c 20 74 6f  e.**   a call to
6db0: 20 78 46 69 6c 65 73 69 7a 65 28 29 20 74 68 61   xFilesize() tha
6dc0: 74 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c  t is not strictl
6dd0: 79 20 72 65 71 75 69 72 65 64 29 2e 20 49 6e 20  y required). In 
6de0: 65 69 74 68 65 72 20 63 61 73 65 2c 0a 2a 2a 20  either case,.** 
6df0: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6e00: 28 29 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  () may cause the
6e10: 20 66 69 6c 65 20 74 6f 20 62 65 63 6f 6d 65 20   file to become 
6e20: 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61 72 67 65  smaller or large
6e30: 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69 6e 74 53  r..**.** dbHintS
6e40: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ize.**.**   The 
6e50: 64 62 48 69 6e 74 53 69 7a 65 20 76 61 72 69 61  dbHintSize varia
6e60: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6c  ble is used to l
6e70: 69 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20  imit the number 
6e80: 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 6f  of calls made to
6e90: 0a 2a 2a 20 20 20 74 68 65 20 56 46 53 20 78 46  .**   the VFS xF
6ea0: 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c  ileControl(FCNTL
6eb0: 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68  _SIZE_HINT) meth
6ec0: 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 48  od. .**.**   dbH
6ed0: 69 6e 74 53 69 7a 65 20 69 73 20 73 65 74 20 74  intSize is set t
6ee0: 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  o a copy of the 
6ef0: 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  dbSize variable 
6f00: 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77 72 69 74  when a.**   writ
6f10: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
6f20: 20 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20   opened (at the 
6f30: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46  same time as dbF
6f40: 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a 2a 20 20  ileSize and.**  
6f50: 20 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66   dbOrigSize). If
6f60: 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f   the xFileContro
6f70: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6f80: 54 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c  T) method is cal
6f90: 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48 69 6e 74  led,.**   dbHint
6fa0: 53 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 65  Size is increase
6fb0: 64 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  d to the number 
6fc0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 63 6f  of pages that co
6fd0: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 0a  rrespond to the.
6fe0: 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 20 70  **   size-hint p
6ff0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 65 74  assed to the met
7000: 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 70 61  hod call. See pa
7010: 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
7020: 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20 20 20 64  st() for .**   d
7030: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 65 72  etails..**.** er
7040: 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  rCode.**.**   Th
7050: 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  e Pager.errCode 
7060: 76 61 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79  variable is only
7070: 20 65 76 65 72 20 75 73 65 64 20 69 6e 20 50 41   ever used in PA
7080: 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
7090: 20 49 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20   It.**   is set 
70a0: 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f  to zero in all o
70b0: 74 68 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20  ther states. In 
70c0: 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
70d0: 65 2c 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  e, Pager.errCode
70e0: 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73   .**   is always
70f0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46   set to SQLITE_F
7100: 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
7110: 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  R or one of the 
7120: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
7130: 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73   .**   sub-codes
7140: 2e 0a 2a 2a 0a 2a 2a 20 73 79 6e 63 46 6c 61 67  ..**.** syncFlag
7150: 73 2c 20 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a  s, walSyncFlags.
7160: 2a 2a 0a 2a 2a 20 20 20 73 79 6e 63 46 6c 61 67  **.**   syncFlag
7170: 73 20 69 73 20 65 69 74 68 65 72 20 53 51 4c 49  s is either SQLI
7180: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 28  TE_SYNC_NORMAL (
7190: 30 78 30 32 29 20 6f 72 20 53 51 4c 49 54 45 5f  0x02) or SQLITE_
71a0: 53 59 4e 43 5f 46 55 4c 4c 20 28 30 78 30 33 29  SYNC_FULL (0x03)
71b0: 2e 0a 2a 2a 20 20 20 73 79 6e 63 46 6c 61 67 73  ..**   syncFlags
71c0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 72 6f 6c   is used for rol
71d0: 6c 62 61 63 6b 20 6d 6f 64 65 2e 20 20 77 61 6c  lback mode.  wal
71e0: 53 79 6e 63 46 6c 61 67 73 20 69 73 20 75 73 65  SyncFlags is use
71f0: 64 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65 0a 2a  d for WAL mode.*
7200: 2a 20 20 20 61 6e 64 20 63 6f 6e 74 61 69 6e 73  *   and contains
7210: 20 74 68 65 20 66 6c 61 67 73 20 75 73 65 64 20   the flags used 
7220: 74 6f 20 73 79 6e 63 20 74 68 65 20 63 68 65 63  to sync the chec
7230: 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69 6f 6e  kpoint operation
7240: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 6c 6f  s in the.**   lo
7250: 77 65 72 20 74 77 6f 20 62 69 74 73 2c 20 61 6e  wer two bits, an
7260: 64 20 73 79 6e 63 20 66 6c 61 67 73 20 75 73 65  d sync flags use
7270: 64 20 66 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  d for transactio
7280: 6e 20 63 6f 6d 6d 69 74 73 20 69 6e 20 74 68 65  n commits in the
7290: 20 57 41 4c 0a 2a 2a 20 20 20 66 69 6c 65 20 69   WAL.**   file i
72a0: 6e 20 62 69 74 73 20 30 78 30 34 20 61 6e 64 20  n bits 0x04 and 
72b0: 30 78 30 38 2e 20 20 49 6e 20 6f 74 68 65 72 20  0x08.  In other 
72c0: 77 6f 72 64 73 2c 20 74 6f 20 67 65 74 20 74 68  words, to get th
72d0: 65 20 63 6f 72 72 65 63 74 20 73 79 6e 63 20 66  e correct sync f
72e0: 6c 61 67 73 0a 2a 2a 20 20 20 66 6f 72 20 63 68  lags.**   for ch
72f0: 65 63 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69  eckpoint operati
7300: 6f 6e 73 2c 20 75 73 65 20 28 77 61 6c 53 79 6e  ons, use (walSyn
7310: 63 46 6c 61 67 73 26 30 78 30 33 29 20 61 6e 64  cFlags&0x03) and
7320: 20 74 6f 20 67 65 74 20 74 68 65 20 63 6f 72 72   to get the corr
7330: 65 63 74 0a 2a 2a 20 20 20 73 79 6e 63 20 66 6c  ect.**   sync fl
7340: 61 67 73 20 66 6f 72 20 74 72 61 6e 73 61 63 74  ags for transact
7350: 69 6f 6e 20 63 6f 6d 6d 69 74 2c 20 75 73 65 20  ion commit, use 
7360: 28 28 77 61 6c 53 79 6e 63 46 6c 61 67 73 3e 3e  ((walSyncFlags>>
7370: 32 29 26 30 78 30 33 29 2e 20 20 4e 6f 74 65 0a  2)&0x03).  Note.
7380: 2a 2a 20 20 20 74 68 61 74 20 77 69 74 68 20 73  **   that with s
7390: 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
73a0: 4c 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 74  L in WAL mode, t
73b0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
73c0: 74 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 0a  t is not synced.
73d0: 2a 2a 20 20 20 6d 65 61 6e 69 6e 67 20 74 68 61  **   meaning tha
73e0: 74 20 74 68 65 20 30 78 30 34 20 61 6e 64 20 30  t the 0x04 and 0
73f0: 78 30 38 20 62 69 74 73 20 61 72 65 20 62 6f 74  x08 bits are bot
7400: 68 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 72 75 63  h zero..*/.struc
7410: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
7420: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
7430: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
7440: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
7450: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
7460: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
7470: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
7480: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
7490: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
74a0: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
74b0: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
74c0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
74d0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
74e0: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
74f0: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7510: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
7520: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
7530: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53  file */.  u8 noS
7540: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
7550: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7560: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
7570: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
7580: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
7590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
75a0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
75b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
75c0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
75d0: 38 20 65 78 74 72 61 53 79 6e 63 3b 20 20 20 20  8 extraSync;    
75e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 79             /* sy
75f0: 6e 63 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  nc directory aft
7600: 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 6c 65 74  er journal delet
7610: 65 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c  e */.  u8 syncFl
7620: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
7630: 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41     /* SYNC_NORMA
7640: 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f  L or SYNC_FULL o
7650: 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38  therwise */.  u8
7660: 20 77 61 6c 53 79 6e 63 46 6c 61 67 73 3b 20 20   walSyncFlags;  
7670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
7680: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 61 62 6f   description abo
7690: 76 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  ve */.  u8 tempF
76a0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
76b0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
76c0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
76d0: 6f 72 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c  or immutable fil
76e0: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b  e */.  u8 noLock
76f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7700: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63     /* Do not loc
7710: 6b 20 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c  k (except in WAL
7720: 20 6d 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72   mode) */.  u8 r
7730: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
7740: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7750: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
7760: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
7770: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
7780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7790: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
77a0: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20   file I/O */..  
77b0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
77c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a  ***********.  **
7800: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
7810: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
7820: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
7830: 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75  s that change du
7840: 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  ring.  ** routin
7850: 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 43 6c  e operation.  Cl
7860: 61 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20  ass members not 
7870: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
7880: 65 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20  e either fixed. 
7890: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67   ** when the pag
78a0: 65 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61  er is first crea
78b0: 74 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79  ted or else only
78c0: 20 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65   change when the
78d0: 72 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67  re is a.  ** sig
78e0: 6e 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68  nificant mode ch
78f0: 61 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68  ange (such as ch
7900: 61 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f  anging the page_
7910: 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  size, locking_mo
7920: 64 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20  de,.  ** or the 
7930: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20  journal_mode).  
7940: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65  From another vie
7950: 77 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d  w, these class m
7960: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a  embers describe.
7970: 20 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22    ** the "state"
7980: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77   of the pager, w
7990: 68 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73  hile other class
79a0: 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62   members describ
79b0: 65 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66  e the.  ** "conf
79c0: 69 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68  iguration" of th
79d0: 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  e pager..  */.  
79e0: 75 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  u8 eState;      
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7a00: 61 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e  ager state (OPEN
7a10: 2c 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52  , READER, WRITER
7a20: 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20  _LOCKED..) */.  
7a30: 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  u8 eLock;       
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
7a50: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
7a60: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
7a70: 65 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  e */.  u8 change
7a80: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
7a90: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
7aa0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
7ab0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
7ac0: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
7ad0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
7ae0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
7af0: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
7b00: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
7b10: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69  */.  u8 doNotSpi
7b20: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7b30: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c   /* Do not spill
7b40: 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
7b50: 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38  non-zero */.  u8
7b60: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20   subjInMemory;  
7b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7b80: 65 20 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f  e to use in-memo
7b90: 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20  ry sub-journals 
7ba0: 2a 2f 0a 20 20 75 38 20 62 55 73 65 46 65 74 63  */.  u8 bUseFetc
7bb0: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
7bc0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
7bd0: 78 46 65 74 63 68 28 29 20 2a 2f 0a 20 20 75 38  xFetch() */.  u8
7be0: 20 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f   hasHeldSharedLo
7bf0: 63 6b 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ck;       /* Tru
7c00: 65 20 69 66 20 61 20 73 68 61 72 65 64 20 6c 6f  e if a shared lo
7c10: 63 6b 20 68 61 73 20 65 76 65 72 20 62 65 65 6e  ck has ever been
7c20: 20 68 65 6c 64 20 2a 2f 0a 20 20 50 67 6e 6f 20   held */.  Pgno 
7c30: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
7c40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7c50: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
7c60: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
7c70: 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20  gno dbOrigSize; 
7c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
7c90: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
7ca0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
7cb0: 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ion */.  Pgno db
7cc0: 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  FileSize;       
7cd0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7ce0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
7cf0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7d00: 20 20 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a    Pgno dbHintSiz
7d10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
7d20: 20 56 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f   Value passed to
7d30: 20 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54   FCNTL_SIZE_HINT
7d40: 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65   call */.  int e
7d50: 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20  rrCode;         
7d60: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
7d70: 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f   several kinds o
7d80: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e  f errors */.  in
7d90: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
7da0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7db0: 65 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69  es journalled si
7dc0: 6e 63 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65  nce last j-heade
7dd0: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75  r written */.  u
7de0: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
7df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
7e00: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
7e10: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
7e20: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33  checksum */.  u3
7e30: 32 20 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20  2 nSubRec;      
7e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7e50: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77  ber of records w
7e60: 72 69 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f  ritten to sub-jo
7e70: 75 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65  urnal */.  Bitve
7e80: 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20  c *pInJournal;  
7e90: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
7ea0: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
7eb0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7ec0: 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  file */.  sqlite
7ed0: 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20  3_file *fd;     
7ee0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
7ef0: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74  scriptor for dat
7f00: 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
7f10: 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20  e3_file *jfd;   
7f20: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
7f30: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61  escriptor for ma
7f40: 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
7f50: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a  sqlite3_file *sj
7f60: 66 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46  fd;         /* F
7f70: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7f80: 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a  or sub-journal *
7f90: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f  /.  i64 journalO
7fa0: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
7fb0: 2f 2a 20 43 75 72 72 65 6e 74 20 77 72 69 74 65  /* Current write
7fc0: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a   offset in the j
7fd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
7fe0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b   i64 journalHdr;
7ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8000: 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70  Byte offset to p
8010: 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20  revious journal 
8020: 68 65 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69  header */.  sqli
8030: 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
8040: 6b 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  kup;    /* Point
8050: 65 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e  er to list of on
8060: 67 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f  going backup pro
8070: 63 65 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65  cesses */.  Page
8080: 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76  rSavepoint *aSav
8090: 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79  epoint; /* Array
80a0: 20 6f 66 20 61 63 74 69 76 65 20 73 61 76 65 70   of active savep
80b0: 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  oints */.  int n
80c0: 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20  Savepoint;      
80d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
80e0: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
80f0: 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a  aSavepoint[] */.
8100: 20 20 75 33 32 20 69 44 61 74 61 56 65 72 73 69    u32 iDataVersi
8110: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  on;           /*
8120: 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65   Changes wheneve
8130: 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65  r database conte
8140: 6e 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  nt changes */.  
8150: 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
8160: 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  16];        /* C
8170: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
8180: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
8190: 61 6e 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20  anges */..  int 
81a0: 6e 4d 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20  nMmapOut;       
81b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
81c0: 72 20 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20  r of mmap pages 
81d0: 63 75 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61  currently outsta
81e0: 6e 64 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74  nding */.  sqlit
81f0: 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b  e3_int64 szMmap;
8200: 20 20 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65         /* Desire
8210: 64 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73  d maximum mmap s
8220: 69 7a 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ize */.  PgHdr *
8230: 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20  pMmapFreelist;  
8240: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
8250: 66 72 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68  free mmap page h
8260: 65 61 64 65 72 73 20 28 70 44 69 72 74 79 29 20  eaders (pDirty) 
8270: 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64  */.  /*.  ** End
8280: 20 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c   of the routinel
8290: 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73  y-changing class
82a0: 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a   members.  *****
82b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82f0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e  ******/..  u16 n
8300: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
8310: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
8320: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
8330: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
8340: 70 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52  page */.  i16 nR
8350: 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
8360: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8370: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
8380: 61 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70  at end of each p
8390: 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73  age */.  u32 vfs
83a0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
83b0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
83c0: 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  r sqlite3_vfs.xO
83d0: 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73  pen() */.  u32 s
83e0: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
83f0: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
8400: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
8410: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
8420: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8440: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
8450: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
8460: 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20   Pgno mxPgno;   
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8480: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
8490: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
84a0: 62 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  base */.  i64 jo
84b0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20  urnalSizeLimit; 
84c0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69        /* Size li
84d0: 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65  mit for persiste
84e0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nt journal files
84f0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
8500: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
8510: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
8520: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
8530: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
8540: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
8550: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
8560: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
8570: 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
8580: 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20  ler)(void*); /* 
8590: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c  Function to call
85a0: 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20   when busy */.  
85b0: 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
85c0: 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43  erArg;      /* C
85d0: 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20  ontext argument 
85e0: 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72  for xBusyHandler
85f0: 20 2a 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b   */.  int aStat[
8600: 34 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  4];             
8610: 20 20 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65    /* Total cache
8620: 20 68 69 74 73 2c 20 6d 69 73 73 65 73 2c 20 77   hits, misses, w
8630: 72 69 74 65 73 2c 20 73 70 69 6c 6c 73 20 2a 2f  rites, spills */
8640: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
8650: 45 53 54 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b  EST.  int nRead;
8660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8670: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61    /* Database pa
8680: 67 65 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64  ges read */.#end
8690: 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  if.  void (*xRei
86a0: 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b  niter)(DbPage*);
86b0: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
86c0: 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61  utine when reloa
86d0: 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20  ding pages */.  
86e0: 69 6e 74 20 28 2a 78 47 65 74 29 28 50 61 67 65  int (*xGet)(Page
86f0: 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a  r*,Pgno,DbPage**
8700: 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e  ,int); /* Routin
8710: 65 20 74 6f 20 66 65 74 63 68 20 61 20 70 61 74  e to fetch a pat
8720: 63 68 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ch */.#ifdef SQL
8730: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
8740: 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28  void *(*xCodec)(
8750: 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
8760: 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e  ,int); /* Routin
8770: 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e  e for en/decodin
8780: 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  g data */.  void
8790: 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68 6e   (*xCodecSizeChn
87a0: 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74  g)(void*,int,int
87b0: 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20  ); /* Notify of 
87c0: 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e 67 65  page size change
87d0: 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  s */.  void (*xC
87e0: 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a 29  odecFree)(void*)
87f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
8800: 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   Destructor for 
8810: 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76  the codec */.  v
8820: 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20 20 20  oid *pCodec;    
8830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8840: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
8850: 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64  xCodec... method
8860: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68  s */.#endif.  ch
8870: 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20  ar *pTmpSpace;  
8880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
8890: 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65  er.pageSize byte
88a0: 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74  s of space for t
88b0: 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50 43 61 63  mp use */.  PCac
88c0: 68 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20  he *pPCache;    
88d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
88e0: 65 72 20 74 6f 20 70 61 67 65 20 63 61 63 68 65  er to page cache
88f0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66 6e 64   object */.#ifnd
8900: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
8910: 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20  AL.  Wal *pWal; 
8920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8930: 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64 20   /* Write-ahead 
8940: 6c 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f 75  log used by "jou
8950: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a  rnal_mode=wal" *
8960: 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20  /.  char *zWal; 
8970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8980: 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f 72  /* File name for
8990: 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
89a0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
89b0: 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20 66 6f 72  *.** Indexes for
89c0: 20 75 73 65 20 77 69 74 68 20 50 61 67 65 72 2e   use with Pager.
89d0: 61 53 74 61 74 5b 5d 2e 20 54 68 65 20 50 61 67  aStat[]. The Pag
89e0: 65 72 2e 61 53 74 61 74 5b 5d 20 61 72 72 61 79  er.aStat[] array
89f0: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65   contains.** the
8a00: 20 76 61 6c 75 65 73 20 61 63 63 65 73 73 65 64   values accessed
8a10: 20 62 79 20 70 61 73 73 69 6e 67 20 53 51 4c 49   by passing SQLI
8a20: 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48  TE_DBSTATUS_CACH
8a30: 45 5f 48 49 54 2c 20 43 41 43 48 45 5f 4d 49 53  E_HIT, CACHE_MIS
8a40: 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48 45 5f 57  S .** or CACHE_W
8a50: 52 49 54 45 20 74 6f 20 73 71 6c 69 74 65 33 5f  RITE to sqlite3_
8a60: 64 62 5f 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a  db_status()..*/.
8a70: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54  #define PAGER_ST
8a80: 41 54 5f 48 49 54 20 20 20 30 0a 23 64 65 66 69  AT_HIT   0.#defi
8a90: 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 4d 49  ne PAGER_STAT_MI
8aa0: 53 53 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41  SS  1.#define PA
8ab0: 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 20 32  GER_STAT_WRITE 2
8ac0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
8ad0: 54 41 54 5f 53 50 49 4c 4c 20 33 0a 0a 2f 2a 0a  TAT_SPILL 3../*.
8ae0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
8af0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
8b00: 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20  s hold counters 
8b10: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
8b20: 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c  ing purposes onl
8b30: 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  y.  These variab
8b40: 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  les do not exist
8b50: 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73   in.** a non-tes
8b60: 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65  ting build.  The
8b70: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
8b80: 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65   not thread-safe
8b90: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
8ba0: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
8bb0: 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
8bc0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
8bd0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
8be0: 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d   pages read from
8bf0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
8c00: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
8c10: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a  _count = 0;   /*
8c20: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
8c30: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
8c40: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
8c50: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
8c60: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
8c70: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
8c80: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
8c90: 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  nal */.# define 
8ca0: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76  PAGER_INCR(v)  v
8cb0: 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ++.#else.# defin
8cc0: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a  e PAGER_INCR(v).
8cd0: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
8ce0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
8cf0: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
8d00: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
8d10: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
8d20: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
8d30: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
8d40: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
8d50: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
8d60: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
8d70: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
8d80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
8d90: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
8da0: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
8db0: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
8dc0: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
8dd0: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
8de0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
8df0: 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e  being.** written
8e00: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
8e10: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
8e20: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
8e30: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
8e40: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
8e50: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
8e60: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
8e70: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
8e80: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
8e90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
8ea0: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
8eb0: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
8ec0: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
8ed0: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
8ee0: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
8ef0: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
8f00: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
8f10: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
8f20: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
8f30: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
8f40: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
8f50: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
8f60: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
8f70: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
8f80: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
8f90: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
8fa0: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
8fb0: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
8fc0: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
8fd0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
8fe0: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
8ff0: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
9000: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
9010: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
9020: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
9030: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
9040: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
9050: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
9060: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
9070: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
9080: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
9090: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
90a0: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
90b0: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
90c0: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
90d0: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
90e0: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
90f0: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
9100: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
9110: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
9120: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
9130: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
9140: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
9150: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
9160: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
9170: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
9180: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
9190: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
91a0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
91b0: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
91c0: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
91d0: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
91e0: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
91f0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
9200: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
9210: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
9220: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
9230: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
9240: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
9250: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
9260: 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63  ze of the of eac
9270: 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e  h page record in
9280: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
9290: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20  given by.** the 
92a0: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e  following macro.
92b0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
92c0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
92d0: 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67  )  ((pPager->pag
92e0: 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a  eSize) + 8)../*.
92f0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** The journal h
9300: 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74  eader size for t
9310: 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20  his pager. This 
9320: 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73  is usually the s
9330: 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20  ame .** size as 
9340: 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
9350: 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73  ctor. See also s
9360: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a  etSectorSize()..
9370: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
9380: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
9390: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
93a0: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
93b0: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
93c0: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
93d0: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
93e0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
93f0: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
9400: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
9410: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
9420: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
9430: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
9440: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
9450: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
9460: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
9470: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
9480: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
9490: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
94a0: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
94b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
94c0: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
94d0: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
94e0: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
94f0: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
9500: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
9510: 65 20 6d 61 63 72 6f 20 55 53 45 46 45 54 43 48  e macro USEFETCH
9520: 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61   is true if we a
9530: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73  re allowed to us
9540: 65 20 74 68 65 20 78 46 65 74 63 68 20 61 6e 64  e the xFetch and
9550: 20 78 55 6e 66 65 74 63 68 0a 2a 2a 20 69 6e 74   xUnfetch.** int
9560: 65 72 66 61 63 65 73 20 74 6f 20 61 63 63 65 73  erfaces to acces
9570: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75  s the database u
9580: 73 69 6e 67 20 6d 65 6d 6f 72 79 2d 6d 61 70 70  sing memory-mapp
9590: 65 64 20 49 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53  ed I/O..*/.#if S
95a0: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
95b0: 49 5a 45 3e 30 0a 23 20 64 65 66 69 6e 65 20 55  IZE>0.# define U
95c0: 53 45 46 45 54 43 48 28 78 29 20 28 28 78 29 2d  SEFETCH(x) ((x)-
95d0: 3e 62 55 73 65 46 65 74 63 68 29 0a 23 65 6c 73  >bUseFetch).#els
95e0: 65 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45  e.# define USEFE
95f0: 54 43 48 28 78 29 20 30 0a 23 65 6e 64 69 66 0a  TCH(x) 0.#endif.
9600: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
9610: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
9620: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
9630: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
9640: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
9650: 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20  47483647../*.** 
9660: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  The argument to 
9670: 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20  this macro is a 
9680: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
9690: 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69  (type sqlite3_fi
96a0: 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  le*)..** Return 
96b0: 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f  0 if it is not o
96c0: 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  pen, or non-zero
96d0: 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20   (but not 1) if 
96e0: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  it is..**.** Thi
96f0: 73 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70  s is so that exp
9700: 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20  ressions can be 
9710: 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a  written as:.**.*
9720: 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  *   if( isOpen(p
9730: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e  Pager->jfd) ){ .
9740: 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64  ...**.** instead
9750: 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20   of.**.**   if( 
9760: 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65  pPager->jfd->pMe
9770: 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a  thods ){ ....*/.
9780: 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70  #define isOpen(p
9790: 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74  Fd) ((pFd)->pMet
97a0: 68 6f 64 73 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20  hods!=0)../*.** 
97b0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
97c0: 68 69 73 20 70 61 67 65 72 20 75 73 65 73 20 61  his pager uses a
97d0: 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
97e0: 20 74 6f 20 72 65 61 64 20 70 61 67 65 20 70 67   to read page pg
97f0: 6e 6f 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61  no..** Return fa
9800: 6c 73 65 20 69 66 20 74 68 65 20 70 61 67 65 72  lse if the pager
9810: 20 72 65 61 64 73 20 70 67 6e 6f 20 64 69 72 65   reads pgno dire
9820: 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61  ctly from the da
9830: 74 61 62 61 73 65 2e 0a 2a 2f 0a 23 69 66 20 21  tabase..*/.#if !
9840: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9850: 4d 49 54 5f 57 41 4c 29 20 26 26 20 64 65 66 69  MIT_WAL) && defi
9860: 6e 65 64 28 53 51 4c 49 54 45 5f 44 49 52 45 43  ned(SQLITE_DIREC
9870: 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 29  T_OVERFLOW_READ)
9880: 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
9890: 72 55 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70  rUseWal(Pager *p
98a0: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
98b0: 29 7b 0a 20 20 75 33 32 20 69 52 65 61 64 20 3d  ){.  u32 iRead =
98c0: 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
98d0: 69 66 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  if( pPager->pWal
98e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
98f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
9900: 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
9910: 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26  r->pWal, pgno, &
9920: 69 52 65 61 64 29 3b 0a 20 20 72 65 74 75 72 6e  iRead);.  return
9930: 20 72 63 20 7c 7c 20 69 52 65 61 64 3b 0a 7d 0a   rc || iRead;.}.
9940: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
9950: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23  QLITE_OMIT_WAL.#
9960: 20 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65   define pagerUse
9970: 57 61 6c 28 78 29 20 28 28 78 29 2d 3e 70 57 61  Wal(x) ((x)->pWa
9980: 6c 21 3d 30 29 0a 23 65 6c 73 65 0a 23 20 64 65  l!=0).#else.# de
9990: 66 69 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c  fine pagerUseWal
99a0: 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70  (x) 0.# define p
99b0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
99c0: 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  x) 0.# define pa
99d0: 67 65 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77  gerWalFrames(v,w
99e0: 2c 78 2c 79 29 20 30 0a 23 20 64 65 66 69 6e 65  ,x,y) 0.# define
99f0: 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
9a00: 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45  resent(z) SQLITE
9a10: 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67  _OK.# define pag
9a20: 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
9a30: 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45  action(z) SQLITE
9a40: 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  _OK.#endif..#ifn
9a50: 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a  def NDEBUG ./*.*
9a60: 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20  * Usage:.**.**  
9a70: 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
9a80: 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
9a90: 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69  er) );.**.** Thi
9aa0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20  s function runs 
9ab0: 6d 61 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20  many asserts to 
9ac0: 74 72 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f  try to find inco
9ad0: 6e 73 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a  nsistencies in.*
9ae0: 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  * the internal s
9af0: 74 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65  tate of the Page
9b00: 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  r object..*/.sta
9b10: 74 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70  tic int assert_p
9b20: 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72  ager_state(Pager
9b30: 20 2a 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70   *p){.  Pager *p
9b40: 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a  Pager = p;..  /*
9b50: 20 53 74 61 74 65 20 6d 75 73 74 20 62 65 20 76   State must be v
9b60: 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72  alid. */.  asser
9b70: 74 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  t( p->eState==PA
9b80: 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20  GER_OPEN.       
9b90: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9ba0: 47 45 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20  GER_READER.     
9bb0: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9bc0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
9bd0: 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  KED.       || p-
9be0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9bf0: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
9c00: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
9c10: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
9c20: 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  _DBMOD.       ||
9c30: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9c40: 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  R_WRITER_FINISHE
9c50: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
9c60: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52  State==PAGER_ERR
9c70: 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  OR.  );..  /* Re
9c80: 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
9c90: 63 75 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61  current state, a
9ca0: 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65   temp-file conne
9cb0: 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68  ction always beh
9cc0: 61 76 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20  aves.  ** as if 
9cd0: 69 74 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73  it has an exclus
9ce0: 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
9cf0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
9d00: 74 20 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a  t never updates.
9d10: 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d    ** the change-
9d20: 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73  counter field, s
9d30: 6f 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e  o the changeCoun
9d40: 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c  tDone flag is al
9d50: 77 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  ways set..  */. 
9d60: 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70   assert( p->temp
9d70: 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c  File==0 || p->eL
9d80: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
9d90: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
9da0: 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20   p->tempFile==0 
9db0: 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  || pPager->chang
9dc0: 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20  eCountDone );.. 
9dd0: 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f   /* If the useJo
9de0: 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c  urnal flag is cl
9df0: 65 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ear, the journal
9e00: 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f  -mode must be "O
9e10: 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69  FF". .  ** And i
9e20: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  f the journal-mo
9e30: 64 65 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65  de is "OFF", the
9e40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
9e50: 73 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a  st not be open..
9e60: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
9e70: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
9e80: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
9e90: 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f  _OFF || p->useJo
9ea0: 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
9eb0: 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  t( p->journalMod
9ec0: 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
9ed0: 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f  MODE_OFF || !isO
9ee0: 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a  pen(p->jfd) );..
9ef0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
9f00: 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f  MEMDB implies no
9f10: 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d  Sync. And an in-
9f20: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20  memory journal. 
9f30: 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73  Since .  ** this
9f40: 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d   means an in-mem
9f50: 6f 72 79 20 70 61 67 65 72 20 70 65 72 66 6f 72  ory pager perfor
9f60: 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c  ms no IO at all,
9f70: 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75   it cannot encou
9f80: 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65  nter .  ** eithe
9f90: 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f  r SQLITE_IOERR o
9fa0: 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75  r SQLITE_FULL du
9fb0: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  ring rollback or
9fc0: 20 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e   while finalizin
9fd0: 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61  g .  ** a journa
9fe0: 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67  l file. (althoug
9ff0: 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  h the in-memory 
a000: 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e  journal implemen
a010: 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a  tation may .  **
a020: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
a030: 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65  OERR_NOMEM while
a040: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
a050: 65 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  e is being writt
a060: 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73  en). It .  ** is
a070: 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70   therefore not p
a080: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69  ossible for an i
a090: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74  n-memory pager t
a0a0: 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f  o enter the ERRO
a0b0: 52 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20  R .  ** state.. 
a0c0: 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20   */.  if( MEMDB 
a0d0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
a0e0: 69 73 4f 70 65 6e 28 70 2d 3e 66 64 29 20 29 3b  isOpen(p->fd) );
a0f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
a100: 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73  noSync );.    as
a110: 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c  sert( p->journal
a120: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a130: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
a140: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a150: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a160: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
a170: 59 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73  Y .    );.    as
a180: 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21  sert( p->eState!
a190: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20  =PAGER_ERROR && 
a1a0: 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  p->eState!=PAGER
a1b0: 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73  _OPEN );.    ass
a1c0: 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
a1d0: 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  (p)==0 );.  }.. 
a1e0: 20 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75   /* If changeCou
a1f0: 6e 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61  ntDone is set, a
a200: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
a210: 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62  r greater must b
a220: 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74  e held.  ** on t
a230: 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
a240: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a250: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d  changeCountDone=
a260: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  =0 || pPager->eL
a270: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
a280: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
a290: 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  p->eLock!=PENDIN
a2a0: 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69  G_LOCK );..  swi
a2b0: 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29  tch( p->eState )
a2c0: 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  {.    case PAGER
a2d0: 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73  _OPEN:.      ass
a2e0: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
a2f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a300: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a310: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a320: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a330: 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
a340: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
a350: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =0 || pPager->te
a360: 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
a370: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a380: 20 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20   PAGER_READER:. 
a390: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a3a0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a3b0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a3c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
a3d0: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
a3e0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a3f0: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45   p->eLock>=SHARE
a400: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  D_LOCK );.      
a410: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a420: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
a430: 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65  CKED:.      asse
a440: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
a450: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
a460: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a470: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a480: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a490: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
a4a0: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
a4b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a4c0: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
a4d0: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OCK );.      }. 
a4e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a4f0: 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61  ger->dbSize==pPa
a500: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
a510: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a520: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a530: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46  ize==pPager->dbF
a540: 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ileSize );.     
a550: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a560: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
a570: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
a580: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a590: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
a5a0: 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  er==0 );.      b
a5b0: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a5c0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
a5d0: 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73  HEMOD:.      ass
a5e0: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
a5f0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
a600: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a610: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a620: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a630: 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
a640: 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
a650: 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f       /* It is po
a660: 73 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a  ssible that if j
a670: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20  ournal_mode=wal 
a680: 68 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65  here that neithe
a690: 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  r the.        **
a6a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f   journal file no
a6b0: 72 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61  r the WAL file a
a6c0: 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61  re open. This ha
a6d0: 70 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20  ppens during.   
a6e0: 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61       ** a rollba
a6f0: 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ck transaction t
a700: 68 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f  hat switches fro
a710: 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f  m journal_mode=o
a720: 66 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ff.        ** to
a730: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61   journal_mode=wa
a740: 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
a750: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a760: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
a770: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20  _LOCK );.       
a780: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a790: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a7a0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a7b0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a7c0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a7e0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a7f0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a800: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29  E_WAL .        )
a810: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a820: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a830: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a840: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
a850: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a860: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a870: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze==pPager->dbHi
a880: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
a890: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a8a0: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42   PAGER_WRITER_DB
a8b0: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
a8c0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  t( p->eLock==EXC
a8d0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
a8e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a8f0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a900: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a910: 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
a920: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
a930: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a940: 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49  ->eLock>=EXCLUSI
a950: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a960: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a970: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a980: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a990: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a9a0: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a9b0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a9c0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a9d0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a9e0: 4c 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L .           ||
a9f0: 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
aa00: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
aa10: 28 70 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  (p->fd)&SQLITE_I
aa20: 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49  OCAP_BATCH_ATOMI
aa30: 43 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  C).      );.    
aa40: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
aa50: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50  ->dbOrigSize<=pP
aa60: 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
aa70: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
aa80: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
aa90: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
aaa0: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
aab0: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
aac0: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
aad0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
aae0: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
aaf0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
ab00: 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
ab10: 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
ab20: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
ab30: 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20  en(p->jfd) .    
ab40: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
ab50: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
ab60: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
ab70: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
ab80: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
ab90: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
aba0: 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  _WAL .          
abb0: 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
abc0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
abd0: 69 63 73 28 70 2d 3e 66 64 29 26 53 51 4c 49 54  ics(p->fd)&SQLIT
abe0: 45 5f 49 4f 43 41 50 5f 42 41 54 43 48 5f 41 54  E_IOCAP_BATCH_AT
abf0: 4f 4d 49 43 29 0a 20 20 20 20 20 20 29 3b 0a 20  OMIC).      );. 
ac00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
ac10: 20 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f   case PAGER_ERRO
ac20: 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  R:.      /* Ther
ac30: 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  e must be at lea
ac40: 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
ac50: 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ng reference to 
ac60: 74 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20  the pager if.   
ac70: 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73     ** in ERROR s
ac80: 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20  tate. Otherwise 
ac90: 74 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  the pager should
aca0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72   have already dr
acb0: 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  opped.      ** b
acc0: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
acd0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
ace0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
acf0: 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
ad00: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
ad10: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
ad20: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
ad30: 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 7c  er->pPCache)>0 |
ad40: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
ad50: 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  le );.      brea
ad60: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
ad70: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
ad80: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f  ifndef NDEBUG */
ad90: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
ada0: 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74  DEBUG ./*.** Ret
adb0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
adc0: 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c   a human readabl
add0: 65 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74  e string in a st
ade0: 61 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63  atic buffer.** c
adf0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74  ontaining the st
ae00: 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  ate of the Pager
ae10: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
ae20: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54  s an argument. T
ae30: 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64  his.** is intend
ae40: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 77 69  ed to be used wi
ae50: 74 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20  thin debuggers. 
ae60: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20  For example, as 
ae70: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a  an alternative.*
ae80: 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61  * to "print *pPa
ae90: 67 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a  ger" in gdb:.**.
aea0: 2a 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66 20  ** (gdb) printf 
aeb0: 22 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65  "%s", print_page
aec0: 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 0a  r_state(pPager).
aed0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
aee0: 6e 65 20 68 61 73 20 65 78 74 65 72 6e 61 6c 20  ne has external 
aef0: 6c 69 6e 6b 61 67 65 20 69 6e 20 6f 72 64 65 72  linkage in order
af00: 20 74 6f 20 73 75 70 70 72 65 73 73 20 63 6f 6d   to suppress com
af10: 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 0a 2a  piler warnings.*
af20: 2a 20 61 62 6f 75 74 20 61 6e 20 75 6e 75 73 65  * about an unuse
af30: 64 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20  d function.  It 
af40: 69 73 20 65 6e 63 6c 6f 73 65 64 20 77 69 74 68  is enclosed with
af50: 69 6e 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  in SQLITE_DEBUG 
af60: 61 6e 64 20 73 6f 20 64 6f 65 73 0a 2a 2a 20 6e  and so does.** n
af70: 6f 74 20 61 70 70 65 61 72 20 69 6e 20 6e 6f 72  ot appear in nor
af80: 6d 61 6c 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 63  mal builds..*/.c
af90: 68 61 72 20 2a 70 72 69 6e 74 5f 70 61 67 65 72  har *print_pager
afa0: 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 29  _state(Pager *p)
afb0: 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
afc0: 7a 52 65 74 5b 31 30 32 34 5d 3b 0a 0a 20 20 73  zRet[1024];..  s
afd0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
afe0: 31 30 32 34 2c 20 7a 52 65 74 2c 0a 20 20 20 20  1024, zRet,.    
aff0: 20 20 22 46 69 6c 65 6e 61 6d 65 3a 20 20 20 20    "Filename:    
b000: 20 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 53    %s\n".      "S
b010: 74 61 74 65 3a 20 20 20 20 20 20 20 20 20 25 73  tate:         %s
b020: 20 65 72 72 43 6f 64 65 3d 25 64 5c 6e 22 0a 20   errCode=%d\n". 
b030: 20 20 20 20 20 22 4c 6f 63 6b 3a 20 20 20 20 20       "Lock:     
b040: 20 20 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20       %s\n".     
b050: 20 22 4c 6f 63 6b 69 6e 67 20 6d 6f 64 65 3a 20   "Locking mode: 
b060: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73   locking_mode=%s
b070: 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e  \n".      "Journ
b080: 61 6c 20 6d 6f 64 65 3a 20 20 6a 6f 75 72 6e 61  al mode:  journa
b090: 6c 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20  l_mode=%s\n".   
b0a0: 20 20 20 22 42 61 63 6b 69 6e 67 20 73 74 6f 72     "Backing stor
b0b0: 65 3a 20 74 65 6d 70 46 69 6c 65 3d 25 64 20 6d  e: tempFile=%d m
b0c0: 65 6d 44 62 3d 25 64 20 75 73 65 4a 6f 75 72 6e  emDb=%d useJourn
b0d0: 61 6c 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22  al=%d\n".      "
b0e0: 4a 6f 75 72 6e 61 6c 3a 20 20 20 20 20 20 20 6a  Journal:       j
b0f0: 6f 75 72 6e 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a  ournalOff=%lld j
b100: 6f 75 72 6e 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e  ournalHdr=%lld\n
b110: 22 0a 20 20 20 20 20 20 22 53 69 7a 65 3a 20 20  ".      "Size:  
b120: 20 20 20 20 20 20 20 20 64 62 73 69 7a 65 3d 25          dbsize=%
b130: 64 20 64 62 4f 72 69 67 53 69 7a 65 3d 25 64 20  d dbOrigSize=%d 
b140: 64 62 46 69 6c 65 53 69 7a 65 3d 25 64 5c 6e 22  dbFileSize=%d\n"
b150: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 7a 46 69 6c  .      , p->zFil
b160: 65 6e 61 6d 65 0a 20 20 20 20 20 20 2c 20 70 2d  ename.      , p-
b170: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
b180: 50 45 4e 20 20 20 20 20 20 20 20 20 20 20 20 3f  PEN            ?
b190: 20 22 4f 50 45 4e 22 20 3a 0a 20 20 20 20 20 20   "OPEN" :.      
b1a0: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47    p->eState==PAG
b1b0: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
b1c0: 20 20 20 3f 20 22 52 45 41 44 45 52 22 20 3a 0a     ? "READER" :.
b1d0: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
b1e0: 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
b1f0: 4c 4f 43 4b 45 44 20 20 20 3f 20 22 57 52 49 54  LOCKED   ? "WRIT
b200: 45 52 5f 4c 4f 43 4b 45 44 22 20 3a 0a 20 20 20  ER_LOCKED" :.   
b210: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d       p->eState==
b220: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
b230: 48 45 4d 4f 44 20 3f 20 22 57 52 49 54 45 52 5f  HEMOD ? "WRITER_
b240: 43 41 43 48 45 4d 4f 44 22 20 3a 0a 20 20 20 20  CACHEMOD" :.    
b250: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
b260: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
b270: 44 20 20 20 20 3f 20 22 57 52 49 54 45 52 5f 44  D    ? "WRITER_D
b280: 42 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20  BMOD" :.        
b290: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
b2a0: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
b2b0: 20 3f 20 22 57 52 49 54 45 52 5f 46 49 4e 49 53   ? "WRITER_FINIS
b2c0: 48 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  HED" :.        p
b2d0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
b2e0: 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20  ERROR           
b2f0: 3f 20 22 45 52 52 4f 52 22 20 3a 20 22 3f 65 72  ? "ERROR" : "?er
b300: 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69  ror?".      , (i
b310: 6e 74 29 70 2d 3e 65 72 72 43 6f 64 65 0a 20 20  nt)p->errCode.  
b320: 20 20 20 20 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d      , p->eLock==
b330: 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20  NO_LOCK         
b340: 3f 20 22 4e 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20  ? "NO_LOCK" :.  
b350: 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d        p->eLock==
b360: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20  RESERVED_LOCK   
b370: 3f 20 22 52 45 53 45 52 56 45 44 22 20 3a 0a 20  ? "RESERVED" :. 
b380: 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d         p->eLock=
b390: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
b3a0: 20 3f 20 22 45 58 43 4c 55 53 49 56 45 22 20 3a   ? "EXCLUSIVE" :
b3b0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63  .        p->eLoc
b3c0: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20  k==SHARED_LOCK  
b3d0: 20 20 20 3f 20 22 53 48 41 52 45 44 22 20 3a 0a     ? "SHARED" :.
b3e0: 20 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b          p->eLock
b3f0: 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20  ==UNKNOWN_LOCK  
b400: 20 20 3f 20 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20    ? "UNKNOWN" : 
b410: 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20  "?error?".      
b420: 2c 20 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  , p->exclusiveMo
b430: 64 65 20 3f 20 22 65 78 63 6c 75 73 69 76 65 22  de ? "exclusive"
b440: 20 3a 20 22 6e 6f 72 6d 61 6c 22 0a 20 20 20 20   : "normal".    
b450: 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f    , p->journalMo
b460: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
b470: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 3f  LMODE_MEMORY   ?
b480: 20 22 6d 65 6d 6f 72 79 22 20 3a 0a 20 20 20 20   "memory" :.    
b490: 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f      p->journalMo
b4a0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
b4b0: 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 3f  LMODE_OFF      ?
b4c0: 20 22 6f 66 66 22 20 3a 0a 20 20 20 20 20 20 20   "off" :.       
b4d0: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
b4e0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
b4f0: 44 45 5f 44 45 4c 45 54 45 20 20 20 3f 20 22 64  DE_DELETE   ? "d
b500: 65 6c 65 74 65 22 20 3a 0a 20 20 20 20 20 20 20  elete" :.       
b510: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
b520: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
b530: 44 45 5f 50 45 52 53 49 53 54 20 20 3f 20 22 70  DE_PERSIST  ? "p
b540: 65 72 73 69 73 74 22 20 3a 0a 20 20 20 20 20 20  ersist" :.      
b550: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
b560: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
b570: 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 3f 20 22  ODE_TRUNCATE ? "
b580: 74 72 75 6e 63 61 74 65 22 20 3a 0a 20 20 20 20  truncate" :.    
b590: 20 20 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f      p->journalMo
b5a0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
b5b0: 4c 4d 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 3f  LMODE_WAL      ?
b5c0: 20 22 77 61 6c 22 20 3a 20 22 3f 65 72 72 6f 72   "wal" : "?error
b5d0: 3f 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29  ?".      , (int)
b5e0: 70 2d 3e 74 65 6d 70 46 69 6c 65 2c 20 28 69 6e  p->tempFile, (in
b5f0: 74 29 70 2d 3e 6d 65 6d 44 62 2c 20 28 69 6e 74  t)p->memDb, (int
b600: 29 70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20  )p->useJournal. 
b610: 20 20 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61       , p->journa
b620: 6c 4f 66 66 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c  lOff, p->journal
b630: 48 64 72 0a 20 20 20 20 20 20 2c 20 28 69 6e 74  Hdr.      , (int
b640: 29 70 2d 3e 64 62 53 69 7a 65 2c 20 28 69 6e 74  )p->dbSize, (int
b650: 29 70 2d 3e 64 62 4f 72 69 67 53 69 7a 65 2c 20  )p->dbOrigSize, 
b660: 28 69 6e 74 29 70 2d 3e 64 62 46 69 6c 65 53 69  (int)p->dbFileSi
b670: 7a 65 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72  ze.  );..  retur
b680: 6e 20 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66  n zRet;.}.#endif
b690: 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
b6a0: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 76  erences to the v
b6b0: 61 72 69 6f 75 73 20 70 61 67 65 20 67 65 74 74  arious page gett
b6c0: 65 72 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ers */.static in
b6d0: 74 20 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 28  t getPageNormal(
b6e0: 50 61 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61  Pager*,Pgno,DbPa
b6f0: 67 65 2a 2a 2c 69 6e 74 29 3b 0a 73 74 61 74 69  ge**,int);.stati
b700: 63 20 69 6e 74 20 67 65 74 50 61 67 65 45 72 72  c int getPageErr
b710: 6f 72 28 50 61 67 65 72 2a 2c 50 67 6e 6f 2c 44  or(Pager*,Pgno,D
b720: 62 50 61 67 65 2a 2a 2c 69 6e 74 29 3b 0a 23 69  bPage**,int);.#i
b730: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
b740: 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20  P_SIZE>0.static 
b750: 69 6e 74 20 67 65 74 50 61 67 65 4d 4d 61 70 28  int getPageMMap(
b760: 50 61 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61  Pager*,Pgno,DbPa
b770: 67 65 2a 2a 2c 69 6e 74 29 3b 0a 23 65 6e 64 69  ge**,int);.#endi
b780: 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  f../*.** Set the
b790: 20 50 61 67 65 72 2e 78 47 65 74 20 6d 65 74 68   Pager.xGet meth
b7a0: 6f 64 20 66 6f 72 20 74 68 65 20 61 70 70 72 6f  od for the appro
b7b0: 70 72 69 61 74 65 20 72 6f 75 74 69 6e 65 20 75  priate routine u
b7c0: 73 65 64 20 74 6f 20 66 65 74 63 68 0a 2a 2a 20  sed to fetch.** 
b7d0: 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65  content from the
b7e0: 20 70 61 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   pager..*/.stati
b7f0: 63 20 76 6f 69 64 20 73 65 74 47 65 74 74 65 72  c void setGetter
b800: 4d 65 74 68 6f 64 28 50 61 67 65 72 20 2a 70 50  Method(Pager *pP
b810: 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
b820: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
b830: 20 20 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74      pPager->xGet
b840: 20 3d 20 67 65 74 50 61 67 65 45 72 72 6f 72 3b   = getPageError;
b850: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
b860: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 7d 65  MMAP_SIZE>0.  }e
b870: 6c 73 65 20 69 66 28 20 55 53 45 46 45 54 43 48  lse if( USEFETCH
b880: 28 70 50 61 67 65 72 29 0a 23 69 66 64 65 66 20  (pPager).#ifdef 
b890: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
b8a0: 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 78  .   && pPager->x
b8b0: 43 6f 64 65 63 3d 3d 30 0a 23 65 6e 64 69 66 0a  Codec==0.#endif.
b8c0: 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d    ){.    pPager-
b8d0: 3e 78 47 65 74 20 3d 20 67 65 74 50 61 67 65 4d  >xGet = getPageM
b8e0: 4d 61 70 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  Map;.#endif /* S
b8f0: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
b900: 49 5a 45 3e 30 20 2a 2f 0a 20 20 7d 65 6c 73 65  IZE>0 */.  }else
b910: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 47  {.    pPager->xG
b920: 65 74 20 3d 20 67 65 74 50 61 67 65 4e 6f 72 6d  et = getPageNorm
b930: 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  al;.  }.}../*.**
b940: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
b950: 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
b960: 74 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70  to write page *p
b970: 50 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  Pg into the sub-
b980: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61  journal..** A pa
b990: 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77  ge needs to be w
b9a0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
b9b0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74  sub-journal if t
b9c0: 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a  here exists one.
b9d0: 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20  ** or more open 
b9e0: 73 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77  savepoints for w
b9f0: 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  hich:.**.**   * 
ba00: 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  The page-number 
ba10: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
ba20: 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61  equal to PagerSa
ba30: 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61  vepoint.nOrig, a
ba40: 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69  nd.**   * The bi
ba50: 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
ba60: 74 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  to the page-numb
ba70: 65 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e  er is not set in
ba80: 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
ba90: 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
baa0: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
bab0: 6e 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  nt subjRequiresP
bac0: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
bad0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
bae0: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
baf0: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
bb00: 20 2a 70 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f   *p;.  Pgno pgno
bb10: 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
bb20: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
bb30: 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76  ; i<pPager->nSav
bb40: 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  epoint; i++){.  
bb50: 20 20 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61    p = &pPager->a
bb60: 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20  Savepoint[i];.  
bb70: 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d    if( p->nOrig>=
bb80: 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74  pgno && 0==sqlit
bb90: 65 33 42 69 74 76 65 63 54 65 73 74 4e 6f 74 4e  e3BitvecTestNotN
bba0: 75 6c 6c 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f  ull(p->pInSavepo
bbb0: 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20  int, pgno) ){.  
bbc0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
bbd0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
bbe0: 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51   0;.}..#ifdef SQ
bbf0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
bc00: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
bc10: 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65  the page is alre
bc20: 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
bc30: 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  al file..*/.stat
bc40: 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75  ic int pageInJou
bc50: 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
bc60: 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b  er, PgHdr *pPg){
bc70: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
bc80: 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67  3BitvecTest(pPag
bc90: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
bca0: 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65  pPg->pgno);.}.#e
bcb0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
bcc0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
bcd0: 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e  r from the given
bce0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
bcf0: 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74  .  Store the int
bd00: 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  eger.** that is 
bd10: 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20  read in *pRes.  
bd20: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
bd30: 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
bd40: 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20  orked, or an.** 
bd50: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
bd60: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
bd70: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61  ng..**.** All va
bd80: 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  lues are stored 
bd90: 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65  on disk as big-e
bda0: 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ndian..*/.static
bdb0: 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28   int read32bits(
bdc0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
bdd0: 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33  , i64 offset, u3
bde0: 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69  2 *pRes){.  unsi
bdf0: 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b  gned char ac[4];
be00: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
be10: 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63  te3OsRead(fd, ac
be20: 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66  , sizeof(ac), of
be30: 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  fset);.  if( rc=
be40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
be50: 20 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65    *pRes = sqlite
be60: 33 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20  3Get4byte(ac);. 
be70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
be80: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
be90: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
bea0: 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75  into a string bu
beb0: 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69  ffer in big-endi
bec0: 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a  an byte order..*
bed0: 2f 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62  /.#define put32b
bee0: 69 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65  its(A,B)  sqlite
bef0: 33 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41  3Put4byte((u8*)A
bf00: 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ,B).../*.** Writ
bf10: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
bf20: 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65  er into the give
bf30: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
bf40: 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
bf50: 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
bf60: 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
bf70: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
bf80: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
bf90: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
bfa0: 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66  32bits(sqlite3_f
bfb0: 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66  ile *fd, i64 off
bfc0: 73 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20  set, u32 val){. 
bfd0: 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70   char ac[4];.  p
bfe0: 75 74 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c  ut32bits(ac, val
bff0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
c000: 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61  te3OsWrite(fd, a
c010: 63 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d  c, 4, offset);.}
c020: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74  ../*.** Unlock t
c030: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
c040: 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c   to level eLock,
c050: 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65   which must be e
c060: 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a  ither NO_LOCK.**
c070: 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
c080: 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   Regardless of w
c090: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
c0a0: 65 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63  e call to xUnloc
c0b0: 6b 28 29 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c  k().** succeeds,
c0c0: 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 65   set the Pager.e
c0d0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f  Lock variable to
c0e0: 20 6d 61 74 63 68 20 74 68 65 20 28 61 74 74 65   match the (atte
c0f0: 6d 70 74 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e  mpted) new lock.
c100: 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69  .**.** Except, i
c110: 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73  f Pager.eLock is
c120: 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f   set to UNKNOWN_
c130: 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66  LOCK when this f
c140: 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61  unction is.** ca
c150: 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64  lled, do not mod
c160: 69 66 79 20 69 74 2e 20 53 65 65 20 74 68 65 20  ify it. See the 
c170: 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68  comment above th
c180: 65 20 23 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a  e #define of .**
c190: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
c1a0: 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
c1b0: 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61   of this..*/.sta
c1c0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 6e 6c  tic int pagerUnl
c1d0: 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61  ockDb(Pager *pPa
c1e0: 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b  ger, int eLock){
c1f0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
c200: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
c210: 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
c220: 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67  siveMode || pPag
c230: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b  er->eLock==eLock
c240: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
c250: 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock==NO_LOCK || 
c260: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
c270: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
c280: 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock!=NO_LOCK |
c290: 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  | pagerUseWal(pP
c2a0: 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66  ager)==0 );.  if
c2b0: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
c2c0: 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65  >fd) ){.    asse
c2d0: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
c2e0: 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  k>=eLock );.    
c2f0: 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c  rc = pPager->noL
c300: 6f 63 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  ock ? SQLITE_OK 
c310: 3a 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  : sqlite3OsUnloc
c320: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c  k(pPager->fd, eL
c330: 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ock);.    if( pP
c340: 61 67 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  ager->eLock!=UNK
c350: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  NOWN_LOCK ){.   
c360: 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b     pPager->eLock
c370: 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20   = (u8)eLock;.  
c380: 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28    }.    IOTRACE(
c390: 28 22 55 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e  ("UNLOCK %p %d\n
c3a0: 22 2c 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b  ", pPager, eLock
c3b0: 29 29 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  )).  }.  return 
c3c0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
c3d0: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
c3e0: 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f  ile to level eLo
c3f0: 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62  ck, which must b
c400: 65 20 65 69 74 68 65 72 20 53 48 41 52 45 44 5f  e either SHARED_
c410: 4c 4f 43 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45  LOCK,.** RESERVE
c420: 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53  D_LOCK or EXCLUS
c430: 49 56 45 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65  IVE_LOCK. If the
c440: 20 63 61 6c 6c 65 72 20 69 73 20 73 75 63 63 65   caller is succe
c450: 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a  ssful, set the.*
c460: 2a 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61  * Pager.eLock va
c470: 72 69 61 62 6c 65 20 74 6f 20 74 68 65 20 6e 65  riable to the ne
c480: 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e  w locking state.
c490: 20 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20   .**.** Except, 
c4a0: 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69  if Pager.eLock i
c4b0: 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e  s set to UNKNOWN
c4c0: 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20  _LOCK when this 
c4d0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20  function is .** 
c4e0: 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d  called, do not m
c4f0: 6f 64 69 66 79 20 69 74 20 75 6e 6c 65 73 73 20  odify it unless 
c500: 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20  the new locking 
c510: 73 74 61 74 65 20 69 73 20 45 58 43 4c 55 53 49  state is EXCLUSI
c520: 56 45 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65  VE_LOCK. .** See
c530: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
c540: 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f  ve the #define o
c550: 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66  f UNKNOWN_LOCK f
c560: 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f  or an explanatio
c570: 6e 20 0a 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a  n .** of this..*
c580: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
c590: 65 72 4c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a  erLockDb(Pager *
c5a0: 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63  pPager, int eLoc
c5b0: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
c5c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
c5d0: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52  ert( eLock==SHAR
c5e0: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  ED_LOCK || eLock
c5f0: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
c600: 7c 7c 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  || eLock==EXCLUS
c610: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  IVE_LOCK );.  if
c620: 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c  ( pPager->eLock<
c630: 65 4c 6f 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d  eLock || pPager-
c640: 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock==UNKNOWN_
c650: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  LOCK ){.    rc =
c660: 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20   pPager->noLock 
c670: 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71  ? SQLITE_OK : sq
c680: 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
c690: 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a  er->fd, eLock);.
c6a0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c6b0: 54 45 5f 4f 4b 20 26 26 20 28 70 50 61 67 65 72  TE_OK && (pPager
c6c0: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
c6d0: 5f 4c 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58  _LOCK||eLock==EX
c6e0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b  CLUSIVE_LOCK) ){
c6f0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
c700: 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b  Lock = (u8)eLock
c710: 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
c720: 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c  ("LOCK %p %d\n",
c730: 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29   pPager, eLock))
c740: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
c750: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
c760: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
c770: 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65  etermines whethe
c780: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f  r or not the ato
c790: 6d 69 63 2d 77 72 69 74 65 20 6f 72 0a 2a 2a 20  mic-write or.** 
c7a0: 61 74 6f 6d 69 63 2d 62 61 74 63 68 2d 77 72 69  atomic-batch-wri
c7b0: 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  te optimizations
c7c0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74   can be used wit
c7d0: 68 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68  h this pager. Th
c7e0: 65 0a 2a 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74  e.** atomic-writ
c7f0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
c800: 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a  an be used if:.*
c810: 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61  *.**  (a) the va
c820: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
c830: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
c840: 72 69 73 74 69 63 73 28 29 20 69 6e 64 69 63 61  ristics() indica
c850: 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  tes that.**     
c860: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
c870: 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20   may be written 
c880: 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a  atomically, and.
c890: 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c 75  **  (b) the valu
c8a0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
c8b0: 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20  SectorSize() is 
c8c0: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
c8d0: 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68  al.**      to th
c8e0: 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a  e page size..**.
c8f0: 2a 2a 20 49 66 20 69 74 20 63 61 6e 20 62 65 20  ** If it can be 
c900: 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20 76  used, then the v
c910: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
c920: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
c930: 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c   journal .** fil
c940: 65 20 77 68 65 6e 20 69 74 20 63 6f 6e 74 61 69  e when it contai
c950: 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61  ns rollback data
c960: 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65   for exactly one
c970: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
c980: 20 61 74 6f 6d 69 63 2d 62 61 74 63 68 2d 77 72   atomic-batch-wr
c990: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
c9a0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 20   can be used if 
c9b0: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
c9c0: 72 69 73 74 69 63 73 28 29 0a 2a 2a 20 72 65 74  ristics().** ret
c9d0: 75 72 6e 73 20 61 20 76 61 6c 75 65 20 77 69 74  urns a value wit
c9e0: 68 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  h the SQLITE_IOC
c9f0: 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 20  AP_BATCH_ATOMIC 
ca00: 62 69 74 20 73 65 74 2e 20 2d 31 20 69 73 0a 2a  bit set. -1 is.*
ca10: 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74 68  * returned in th
ca20: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
ca30: 66 20 6e 65 69 74 68 65 72 20 6f 70 74 69 6d 69  f neither optimi
ca40: 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73  zation can be us
ca50: 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  ed, 0 is returne
ca60: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
ca70: 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28   jrnlBufferSize(
ca80: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
ca90: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
caa0: 20 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64   );..#if defined
cab0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41  (SQLITE_ENABLE_A
cac0: 54 4f 4d 49 43 5f 57 52 49 54 45 29 20 5c 0a 20  TOMIC_WRITE) \. 
cad0: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
cae0: 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41  E_ENABLE_BATCH_A
caf0: 54 4f 4d 49 43 5f 57 52 49 54 45 29 0a 20 20 69  TOMIC_WRITE).  i
cb00: 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20  nt dc;          
cb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb20: 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61   /* Device chara
cb30: 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 0a 20  cteristics */.. 
cb40: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
cb50: 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
cb60: 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   dc = sqlite3OsD
cb70: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
cb80: 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
cb90: 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
cba0: 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65  _PARAMETER(pPage
cbb0: 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  r);.#endif..#ifd
cbc0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
cbd0: 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52  _BATCH_ATOMIC_WR
cbe0: 49 54 45 0a 20 20 69 66 28 20 70 50 61 67 65 72  ITE.  if( pPager
cbf0: 2d 3e 64 62 53 69 7a 65 3e 30 20 26 26 20 28 64  ->dbSize>0 && (d
cc00: 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42  c&SQLITE_IOCAP_B
cc10: 41 54 43 48 5f 41 54 4f 4d 49 43 29 20 29 7b 0a  ATCH_ATOMIC) ){.
cc20: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
cc30: 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
cc40: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
cc50: 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 7b  ATOMIC_WRITE.  {
cc60: 0a 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72  .    int nSector
cc70: 20 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f   = pPager->secto
cc80: 72 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73  rSize;.    int s
cc90: 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e  zPage = pPager->
cca0: 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61  pageSize;..    a
ccb0: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
ccc0: 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
ccd0: 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73 73  12>>8));.    ass
cce0: 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
ccf0: 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35  _ATOMIC64K==(655
cd00: 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66 28  36>>8));.    if(
cd10: 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45 5f   0==(dc&(SQLITE_
cd20: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a  IOCAP_ATOMIC|(sz
cd30: 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65  Page>>8)) || nSe
cd40: 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a  ctor>szPage) ){.
cd50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
cd60: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
cd70: 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  urn JOURNAL_HDR_
cd80: 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55  SZ(pPager) + JOU
cd90: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
cda0: 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65  r);.#endif..  re
cdb0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
cdc0: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
cdd0: 5f 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65  _PAGES is define
cde0: 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d  d then we do som
cdf0: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
ce00: 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68  g.** on the cach
ce10: 65 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66  e using a hash f
ce20: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69  unction.  This i
ce30: 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
ce40: 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67  ng.** and debugg
ce50: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66  ing only..*/.#if
ce60: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
ce70: 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74  _PAGES./*.** Ret
ce80: 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73  urn a 32-bit has
ce90: 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  h of the page da
cea0: 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f  ta for pPage..*/
ceb0: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
cec0: 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e  r_datahash(int n
ced0: 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  Byte, unsigned c
cee0: 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75  har *pData){.  u
cef0: 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69  32 hash = 0;.  i
cf00: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
cf10: 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a   i<nByte; i++){.
cf20: 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68      hash = (hash
cf30: 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69  *1039) + pData[i
cf40: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
cf50: 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75  hash;.}.static u
cf60: 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  32 pager_pagehas
cf70: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
cf80: 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
cf90: 64 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e  datahash(pPage->
cfa0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
cfb0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
cfc0: 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29   *)pPage->pData)
cfd0: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
cfe0: 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
cff0: 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29  sh(PgHdr *pPage)
d000: 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48  {.  pPage->pageH
d010: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
d020: 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a  hash(pPage);.}..
d030: 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f  /*.** The CHECK_
d040: 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73  PAGE macro takes
d050: 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20   a PgHdr* as an 
d060: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c  argument. If SQL
d070: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
d080: 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  ** is defined, a
d090: 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  nd NDEBUG is not
d0a0: 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73   defined, an ass
d0b0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20  ert() statement 
d0c0: 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74  checks.** that t
d0d0: 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65  he page is eithe
d0e0: 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c  r dirty or still
d0f0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c   matches the cal
d100: 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73  culated page-has
d110: 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48  h..*/.#define CH
d120: 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63  ECK_PAGE(x) chec
d130: 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20  kPage(x).static 
d140: 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50  void checkPage(P
d150: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
d160: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
d170: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73  g->pPager;.  ass
d180: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
d190: 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
d1a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
d1b0: 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
d1c0: 44 49 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70  DIRTY) || pPg->p
d1d0: 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70  ageHash==pager_p
d1e0: 61 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a  agehash(pPg) );.
d1f0: 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  }..#else.#define
d200: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
d210: 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20  X,Y)  0.#define 
d220: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 58  pager_pagehash(X
d230: 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67  )  0.#define pag
d240: 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
d250: 58 29 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b  X).#define CHECK
d260: 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20  _PAGE(x).#endif 
d270: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   /* SQLITE_CHECK
d280: 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _PAGES */../*.**
d290: 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
d2a0: 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lled the journal
d2b0: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
d2c0: 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f  pPager must be o
d2d0: 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e  pen..** This fun
d2e0: 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
d2f0: 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20  o read a master 
d300: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
d310: 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65  e from the .** e
d320: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61  nd of the file a
d330: 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75  nd, if successfu
d340: 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74  l, copies it int
d350: 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65  o memory supplie
d360: 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  d .** by the cal
d370: 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ler. See comment
d380: 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73  s above writeMas
d390: 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72  terJournal() for
d3a0: 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75   the format.** u
d3b0: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d  sed to store a m
d3c0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
d3d0: 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65  le name at the e
d3e0: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
d3f0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73  file..**.** zMas
d400: 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ter must point t
d410: 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74  o a buffer of at
d420: 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62   least nMaster b
d430: 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ytes allocated b
d440: 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e  y.** the caller.
d450: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
d460: 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
d470: 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73  thname+1 (to ens
d480: 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  ure there is.** 
d490: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20  enough space to 
d4a0: 77 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  write the master
d4b0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20   journal name). 
d4c0: 49 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  If the master jo
d4d0: 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e  urnal.** name in
d4e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
d4f0: 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73  longer than nMas
d500: 74 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75  ter bytes (inclu
d510: 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65  ding a.** nul-te
d520: 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20  rminator), then 
d530: 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20  this is handled 
d540: 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20  as if no master 
d550: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20  journal name.** 
d560: 77 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20  were present in 
d570: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
d580: 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
d590: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
d5a0: 20 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74   is present at t
d5b0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
d5c0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74  urnal.** file, t
d5d0: 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64  hen it is copied
d5e0: 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72   into the buffer
d5f0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
d600: 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c  Master. A.** nul
d610: 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
d620: 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20   is appended to 
d630: 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f  the buffer follo
d640: 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a  wing the master.
d650: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
d660: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  name..**.** If i
d670: 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  t is determined 
d680: 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a  that no master j
d690: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
d6a0: 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20   is present .** 
d6b0: 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65  zMaster[0] is se
d6c0: 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
d6d0: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
d6e0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
d6f0: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65   occurs while re
d700: 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a  ading from the j
d710: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20  ournal file, an 
d720: 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20  SQLite.** error 
d730: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
d740: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d750: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
d760: 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
d770: 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61  pJrnl, char *zMa
d780: 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65  ster, u32 nMaste
d790: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7b0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
d7c0: 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20  */.  u32 len;   
d7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7e0: 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74  /* Length in byt
d7f0: 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  es of master jou
d800: 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  rnal name */.  i
d810: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
d820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
d830: 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  al size in bytes
d840: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   of journal file
d850: 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20   pJrnl */.  u32 
d860: 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
d870: 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65         /* MJ che
d880: 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64  cksum value read
d890: 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f   from journal */
d8a0: 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20  .  u32 u;       
d8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d8c0: 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
d8d0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69  ounter */.  unsi
d8e0: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
d8f0: 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66  [8];   /* A buff
d900: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
d910: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
d920: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c   zMaster[0] = '\
d930: 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54  0';..  if( SQLIT
d940: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
d950: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a  te3OsFileSize(pJ
d960: 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c  rnl, &szJ)).   |
d970: 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53  | szJ<16.   || S
d980: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
d990: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
d9a0: 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29  , szJ-16, &len))
d9b0: 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73  .   || len>=nMas
d9c0: 74 65 72 20 0a 20 20 20 7c 7c 20 6c 65 6e 3e 73  ter .   || len>s
d9d0: 7a 4a 2d 31 36 0a 20 20 20 7c 7c 20 6c 65 6e 3d  zJ-16.   || len=
d9e0: 3d 30 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  =0 .   || SQLITE
d9f0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
da00: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
da10: 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20  -12, &cksum)).  
da20: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
da30: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
da40: 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63  ad(pJrnl, aMagic
da50: 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20  , 8, szJ-8)).   
da60: 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  || memcmp(aMagic
da70: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
da80: 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45   8).   || SQLITE
da90: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
daa0: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
dab0: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a  zMaster, len, sz
dac0: 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a  J-16-len)).  ){.
dad0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
dae0: 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20   }..  /* See if 
daf0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74  the checksum mat
db00: 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20  ches the master 
db10: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
db20: 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e    for(u=0; u<len
db30: 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; u++){.    cksu
db40: 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b  m -= zMaster[u];
db50: 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d  .  }.  if( cksum
db60: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
db70: 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e  e checksum doesn
db80: 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20  't add up, then 
db90: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
dba0: 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a  he disk sectors.
dbb0: 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e      ** containin
dbc0: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
dbd0: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73  rnal filename is
dbe0: 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73   corrupted. This
dbf0: 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65   means.    ** de
dc00: 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61  finitely roll ba
dc10: 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75  ck, so just retu
dc20: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  rn SQLITE_OK and
dc30: 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a   report a (nul).
dc40: 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f      ** master-jo
dc50: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a  urnal filename..
dc60: 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d      */.    len =
dc70: 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65   0;.  }.  zMaste
dc80: 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20  r[len] = '\0';. 
dc90: 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
dca0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
dcb0: 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65  Return the offse
dcc0: 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  t of the sector 
dcd0: 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69  boundary at or i
dce0: 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66  mmediately .** f
dcf0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c  ollowing the val
dd00: 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f  ue in pPager->jo
dd10: 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69  urnalOff, assumi
dd20: 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20  ng a sector .** 
dd30: 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  size of pPager->
dd40: 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73  sectorSize bytes
dd50: 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20  ..**.** i.e for 
dd60: 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66  a sector size of
dd70: 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61   512:.**.**   Pa
dd80: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20  ger.journalOff  
dd90: 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 76          Return v
dda0: 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  alue.**   ------
ddb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ddc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ddd0: 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20  -.**   0        
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddf0: 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20   0.**   512     
de00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de10: 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20    512.**   100  
de20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de30: 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30       512.**   20
de40: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
de50: 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20          2048.** 
de60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a  .*/.static i64 j
de70: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
de80: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
de90: 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
dea0: 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67  ;.  i64 c = pPag
deb0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
dec0: 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f    if( c ){.    o
ded0: 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a  ffset = ((c-1)/J
dee0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
def0: 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55  ager) + 1) * JOU
df00: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
df10: 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  er);.  }.  asser
df20: 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41  t( offset%JOURNA
df30: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
df40: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
df50: 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20   offset>=c );.  
df60: 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d  assert( (offset-
df70: 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  c)<JOURNAL_HDR_S
df80: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  Z(pPager) );.  r
df90: 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a  eturn offset;.}.
dfa0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
dfb0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
dfc0: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66  open when this f
dfd0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
dfe0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
dff0: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
e000: 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  p if the journal
e010: 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65   file has not be
e020: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a  en written to.**
e030: 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72   within the curr
e040: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
e050: 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a  (i.e. if Pager.j
e060: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a  ournalOff==0)..*
e070: 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61  *.** If doTrunca
e080: 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  te is non-zero o
e090: 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72  r the Pager.jour
e0a0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72  nalSizeLimit var
e0b0: 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20  iable is.** set 
e0c0: 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63  to 0, then trunc
e0d0: 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
e0e0: 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74  file to zero byt
e0f0: 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65  es in size. Othe
e100: 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74  rwise,.** zero t
e110: 68 65 20 32 38 2d 62 79 74 65 20 68 65 61 64 65  he 28-byte heade
e120: 72 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  r at the start o
e130: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
e140: 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  le. In either ca
e150: 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70  se, .** if the p
e160: 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e  ager is not in n
e170: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e  o-sync mode, syn
e180: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
e190: 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a  le immediately .
e1a0: 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e 67  ** after writing
e1b0: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69   or truncating i
e1c0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65  t..**.** If Page
e1d0: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
e1e0: 69 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 70  it is set to a p
e1f0: 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72  ositive, non-zer
e200: 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20  o value, and.** 
e210: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72  following the tr
e220: 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f  uncation or zero
e230: 69 6e 67 20 64 65 73 63 72 69 62 65 64 20 61 62  ing described ab
e240: 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ove the size of 
e250: 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  the .** journal 
e260: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73  file in bytes is
e270: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
e280: 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72  s value, then tr
e290: 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f  uncate the.** jo
e2a0: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61  urnal file to Pa
e2b0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
e2c0: 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65 20  imit bytes. The 
e2d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
e2e0: 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f  s.** not need to
e2f0: 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f   be synced follo
e300: 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74  wing this operat
e310: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ion..**.** If an
e320: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
e330: 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73  , abandon proces
e340: 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20  sing and return 
e350: 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
e360: 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  e..** Otherwise,
e370: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e380: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
e390: 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
e3a0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
e3b0: 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a  nt doTruncate){.
e3c0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
e3d0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
e3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3f0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
e400: 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  de */.  assert( 
e410: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
e420: 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
e430: 20 21 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c   !sqlite3Journal
e440: 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65  IsInMemory(pPage
e450: 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69 66 28  r->jfd) );.  if(
e460: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e470: 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  Off ){.    const
e480: 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50   i64 iLimit = pP
e490: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
e4a0: 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f  eLimit;    /* Lo
e4b0: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a 73 6c  cal cache of jsl
e4c0: 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41 43 45   */..    IOTRACE
e4d0: 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e  (("JZEROHDR %p\n
e4e0: 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
e4f0: 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c  if( doTruncate |
e500: 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20  | iLimit==0 ){. 
e510: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e520: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
e530: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
e540: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 74   }else{.      st
e550: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
e560: 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30  zeroHdr[28] = {0
e570: 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  };.      rc = sq
e580: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
e590: 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64  ger->jfd, zeroHd
e5a0: 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64  r, sizeof(zeroHd
e5b0: 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  r), 0);.    }.  
e5c0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
e5d0: 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e  _OK && !pPager->
e5e0: 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
e5f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
e600: 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
e610: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
e620: 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e  ONLY|pPager->syn
e630: 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a  cFlags);.    }..
e640: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
e650: 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63  oint the transac
e660: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
e670: 64 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20  d but the write 
e680: 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20  lock .    ** is 
e690: 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68  still held on th
e6a0: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
e6b0: 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74   is a size limit
e6c0: 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
e6d0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73  .    ** the pers
e6e0: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  istent journal a
e6f0: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
e700: 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ile currently co
e710: 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20  nsumes more.    
e720: 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68  ** space than th
e730: 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20  at limit allows 
e740: 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74  for, truncate it
e750: 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e   now. There is n
e760: 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  o need.    ** to
e770: 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66   sync the file f
e780: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
e790: 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  eration..    */.
e7a0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
e7b0: 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e  TE_OK && iLimit>
e7c0: 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73  0 ){.      i64 s
e7d0: 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  z;.      rc = sq
e7e0: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
e7f0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
e800: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
e810: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a  =SQLITE_OK && sz
e820: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
e830: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
e840: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
e850: 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a  ->jfd, iLimit);.
e860: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e870: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
e880: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
e890: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
e8a0: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
e8b0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
e8c0: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  d. A journal.** 
e8d0: 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f  header (JOURNAL_
e8e0: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
e8f0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
e900: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
e910: 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t the.** current
e920: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
e930: 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20   The format for 
e940: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
e950: 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  er is as follows
e960: 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20  :.** - 8 bytes: 
e970: 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e  Magic identifyin
e980: 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  g journal format
e990: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
e9a0: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
e9b0: 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72  s in journal, or
e9c0: 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   -1 no-sync mode
e9d0: 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62   is on..** - 4 b
e9e0: 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d  ytes: Random num
e9f0: 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67  ber used for pag
ea00: 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62  e hash..** - 4 b
ea10: 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61  ytes: Initial da
ea20: 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
ea30: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
ea40: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65   Sector size use
ea50: 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73  d by the process
ea60: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73   that wrote this
ea70: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34   journal..** - 4
ea80: 20 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65   bytes: Database
ea90: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a   page size..** .
eaa0: 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28  ** Followed by (
eab0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
eac0: 20 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e   28) bytes of un
ead0: 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  used space..*/.s
eae0: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a  tatic int writeJ
eaf0: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
eb00: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
eb10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
eb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb30: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
eb40: 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65  /.  char *zHeade
eb50: 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
eb60: 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f  Space;  /* Tempo
eb70: 72 61 72 79 20 73 70 61 63 65 20 75 73 65 64 20  rary space used 
eb80: 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65 72 20  to build header 
eb90: 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72  */.  u32 nHeader
eba0: 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e   = (u32)pPager->
ebb0: 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69 7a 65  pageSize;/* Size
ebc0: 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74   of buffer point
ebd0: 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72  ed to by zHeader
ebe0: 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65   */.  u32 nWrite
ebf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ec00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
ec10: 65 73 20 6f 66 20 68 65 61 64 65 72 20 73 65 63  es of header sec
ec20: 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  tor written */. 
ec30: 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
ec40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec50: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
ec60: 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
ec70: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
ec80: 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f  ->jfd) );      /
ec90: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * Journal file m
eca0: 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a  ust be open. */.
ecb0: 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a  .  if( nHeader>J
ecc0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
ecd0: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65  ager) ){.    nHe
ece0: 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48  ader = JOURNAL_H
ecf0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
ed00: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
ed10: 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76  e are active sav
ed20: 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20  epoints and any 
ed30: 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63 72 65  of them were cre
ed40: 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65  ated .  ** since
ed50: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
ed60: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
ed70: 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64  was written, upd
ed80: 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61  ate the .  ** Pa
ed90: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
eda0: 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e  rOffset fields n
edb0: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ow..  */.  for(i
edc0: 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
edd0: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
ede0: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
edf0: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
ee00: 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20  ].iHdrOffset==0 
ee10: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
ee20: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
ee30: 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  iHdrOffset = pPa
ee40: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
ee50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
ee60: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
ee70: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
ee80: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
ee90: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
eea0: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72  ;..  /* .  ** Wr
eeb0: 69 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65  ite the nRec Fie
eec0: 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20  ld - the number 
eed0: 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
eee0: 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73  that follow this
eef0: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65  .  ** journal he
ef00: 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20  ader. Normally, 
ef10: 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20  zero is written 
ef20: 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74  to this value at
ef30: 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a   this time..  **
ef40: 20 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72   After the recor
ef50: 64 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ds are added to 
ef60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  the journal (and
ef70: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e   the journal syn
ef80: 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e  ced, .  ** if in
ef90: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29   full-sync mode)
efa0: 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76  , the zero is ov
efb0: 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74  erwritten with t
efc0: 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20  he true number. 
efd0: 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28   ** of records (
efe0: 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  see syncJournal(
eff0: 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20  ))..  **.  ** A 
f000: 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69  faster alternati
f010: 76 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30  ve is to write 0
f020: 78 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65  xFFFFFFFF to the
f030: 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65   nRec field. Whe
f040: 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74  n.  ** reading t
f050: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20  he journal this 
f060: 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69  value tells SQLi
f070: 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61  te to assume tha
f080: 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20  t the.  ** rest 
f090: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
f0a0: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c  ile contains val
f0b0: 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e  id page records.
f0c0: 20 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   This assumption
f0d0: 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f  .  ** is dangero
f0e0: 75 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c  us, as if a fail
f0f0: 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69  ure occurred whi
f100: 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  lst writing to t
f110: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
f120: 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74  file it may cont
f130: 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ain some garbage
f140: 20 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65   data. There are
f150: 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20   two scenarios. 
f160: 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72   ** where this r
f170: 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72  isk can be ignor
f180: 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
f190: 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72  * When the pager
f1a0: 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d   is in no-sync m
f1b0: 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20  ode. Corruption 
f1c0: 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a  can follow a.  *
f1d0: 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c  *     power fail
f1e0: 75 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ure in this case
f1f0: 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20   anyway..  **.  
f200: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
f210: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
f220: 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73  E_APPEND flag is
f230: 20 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61   set. This guara
f240: 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74  ntees.  **     t
f250: 68 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61  hat garbage data
f260: 20 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64   is never append
f270: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
f280: 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  l file..  */.  a
f290: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
f2a0: 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
f2b0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20  ger->noSync );. 
f2c0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
f2d0: 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e  ync || (pPager->
f2e0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
f2f0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
f300: 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71  EMORY).   || (sq
f310: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
f320: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
f330: 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f  ger->fd)&SQLITE_
f340: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
f350: 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d  D) .  ){.    mem
f360: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
f370: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
f380: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
f390: 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74  ));.    put32bit
f3a0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
f3b0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
f3c0: 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a  ], 0xffffffff);.
f3d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
f3e0: 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20  set(zHeader, 0, 
f3f0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
f400: 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20  agic)+4);.  }.. 
f410: 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63   /* The random c
f420: 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61  heck-hash initia
f430: 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69  lizer */ .  sqli
f440: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
f450: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b  izeof(pPager->ck
f460: 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65  sumInit), &pPage
f470: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
f480: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
f490: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
f4a0: 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50  nalMagic)+4], pP
f4b0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
f4c0: 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69  ;.  /* The initi
f4d0: 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  al database size
f4e0: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
f4f0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
f500: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38  aJournalMagic)+8
f510: 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  ], pPager->dbOri
f520: 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65  gSize);.  /* The
f530: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
f540: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
f550: 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32  ocess */.  put32
f560: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
f570: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
f580: 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d  ic)+12], pPager-
f590: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20  >sectorSize);.. 
f5a0: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a   /* The page siz
f5b0: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
f5c0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
f5d0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
f5e0: 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  16], pPager->pag
f5f0: 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e  eSize);..  /* In
f600: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74  itializing the t
f610: 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65  ail of the buffe
f620: 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  r is not necessa
f630: 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a  ry.  Everything.
f640: 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20    ** works find 
f650: 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
f660: 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69   memset() is omi
f670: 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69  tted.  But initi
f680: 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65  alizing.  ** the
f690: 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73   memory prevents
f6a0: 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63   valgrind from c
f6b0: 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77  omplaining, so w
f6c0: 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f  e are willing to
f6d0: 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70  .  ** take the p
f6e0: 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a  erformance hit..
f6f0: 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a    */.  memset(&z
f700: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
f710: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d  ournalMagic)+20]
f720: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48  , 0,.         nH
f730: 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a  eader-(sizeof(aJ
f740: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29  ournalMagic)+20)
f750: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f  );..  /* In theo
f760: 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e  ry, it is only n
f770: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
f780: 65 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74  e the 28 bytes t
f790: 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f  hat the .  ** jo
f7a0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e  urnal header con
f7b0: 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75  sumes to the jou
f7c0: 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20  rnal file here. 
f7d0: 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74  Then increment t
f7e0: 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a  he .  ** Pager.j
f7f0: 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62  ournalOff variab
f800: 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44  le by JOURNAL_HD
f810: 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65  R_SZ so that the
f820: 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f   next .  ** reco
f830: 72 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  rd is written to
f840: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
f850: 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61  ector (leaving a
f860: 20 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65   gap in the file
f870: 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20  .  ** that will 
f880: 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69  be implicitly fi
f890: 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f  lled in by the O
f8a0: 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f  S)..  **.  ** Ho
f8b0: 77 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65  wever it has bee
f8c0: 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  n discovered tha
f8d0: 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  t on some system
f8e0: 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63  s this pattern c
f8f0: 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e  an .  ** be sign
f900: 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72  ificantly slower
f910: 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73   than contiguous
f920: 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20  ly writing data 
f930: 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a  to the file,.  *
f940: 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  * even if that m
f950: 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20  eans explicitly 
f960: 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20  writing data to 
f970: 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20  the block of .  
f980: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
f990: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74  SZ - 28) bytes t
f9a0: 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  hat will not be 
f9b0: 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73  used. So that is
f9c0: 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f   what.  ** is do
f9d0: 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ne. .  **.  ** T
f9e0: 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69  he loop is requi
f9f0: 72 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65  red here in case
fa00: 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65   the sector-size
fa10: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
fa20: 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61  the .  ** databa
fa30: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69  se page size. Si
fa40: 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20  nce the zHeader 
fa50: 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50  buffer is only P
fa60: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20  ager.pageSize.  
fa70: 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
fa80: 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  , more than one 
fa90: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
faa0: 73 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20  sWrite() may be 
fab0: 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f  required.  ** to
fac0: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e   populate the en
fad0: 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tire journal hea
fae0: 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f  der sector..  */
faf0: 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30   .  for(nWrite=0
fb00: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26  ; rc==SQLITE_OK&
fb10: 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f  &nWrite<JOURNAL_
fb20: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20  HDR_SZ(pPager); 
fb30: 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29  nWrite+=nHeader)
fb40: 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
fb50: 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
fb60: 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
fb70: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20  er->journalHdr, 
fb80: 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63  nHeader)).    rc
fb90: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
fba0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
fbb0: 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c  Header, nHeader,
fbc0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fbd0: 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Off);.    assert
fbe0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
fbf0: 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e  lHdr <= pPager->
fc00: 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20  journalOff );.  
fc10: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
fc20: 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b  lOff += nHeader;
fc30: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
fc40: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
fc50: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
fc60: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
fc70: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
fc80: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
fc90: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
fca0: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
fcb0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
fcc0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
fcd0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
fce0: 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72  ** file. The cur
fcf0: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
fd00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
fd10: 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a  e is given by.**
fd20: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fd30: 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  Off. See comment
fd40: 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  s above function
fd50: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
fd60: 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63  () for.** a desc
fd70: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  ription of the j
fd80: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f  ournal header fo
fd90: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rmat..**.** If t
fda0: 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61  he header is rea
fdb0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
fdc0: 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f  *pNRec is set to
fdd0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
fde0: 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  * page records f
fdf0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65  ollowing this he
fe00: 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a  ader and *pDbSiz
fe10: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
fe20: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  size of the.** d
fe30: 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
fe40: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
fe50: 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20  egan, in pages. 
fe60: 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b  Also, pPager->ck
fe70: 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65  sumInit.** is se
fe80: 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72  t to the value r
fe90: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
fea0: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c  rnal header. SQL
feb0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
fec0: 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  ed.** in this ca
fed0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
fee0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
fef0: 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20  file appears to 
ff00: 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  be corrupted, SQ
ff10: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20  LITE_DONE is.** 
ff20: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e  returned and *pN
ff30: 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65  Rec and *PDbSize
ff40: 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20   are undefined. 
ff50: 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   If JOURNAL_HDR_
ff60: 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e  SZ bytes.** cann
ff70: 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ot be read from 
ff80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
ff90: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
ffa0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
ffb0: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f  tatic int readJo
ffc0: 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65  urnalHdr(.  Page
ffd0: 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
ffe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
fff0: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
10000 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a  t isHot,.  i64 j
10010 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20  ournalSize,     
10020 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
10030 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72  of the open jour
10040 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
10050 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65  s */.  u32 *pNRe
10060 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
10070 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75      /* OUT: Valu
10080 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
10090 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20  nRec field */.  
100a0 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20  u32 *pDbSize    
100b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
100c0 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72  OUT: Value of or
100d0 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
100e0 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b  size field */.){
100f0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
10100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10110 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
10120 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
10130 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20  r aMagic[8];    
10140 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
10150 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
10160 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69  eader */.  i64 i
10170 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
10180 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
10190 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  t of journal hea
101a0 64 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a  der being read *
101b0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  /..  assert( isO
101c0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
101d0 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72   );      /* Jour
101e0 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
101f0 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20   open. */..  /* 
10200 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f  Advance Pager.jo
10210 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20  urnalOff to the 
10220 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78  start of the nex
10230 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65  t sector. If the
10240 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  .  ** journal fi
10250 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20  le is too small 
10260 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
10270 61 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 20  a header stored 
10280 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69  at this.  ** poi
10290 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  nt, return SQLIT
102a0 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70  E_DONE..  */.  p
102b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
102c0 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
102d0 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
102e0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
102f0 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48  nalOff+JOURNAL_H
10300 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20  DR_SZ(pPager) > 
10310 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20  journalSize ){. 
10320 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10330 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64  _DONE;.  }.  iHd
10340 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
10350 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
10360 20 52 65 61 64 20 69 6e 20 74 68 65 20 66 69 72   Read in the fir
10370 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68  st 8 bytes of th
10380 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
10390 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74  . If they do not
103a0 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20   match.  ** the 
103b0 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f   magic string fo
103c0 75 6e 64 20 61 74 20 74 68 65 20 73 74 61 72 74  und at the start
103d0 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c   of each journal
103e0 20 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a   header, return.
103f0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45    ** SQLITE_DONE
10400 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
10410 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
10420 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f  an error code. O
10430 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70  therwise,.  ** p
10440 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  roceed..  */.  i
10450 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72  f( isHot || iHdr
10460 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  Off!=pPager->jou
10470 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72  rnalHdr ){.    r
10480 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
10490 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
104a0 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
104b0 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b  agic), iHdrOff);
104c0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
104d0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
104e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65      }.    if( me
104f0 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
10500 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
10510 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29  of(aMagic))!=0 )
10520 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
10530 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
10540 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  }.  }..  /* Read
10550 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65   the first three
10560 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f   32-bit fields o
10570 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
10580 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20  ader: The nRec. 
10590 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63   ** field, the c
105a0 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69  hecksum-initiali
105b0 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61 74 61  zer and the data
105c0 62 61 73 65 20 73 69 7a 65 20 61 74 20 74 68 65  base size at the
105d0 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74   start.  ** of t
105e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
105f0 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
10600 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
10610 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a   goes wrong..  *
10620 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
10630 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
10640 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
10650 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65   iHdrOff+8, pNRe
10660 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  c)).   || SQLITE
10670 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
10680 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
10690 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26  d, iHdrOff+12, &
106a0 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
106b0 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  t)).   || SQLITE
106c0 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
106d0 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
106e0 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70  d, iHdrOff+16, p
106f0 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20  DbSize)).  ){.  
10700 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
10710 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
10720 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
10730 0a 20 20 20 20 75 33 32 20 69 50 61 67 65 53 69  .    u32 iPageSi
10740 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
10750 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66    /* Page-size f
10760 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ield of journal 
10770 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33  header */.    u3
10780 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20  2 iSectorSize;  
10790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
107a0 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20  ctor-size field 
107b0 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
107c0 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61  r */..    /* Rea
107d0 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  d the page-size 
107e0 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
107f0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
10800 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66  ields. */.    if
10810 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
10820 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
10830 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
10840 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53  ff+20, &iSectorS
10850 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51  ize)).     || SQ
10860 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
10870 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
10880 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32  ->jfd, iHdrOff+2
10890 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a  4, &iPageSize)).
108a0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
108b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
108c0 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73 20 6f     /* Versions o
108d0 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74  f SQLite prior t
108e0 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68 65 20  o 3.5.8 set the 
108f0 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20  page-size field 
10900 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  of the.    ** jo
10910 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
10920 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61  zero. In this ca
10930 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  se, assume that 
10940 74 68 65 20 50 61 67 65 72 2e 70 61 67 65 53 69  the Pager.pageSi
10950 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  ze.    ** variab
10960 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 65  le is already se
10970 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
10980 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20 20 20   page size..    
10990 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  */.    if( iPage
109a0 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
109b0 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61   iPageSize = pPa
109c0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
109d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
109e0 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
109f0 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
10a00 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
10a10 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64  ector-size field
10a20 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74  s.    ** are wit
10a30 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65  hin range. To be
10a40 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74   'in range', bot
10a50 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f  h values need to
10a60 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20   be a power.    
10a70 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65  ** of two greate
10a80 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
10a90 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20 61 6e  to 512 or 32, an
10aa0 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68  d not greater th
10ab0 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a  an their .    **
10ac0 20 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70   respective comp
10ad0 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d  ile time maximum
10ae0 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a   limits..    */.
10af0 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a      if( iPageSiz
10b00 65 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20  e<512           
10b10 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f         || iSecto
10b20 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20 7c 7c  rSize<32.     ||
10b30 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49 54   iPageSize>SQLIT
10b40 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
10b50 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d  || iSectorSize>M
10b60 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20  AX_SECTOR_SIZE. 
10b70 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53 69      || ((iPageSi
10b80 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29  ze-1)&iPageSize)
10b90 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63 74  !=0   || ((iSect
10ba0 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74 6f  orSize-1)&iSecto
10bb0 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20 29  rSize)!=0 .    )
10bc0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
10bd0 65 20 65 69 74 68 65 72 20 74 68 65 20 70 61 67  e either the pag
10be0 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f 72  e-size or sector
10bf0 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f 75  -size in the jou
10c00 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 0a  rnal-header is .
10c10 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69 64        ** invalid
10c20 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65  , then the proce
10c30 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
10c40 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  e journal-header
10c50 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20 20   must have .    
10c60 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65 66    ** crashed bef
10c70 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 20 77  ore the header w
10c80 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74 68  as synced. In th
10c90 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65 61  is case stop rea
10ca0 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20 74  ding .      ** t
10cb0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
10cc0 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  here..      */. 
10cd0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10ce0 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
10cf0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
10d00 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20 6d  e page-size to m
10d10 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 72  atch the value r
10d20 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
10d30 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55 73  rnal. .    ** Us
10d40 65 20 61 20 74 65 73 74 63 61 73 65 28 29 20 6d  e a testcase() m
10d50 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75 72  acro to make sur
10d60 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66 61  e that malloc fa
10d70 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20 20  ilure within .  
10d80 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61 67    ** PagerSetPag
10d90 65 73 69 7a 65 28 29 20 69 73 20 74 65 73 74 65  esize() is teste
10da0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  d..    */.    rc
10db0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
10dc0 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
10dd0 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c 20 2d  r, &iPageSize, -
10de0 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
10df0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10e00 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74  );..    /* Updat
10e10 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
10e20 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
10e30 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
10e40 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74 68 65  d by .    ** the
10e50 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72   process that cr
10e60 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e  eated this journ
10e70 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72  al. If this jour
10e80 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  nal was.    ** c
10e90 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
10ea0 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ess other than t
10eb0 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68  his one, then th
10ec0 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a  is routine.    *
10ed0 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  * is being calle
10ee0 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61  d from within pa
10ef0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20  ger_playback(). 
10f00 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a  The local value.
10f10 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e      ** of Pager.
10f20 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65  sectorSize is re
10f30 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e  stored at the en
10f40 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e  d of that routin
10f50 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  e..    */.    pP
10f60 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
10f70 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a   = iSectorSize;.
10f80 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
10f90 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
10fa0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
10fb0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
10fc0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
10fd0 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d  e the supplied m
10fe0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
10ff0 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
11000 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
11010 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20  er.** pPager at 
11020 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
11030 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72  tion. The master
11040 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
11050 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a  st be the last.*
11060 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20  * thing written 
11070 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  to a journal fil
11080 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
11090 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  is in full-sync 
110a0 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75  mode, the.** jou
110b0 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
110c0 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64  ptor is advanced
110d0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
110e0 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66  tor boundary bef
110f0 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20  ore.** anything 
11100 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20  is written. The 
11110 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a  format is:.**.**
11120 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41     + 4 bytes: PA
11130 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20  GER_MJ_PGNO..** 
11140 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d 61 73    + N bytes: Mas
11150 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
11160 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a  name in utf-8..*
11170 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4e  *   + 4 bytes: N
11180 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74   (length of mast
11190 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
111a0 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c  in bytes, no nul
111b0 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a  -terminator)..**
111c0 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61     + 4 bytes: Ma
111d0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
111e0 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  e checksum..**  
111f0 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75   + 8 bytes: aJou
11200 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a  rnalMagic[]..**.
11210 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
11220 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b  urnal page check
11230 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f  sum is the sum o
11240 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  f the bytes in t
11250 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
11260 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65  rnal name, where
11270 20 65 61 63 68 20 62 79 74 65 20 69 73 20 69 6e   each byte is in
11280 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20 73  terpreted as a s
11290 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e 74 65  igned 8-bit inte
112a0 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d  ger..**.** If zM
112b0 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20  aster is a NULL 
112c0 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20  pointer (occurs 
112d0 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74  for a single dat
112e0 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
112f0 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c  n), .** this cal
11300 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  l is a no-op..*/
11310 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
11320 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50  eMasterJournal(P
11330 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
11340 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
11350 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
11360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11370 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
11380 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   code */.  int n
11390 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
113a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
113b0 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e 67 20  ength of string 
113c0 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69 36 34  zMaster */.  i64
113d0 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
113e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
113f0 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
11400 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  r in journal fil
11410 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53  e */.  i64 jrnlS
11420 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
11430 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
11440 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
11450 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32  on disk */.  u32
11460 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20 20 20   cksum = 0;     
11470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11480 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73 74 72   Checksum of str
11490 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a  ing zMaster */..
114a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
114b0 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29  ->setMaster==0 )
114c0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  ;.  assert( !pag
114d0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
114e0 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73   );..  if( !zMas
114f0 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61 67 65  ter .   || pPage
11500 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
11510 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
11520 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c 7c 20  E_MEMORY .   || 
11530 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
11540 6a 66 64 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  jfd).  ){.    re
11550 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11560 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65    }.  pPager->se
11570 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61  tMaster = 1;.  a
11580 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
11590 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61  ournalHdr <= pPa
115a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
115b0 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61  );..  /* Calcula
115c0 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e  te the length in
115d0 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20 63   bytes and the c
115e0 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74  hecksum of zMast
115f0 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73  er */.  for(nMas
11600 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e  ter=0; zMaster[n
11610 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72  Master]; nMaster
11620 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  ++){.    cksum +
11630 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65  = zMaster[nMaste
11640 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r];.  }..  /* If
11650 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
11660 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  de, advance to t
11670 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63  he next disk sec
11680 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69  tor before writi
11690 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74  ng.  ** the mast
116a0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
116b0 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65   This is in case
116c0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   the previous pa
116d0 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ge written to.  
116e0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
116f0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
11700 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  synced..  */.  i
11710 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
11720 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
11730 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
11740 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
11750 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
11760 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  iHdrOff = pPager
11770 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
11780 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61   /* Write the ma
11790 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74  ster journal dat
117a0 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  a to the end of 
117b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
117c0 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72  . If.  ** an err
117d0 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
117e0 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
117f0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
11800 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d    */.  if( (0 !=
11810 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
11820 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
11830 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d  iHdrOff, PAGER_M
11840 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29  J_PGNO(pPager)))
11850 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
11860 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
11870 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
11880 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72  zMaster, nMaster
11890 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20  , iHdrOff+4))). 
118a0 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
118b0 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
118c0 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
118d0 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61  f+4+nMaster, nMa
118e0 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30  ster))).   || (0
118f0 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33   != (rc = write3
11900 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
11910 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61  d, iHdrOff+4+nMa
11920 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29  ster+4, cksum)))
11930 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
11940 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
11950 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  e(pPager->jfd, a
11960 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c  JournalMagic, 8,
11970 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11990 20 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73    iHdrOff+4+nMas
119a0 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20  ter+8))).  ){.  
119b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
119c0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
119d0 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65  alOff += (nMaste
119e0 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  r+20);..  /* If 
119f0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
11a00 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61  peristent-journa
11a10 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  l mode, then the
11a20 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20   physical .  ** 
11a30 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79  journal-file may
11a40 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65   extend past the
11a50 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74   end of the mast
11a60 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er-journal name.
11a70 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73    ** and 8 bytes
11a80 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a   of magic data j
11a90 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ust written to t
11aa0 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  he file. This is
11ab0 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73   .  ** dangerous
11ac0 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64   because the cod
11ad0 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  e to rollback a 
11ae0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
11af0 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  .  ** will not b
11b00 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74  e able to find t
11b10 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
11b20 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  l name to determ
11b30 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65  ine .  ** whethe
11b40 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
11b50 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20  rnal is hot. .  
11b60 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20  **.  ** Easiest 
11b70 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74  thing to do in t
11b80 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20  his scenario is 
11b90 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  to truncate the 
11ba0 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
11bb0 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72  le to the requir
11bc0 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20  ed size..  */ . 
11bd0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
11be0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
11bf0 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
11c00 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29  jfd, &jrnlSize))
11c10 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e  .   && jrnlSize>
11c20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11c30 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  ff.  ){.    rc =
11c40 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
11c50 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
11c60 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11c70 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ff);.  }.  retur
11c80 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
11c90 69 73 63 61 72 64 20 74 68 65 20 65 6e 74 69 72  iscard the entir
11ca0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
11cb0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  e in-memory page
11cc0 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61 74 69  -cache..*/.stati
11cd0 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
11ce0 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
11cf0 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 69 44 61  ){.  pPager->iDa
11d00 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 0a 20 20 73  taVersion++;.  s
11d10 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
11d20 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
11d30 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  kup);.  sqlite3P
11d40 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65  cacheClear(pPage
11d50 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a  r->pPCache);.}..
11d60 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
11d70 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65   pPager->iDataVe
11d80 72 73 69 6f 6e 20 76 61 6c 75 65 0a 2a 2f 0a 75  rsion value.*/.u
11d90 33 32 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  32 sqlite3PagerD
11da0 61 74 61 56 65 72 73 69 6f 6e 28 50 61 67 65 72  ataVersion(Pager
11db0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
11dc0 75 72 6e 20 70 50 61 67 65 72 2d 3e 69 44 61 74  urn pPager->iDat
11dd0 61 56 65 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a  aVersion;.}../*.
11de0 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73 74 72 75  ** Free all stru
11df0 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 50 61  ctures in the Pa
11e00 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d  ger.aSavepoint[]
11e10 20 61 72 72 61 79 20 61 6e 64 20 73 65 74 20 62   array and set b
11e20 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61  oth.** Pager.aSa
11e30 76 65 70 6f 69 6e 74 20 61 6e 64 20 50 61 67 65  vepoint and Page
11e40 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f 20  r.nSavepoint to 
11e50 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20  zero. Close the 
11e60 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69  sub-journal.** i
11e70 66 20 69 74 20 69 73 20 6f 70 65 6e 20 61 6e 64  f it is open and
11e80 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
11e90 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  t in exclusive m
11ea0 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ode..*/.static v
11eb0 6f 69 64 20 72 65 6c 65 61 73 65 41 6c 6c 53 61  oid releaseAllSa
11ec0 76 65 70 6f 69 6e 74 73 28 50 61 67 65 72 20 2a  vepoints(Pager *
11ed0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 69  pPager){.  int i
11ee0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
11ef0 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72   /* Iterator for
11f00 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68   looping through
11f10 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
11f20 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b  t */.  for(ii=0;
11f30 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76   ii<pPager->nSav
11f40 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20  epoint; ii++){. 
11f50 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
11f60 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
11f70 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70  aSavepoint[ii].p
11f80 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  InSavepoint);.  
11f90 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  }.  if( !pPager-
11fa0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c  >exclusiveMode |
11fb0 7c 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  | sqlite3Journal
11fc0 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65  IsInMemory(pPage
11fd0 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20  r->sjfd) ){.    
11fe0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
11ff0 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20  Pager->sjfd);.  
12000 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
12010 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
12020 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  int);.  pPager->
12030 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  aSavepoint = 0;.
12040 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70    pPager->nSavep
12050 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  oint = 0;.  pPag
12060 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b  er->nSubRec = 0;
12070 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
12080 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70 67 6e  e bit number pgn
12090 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72 53 61  o in the PagerSa
120a0 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70  vepoint.pInSavep
120b0 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65 63 73  oint .** bitvecs
120c0 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76   of all open sav
120d0 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72 6e 20  epoints. Return 
120e0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
120f0 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51  cessful.** or SQ
12100 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20  LITE_NOMEM if a 
12110 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f  malloc failure o
12120 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccurs..*/.static
12130 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65 70 6f   int addToSavepo
12140 69 6e 74 42 69 74 76 65 63 73 28 50 61 67 65 72  intBitvecs(Pager
12150 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
12160 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20  gno){.  int ii; 
12170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12180 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
12190 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  r */.  int rc = 
121a0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
121b0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
121c0 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20  */..  for(ii=0; 
121d0 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
121e0 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
121f0 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
12200 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61   *p = &pPager->a
12210 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20  Savepoint[ii];. 
12220 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e     if( pgno<=p->
12230 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72  nOrig ){.      r
12240 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69 74 76  c |= sqlite3Bitv
12250 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65  ecSet(p->pInSave
12260 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  point, pgno);.  
12270 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
12280 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
12290 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
122a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
122b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
122c0 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  M );.    }.  }. 
122d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
122e0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
122f0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  on is a no-op if
12300 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
12310 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20   exclusive mode 
12320 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68  and not.** in th
12330 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f  e ERROR state. O
12340 74 68 65 72 77 69 73 65 2c 20 69 74 20 73 77 69  therwise, it swi
12350 74 63 68 65 73 20 74 68 65 20 70 61 67 65 72 20  tches the pager 
12360 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a  to PAGER_OPEN.**
12370 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   state..**.** If
12380 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
12390 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  t in exclusive-a
123a0 63 63 65 73 73 20 6d 6f 64 65 2c 20 74 68 65 20  ccess mode, the 
123b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
123c0 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75  .** completely u
123d0 6e 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68 65 20  nlocked. If the 
123e0 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64  file is unlocked
123f0 20 61 6e 64 20 74 68 65 20 66 69 6c 65 2d 73 79   and the file-sy
12400 73 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  stem does.** not
12410 20 65 78 68 69 62 69 74 20 74 68 65 20 55 4e 44   exhibit the UND
12420 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
12430 45 4e 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65  EN property, the
12440 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
12450 0a 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66 20 69  .** closed (if i
12460 74 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a  t is open)..**.*
12470 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
12480 73 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  s in ERROR state
12490 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
124a0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ion is called, t
124b0 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  he .** contents 
124c0 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63  of the pager cac
124d0 68 65 20 61 72 65 20 64 69 73 63 61 72 64 65 64  he are discarded
124e0 20 62 65 66 6f 72 65 20 73 77 69 74 63 68 69 6e   before switchin
124f0 67 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68  g back to .** th
12500 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20 52 65  e OPEN state. Re
12510 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
12520 68 65 72 20 74 68 65 20 70 61 67 65 72 20 69 73  her the pager is
12530 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f   in exclusive-mo
12540 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e  de.** or not, an
12550 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c  y journal file l
12560 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  eft in the file-
12570 73 79 73 74 65 6d 20 77 69 6c 6c 20 62 65 20 74  system will be t
12580 72 65 61 74 65 64 0a 2a 2a 20 61 73 20 61 20 68  reated.** as a h
12590 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72  ot-journal and r
125a0 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 6e  olled back the n
125b0 65 78 74 20 74 69 6d 65 20 61 20 72 65 61 64 2d  ext time a read-
125c0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
125d0 73 20 6f 70 65 6e 65 64 20 28 62 79 20 74 68 69  s opened (by thi
125e0 73 20 6f 72 20 62 79 20 61 6e 79 20 6f 74 68 65  s or by any othe
125f0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a  r connection)..*
12600 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
12610 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72  ger_unlock(Pager
12620 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 61 73   *pPager){..  as
12630 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
12640 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
12650 45 52 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  ER .       || pP
12660 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
12670 47 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20  GER_OPEN .      
12680 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
12690 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te==PAGER_ERROR 
126a0 0a 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  .  );..  sqlite3
126b0 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
126c0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
126d0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  );.  pPager->pIn
126e0 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72  Journal = 0;.  r
126f0 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
12700 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  nts(pPager);..  
12710 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
12720 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61  pPager) ){.    a
12730 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
12740 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
12750 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64     sqlite3WalEnd
12760 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
12770 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20  pPager->pWal);. 
12780 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
12790 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
127a0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61    }else if( !pPa
127b0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
127c0 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  de ){.    int rc
127d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
127e0 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
127f0 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 20 62   code returned b
12800 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  y pagerUnlockDb(
12810 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 63  ) */.    int iDc
12820 20 3d 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72   = isOpen(pPager
12830 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f 73 44  ->fd)?sqlite3OsD
12840 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
12850 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
12860 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  :0;..    /* If t
12870 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
12880 74 65 6d 20 73 75 70 70 6f 72 74 20 64 65 6c 65  tem support dele
12890 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c  tion of open fil
128a0 65 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  es, then.    ** 
128b0 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61  close the journa
128c0 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70  l file when drop
128d0 70 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ping the databas
128e0 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69  e lock.  Otherwi
128f0 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65  se.    ** anothe
12900 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  r connection wit
12910 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64  h journal_mode=d
12920 65 6c 65 74 65 20 6d 69 67 68 74 20 64 65 6c 65  elete might dele
12930 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  te the file.    
12940 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ** out from unde
12950 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  r us..    */.   
12960 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
12970 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
12980 52 59 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a  RY   & 5)!=1 );.
12990 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
129a0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
129b0 46 46 20 20 20 20 20 20 26 20 35 29 21 3d 31 20  FF      & 5)!=1 
129c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
129d0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
129e0 45 5f 57 41 4c 20 20 20 20 20 20 26 20 35 29 21  E_WAL      & 5)!
129f0 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
12a00 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
12a10 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20 26 20  MODE_DELETE   & 
12a20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
12a30 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
12a40 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
12a50 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20   & 5)==1 );.    
12a60 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
12a70 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
12a80 53 54 20 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20  ST  & 5)==1 );. 
12a90 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 20 26     if( 0==(iDc &
12aa0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e   SQLITE_IOCAP_UN
12ab0 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f  DELETABLE_WHEN_O
12ac0 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d  PEN).     || 1!=
12ad0 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
12ae0 4d 6f 64 65 20 26 20 35 29 0a 20 20 20 20 29 7b  Mode & 5).    ){
12af0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
12b00 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
12b10 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  d);.    }..    /
12b20 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
12b30 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  s in the ERROR s
12b40 74 61 74 65 20 61 6e 64 20 74 68 65 20 63 61 6c  tate and the cal
12b50 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  l to unlock the 
12b60 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
12b70 66 69 6c 65 20 66 61 69 6c 73 2c 20 73 65 74 20  file fails, set 
12b80 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b  the current lock
12b90 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
12ba0 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
12bb0 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 74  t.    ** above t
12bc0 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72 20 55  he #define for U
12bd0 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20  NKNOWN_LOCK for 
12be0 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  an explanation o
12bf0 66 20 77 68 79 20 74 68 69 73 0a 20 20 20 20 2a  f why this.    *
12c00 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  * is necessary..
12c10 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
12c20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50  pagerUnlockDb(pP
12c30 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  ager, NO_LOCK);.
12c40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12c50 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
12c60 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45  >eState==PAGER_E
12c70 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 50  RROR ){.      pP
12c80 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e  ager->eLock = UN
12c90 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20  KNOWN_LOCK;.    
12ca0 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  }..    /* The pa
12cb0 67 65 72 20 73 74 61 74 65 20 6d 61 79 20 62 65  ger state may be
12cc0 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 50 41   changed from PA
12cd0 47 45 52 5f 45 52 52 4f 52 20 74 6f 20 50 41 47  GER_ERROR to PAG
12ce0 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20 20 20  ER_OPEN here.   
12cf0 20 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c 65 61   ** without clea
12d00 72 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20 63  ring the error c
12d10 6f 64 65 2e 20 54 68 69 73 20 69 73 20 69 6e 74  ode. This is int
12d20 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65  entional - the e
12d30 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65  rror.    ** code
12d40 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 64 20   is cleared and 
12d50 74 68 65 20 63 61 63 68 65 20 72 65 73 65 74 20  the cache reset 
12d60 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c  in the block bel
12d70 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ow..    */.    a
12d80 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
12d90 72 72 43 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  rrCode || pPager
12da0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
12db0 45 52 52 4f 52 20 29 3b 0a 20 20 20 20 70 50 61  ERROR );.    pPa
12dc0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
12dd0 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  Done = 0;.    pP
12de0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
12df0 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a  AGER_OPEN;.  }..
12e00 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72    /* If Pager.er
12e10 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68  rCode is set, th
12e20 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
12e30 65 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61  e pager cache ca
12e40 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74 72 75  nnot be.  ** tru
12e50 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74  sted. Now that t
12e60 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
12e70 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
12e80 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2c  es to the pager,
12e90 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20 73 61 66  .  ** it can saf
12ea0 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f  ely move back to
12eb0 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
12ec0 65 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  e. This happens 
12ed0 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72  in both.  ** nor
12ee0 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75 73 69 76  mal and exclusiv
12ef0 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a  e-locking mode..
12f00 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
12f10 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
12f20 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45  SQLITE_OK || !ME
12f30 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61  MDB );.  if( pPa
12f40 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
12f50 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
12f60 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  tempFile==0 ){. 
12f70 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
12f80 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
12f90 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
12fa0 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  untDone = 0;.   
12fb0 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
12fc0 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
12fd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12fe0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
12ff0 3d 20 28 69 73 4f 70 65 6e 28 70 50 61 67 65 72  = (isOpen(pPager
13000 2d 3e 6a 66 64 29 20 3f 20 50 41 47 45 52 5f 4f  ->jfd) ? PAGER_O
13010 50 45 4e 20 3a 20 50 41 47 45 52 5f 52 45 41 44  PEN : PAGER_READ
13020 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ER);.    }.    i
13030 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67  f( USEFETCH(pPag
13040 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f 73 55  er) ) sqlite3OsU
13050 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
13060 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 50  d, 0, 0);.    pP
13070 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
13080 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 73  SQLITE_OK;.    s
13090 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64 28 70  etGetterMethod(p
130a0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 70  Pager);.  }..  p
130b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
130c0 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  f = 0;.  pPager-
130d0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
130e0 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
130f0 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  ster = 0;.}../*.
13100 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
13110 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65   is called whene
13120 76 65 72 20 61 6e 20 49 4f 45 52 52 20 6f 72 20  ver an IOERR or 
13130 46 55 4c 4c 20 65 72 72 6f 72 20 74 68 61 74 20  FULL error that 
13140 72 65 71 75 69 72 65 73 0a 2a 2a 20 74 68 65 20  requires.** the 
13150 70 61 67 65 72 20 74 6f 20 74 72 61 6e 73 69 74  pager to transit
13160 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 45 52 52  ion into the ERR
13170 4f 52 20 73 74 61 74 65 20 6d 61 79 20 61 68 76  OR state may ahv
13180 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 54  e occurred..** T
13190 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
131a0 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
131b0 6f 20 74 68 65 20 70 61 67 65 72 20 73 74 72 75  o the pager stru
131c0 63 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f 6e  cture, the secon
131d0 64 20 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d  d .** the error-
131e0 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65  code about to be
131f0 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70   returned by a p
13200 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f  ager API functio
13210 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61 6c 75 65  n. The .** value
13220 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 63   returned is a c
13230 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e  opy of the secon
13240 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
13250 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a  is function. .**
13260 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e  .** If the secon
13270 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51  d argument is SQ
13280 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54  LITE_FULL, SQLIT
13290 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f  E_IOERR or one o
132a0 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52 52 20 73  f the.** IOERR s
132b0 75 62 2d 63 6f 64 65 73 2c 20 74 68 65 20 70 61  ub-codes, the pa
132c0 67 65 72 20 65 6e 74 65 72 73 20 74 68 65 20 45  ger enters the E
132d0 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74  RROR state and t
132e0 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  he error code.**
132f0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 50 61   is stored in Pa
13300 67 65 72 2e 65 72 72 43 6f 64 65 2e 20 57 68 69  ger.errCode. Whi
13310 6c 65 20 74 68 65 20 70 61 67 65 72 20 72 65 6d  le the pager rem
13320 61 69 6e 73 20 69 6e 20 74 68 65 20 45 52 52 4f  ains in the ERRO
13330 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20  R state,.** all 
13340 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c 6c 73 20  major API calls 
13350 6f 6e 20 74 68 65 20 50 61 67 65 72 20 77 69 6c  on the Pager wil
13360 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65  l immediately re
13370 74 75 72 6e 20 50 61 67 65 72 2e 65 72 72 43 6f  turn Pager.errCo
13380 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 52  de..**.** The ER
13390 52 4f 52 20 73 74 61 74 65 20 69 6e 64 69 63 61  ROR state indica
133a0 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  tes that the con
133b0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
133c0 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e  er-cache .** can
133d0 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20  not be trusted. 
133e0 54 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62  This state can b
133f0 65 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d  e cleared by com
13400 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69  pletely discardi
13410 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ng .** the conte
13420 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
13430 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61  -cache. If a tra
13440 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74  nsaction was act
13450 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ive when.** the 
13460 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72  persistent error
13470 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20   occurred, then 
13480 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
13490 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a  rnal may need.**
134a0 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64 20   to be replayed 
134b0 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
134c0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
134d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
134e0 20 69 66 0a 2a 2a 20 69 74 20 77 65 72 65 20 61   if.** it were a
134f0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a   hot-journal)..*
13500 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
13510 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a  er_error(Pager *
13520 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b  pPager, int rc){
13530 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20  .  int rc2 = rc 
13540 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74  & 0xff;.  assert
13550 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13560 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61  || !MEMDB );.  a
13570 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 70 50  ssert(.       pP
13580 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
13590 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20  QLITE_FULL ||.  
135a0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
135b0 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
135c0 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67 65  ||.       (pPage
135d0 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66  r->errCode & 0xf
135e0 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  f)==SQLITE_IOERR
135f0 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 32 3d  .  );.  if( rc2=
13600 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20  =SQLITE_FULL || 
13610 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  rc2==SQLITE_IOER
13620 52 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  R ){.    pPager-
13630 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
13640 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
13650 65 20 3d 20 50 41 47 45 52 5f 45 52 52 4f 52 3b  e = PAGER_ERROR;
13660 0a 20 20 20 20 73 65 74 47 65 74 74 65 72 4d 65  .    setGetterMe
13670 74 68 6f 64 28 70 50 61 67 65 72 29 3b 0a 20 20  thod(pPager);.  
13680 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
13690 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  ..static int pag
136a0 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
136b0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
136c0 6e 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54  nPage);../*.** T
136d0 68 65 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  he write transac
136e0 74 69 6f 6e 20 6f 70 65 6e 20 6f 6e 20 70 50 61  tion open on pPa
136f0 67 65 72 20 69 73 20 62 65 69 6e 67 20 63 6f 6d  ger is being com
13700 6d 69 74 74 65 64 20 28 62 43 6f 6d 6d 69 74 3d  mitted (bCommit=
13710 3d 31 29 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 65 64  =1).** or rolled
13720 20 62 61 63 6b 20 28 62 43 6f 6d 6d 69 74 3d 3d   back (bCommit==
13730 30 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  0)..**.** Return
13740 20 54 52 55 45 20 69 66 20 61 6e 64 20 6f 6e 6c   TRUE if and onl
13750 79 20 69 66 20 61 6c 6c 20 64 69 72 74 79 20 70  y if all dirty p
13760 61 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20 66  ages should be f
13770 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 0a  lushed to disk..
13780 2a 2a 0a 2a 2a 20 52 75 6c 65 73 3a 0a 2a 2a 0a  **.** Rules:.**.
13790 2a 2a 20 20 20 2a 20 20 46 6f 72 20 6e 6f 6e 2d  **   *  For non-
137a0 54 45 4d 50 20 64 61 74 61 62 61 73 65 73 2c 20  TEMP databases, 
137b0 61 6c 77 61 79 73 20 73 79 6e 63 20 74 6f 20 64  always sync to d
137c0 69 73 6b 2e 20 20 54 68 69 73 20 69 73 20 6e 65  isk.  This is ne
137d0 63 65 73 73 61 72 79 0a 2a 2a 20 20 20 20 20 20  cessary.**      
137e0 66 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  for transactions
137f0 20 74 6f 20 62 65 20 64 75 72 61 62 6c 65 2e 0a   to be durable..
13800 2a 2a 0a 2a 2a 20 20 20 2a 20 20 53 79 6e 63 20  **.**   *  Sync 
13810 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 6f 6e  TEMP database on
13820 6c 79 20 6f 6e 20 61 20 43 4f 4d 4d 49 54 20 28  ly on a COMMIT (
13830 6e 6f 74 20 61 20 52 4f 4c 4c 42 41 43 4b 29 20  not a ROLLBACK) 
13840 77 68 65 6e 20 74 68 65 20 62 61 63 6b 69 6e 67  when the backing
13850 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 20 68 61  .**      file ha
13860 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 61  s been created a
13870 6c 72 65 61 64 79 20 28 76 69 61 20 61 20 73 70  lready (via a sp
13880 69 6c 6c 20 6f 6e 20 70 61 67 65 72 53 74 72 65  ill on pagerStre
13890 73 73 28 29 29 20 61 6e 64 0a 2a 2a 20 20 20 20  ss()) and.**    
138a0 20 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65    when the numbe
138b0 72 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  r of dirty pages
138c0 20 69 6e 20 6d 65 6d 6f 72 79 20 65 78 63 65 65   in memory excee
138d0 64 73 20 32 35 25 20 6f 66 20 74 68 65 20 74 6f  ds 25% of the to
138e0 74 61 6c 0a 2a 2a 20 20 20 20 20 20 63 61 63 68  tal.**      cach
138f0 65 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  e size..*/.stati
13900 63 20 69 6e 74 20 70 61 67 65 72 46 6c 75 73 68  c int pagerFlush
13910 4f 6e 43 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a  OnCommit(Pager *
13920 70 50 61 67 65 72 2c 20 69 6e 74 20 62 43 6f 6d  pPager, int bCom
13930 6d 69 74 29 7b 0a 20 20 69 66 28 20 70 50 61 67  mit){.  if( pPag
13940 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20  er->tempFile==0 
13950 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
13960 28 20 21 62 43 6f 6d 6d 69 74 20 29 20 72 65 74  ( !bCommit ) ret
13970 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 69 73  urn 0;.  if( !is
13980 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
13990 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
139a0 65 74 75 72 6e 20 28 73 71 6c 69 74 65 33 50 43  eturn (sqlite3PC
139b0 61 63 68 65 50 65 72 63 65 6e 74 44 69 72 74 79  achePercentDirty
139c0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
139d0 29 3e 3d 32 35 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )>=25);.}../*.**
139e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
139f0 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ds a transaction
13a00 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  . A transaction 
13a10 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64  is usually ended
13a20 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61   by .** either a
13a30 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c   COMMIT or a ROL
13a40 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e  LBACK operation.
13a50 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
13a60 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20  y be called .** 
13a70 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  after rollback o
13a80 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  f a hot-journal,
13a90 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
13aa0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65  occurs while ope
13ab0 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  ning.** the jour
13ac0 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74  nal file or writ
13ad0 69 6e 67 20 74 68 65 20 76 65 72 79 20 66 69 72  ing the very fir
13ae0 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  st journal-heade
13af0 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61  r of a.** databa
13b00 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  se transaction..
13b10 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ** .** This rout
13b20 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
13b30 6c 65 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52  led in PAGER_ERR
13b40 4f 52 20 73 74 61 74 65 2e 20 49 66 20 69 74 20  OR state. If it 
13b50 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20  is called.** in 
13b60 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41  PAGER_NONE or PA
13b70 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65  GER_SHARED state
13b80 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68 65   and the lock he
13b90 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78  ld is less.** ex
13ba0 63 6c 75 73 69 76 65 20 74 68 61 6e 20 61 20 52  clusive than a R
13bb0 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74  ESERVED lock, it
13bc0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
13bd0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  ** Otherwise, an
13be0 79 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  y active savepoi
13bf0 6e 74 73 20 61 72 65 20 72 65 6c 65 61 73 65 64  nts are released
13c00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
13c10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f  ournal file is o
13c20 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20  pen, then it is 
13c30 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63  "finalized". Onc
13c40 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  e a journal .** 
13c50 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69  file has been fi
13c60 6e 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f  nalized it is no
13c70 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73  t possible to us
13c80 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63  e it to roll bac
13c90 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74  k a .** transact
13ca0 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74  ion. Nor will it
13cb0 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74   be considered t
13cc0 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  o be a hot-journ
13cd0 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72  al by this.** or
13ce0 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62   any other datab
13cf0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ase connection. 
13d00 45 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f  Exactly how a jo
13d10 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a  urnal is finaliz
13d20 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e  ed.** depends on
13d30 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
13d40 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
13d50 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
13d60 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68  e mode and.** th
13d70 65 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61  e current journa
13d80 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f  l-mode (Pager.jo
13d90 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29  urnalMode value)
13da0 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  , as follows:.**
13db0 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
13dc0 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20  e==MEMORY.**    
13dd0 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   Journal file de
13de0 73 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70  scriptor is simp
13df0 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20  ly closed. This 
13e00 64 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20  destroys an .** 
13e10 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f      in-memory jo
13e20 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a  urnal..**.**   j
13e30 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e  ournalMode==TRUN
13e40 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  CATE.**     Jour
13e50 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e  nal file is trun
13e60 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79  cated to zero by
13e70 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  tes in size..**.
13e80 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
13e90 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20  ==PERSIST.**    
13ea0 20 54 68 65 20 66 69 72 73 74 20 32 38 20 62 79   The first 28 by
13eb0 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
13ec0 61 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f  al file are zero
13ed0 65 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64  ed. This invalid
13ee0 61 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20  ates.**     the 
13ef0 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
13f00 61 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65  ader in the file
13f10 2c 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20  , and hence the 
13f20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a  entire journal.*
13f30 2a 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69  *     file. An i
13f40 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66  nvalid journal f
13f50 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f  ile cannot be ro
13f60 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
13f70 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
13f80 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68  DELETE.**     Th
13f90 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
13fa0 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c  s closed and del
13fb0 65 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  eted using sqlit
13fc0 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a  e3OsDelete()..**
13fd0 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20 70  .**     If the p
13fe0 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
13ff0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
14000 65 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f  e, this method o
14010 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20  f finalizing.** 
14020 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20      the journal 
14030 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73  file is never us
14040 65 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20  ed. Instead, if 
14050 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  the journalMode 
14060 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45  is.**     DELETE
14070 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69   and the pager i
14080 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  s in exclusive m
14090 6f 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20  ode, the method 
140a0 64 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a  described under.
140b0 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  **     journalMo
140c0 64 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75  de==PERSIST is u
140d0 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  sed instead..**.
140e0 2a 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  ** After the jou
140f0 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65  rnal is finalize
14100 64 2c 20 74 68 65 20 70 61 67 65 72 20 6d 6f 76  d, the pager mov
14110 65 73 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44  es to PAGER_READ
14120 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20  ER state..** If 
14130 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65  running in non-e
14140 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61 63  xclusive rollbac
14150 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b  k mode, the lock
14160 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20   on the file is 
14170 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74  .** downgraded t
14180 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e  o a SHARED_LOCK.
14190 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
141a0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
141b0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  no error occurs.
141c0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
141d0 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e  urs during.** an
141e0 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72  y of the IO oper
141f0 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69  ations to finali
14200 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
14210 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68  ile or unlock th
14220 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68  e.** database th
14230 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
14240 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
14250 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66   to the user. If
14260 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69   the .** operati
14270 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  on to finalize t
14280 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
14290 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20  fails, then the 
142a0 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72  code still.** tr
142b0 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ies to unlock th
142c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
142d0 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  if not in exclus
142e0 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  ive mode. If the
142f0 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61  .** unlock opera
14300 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65  tion fails as we
14310 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ll, then the fir
14320 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  st error code re
14330 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  lated.** to the 
14340 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f  first error enco
14350 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75  untered (the jou
14360 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f  rnal finalizatio
14370 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74  n one) is.** ret
14380 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
14390 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74   int pager_end_t
143a0 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
143b0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61   *pPager, int ha
143c0 73 4d 61 73 74 65 72 2c 20 69 6e 74 20 62 43 6f  sMaster, int bCo
143d0 6d 6d 69 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  mmit){.  int rc 
143e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
143f0 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
14400 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e  from journal fin
14410 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74  alization operat
14420 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32  ion */.  int rc2
14430 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
14440 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
14450 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c  from db file unl
14460 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ock operation */
14470 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e  ..  /* Do nothin
14480 67 20 69 66 20 74 68 65 20 70 61 67 65 72 20 64  g if the pager d
14490 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20  oes not have an 
144a0 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
144b0 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61  action.  ** or a
144c0 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56  t least a RESERV
144d0 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73 20 66 75  ED lock. This fu
144e0 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
144f0 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 0a  lled when there.
14500 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72 69 74 65    ** is no write
14510 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74  -transaction act
14520 69 76 65 20 62 75 74 20 61 20 52 45 53 45 52 56  ive but a RESERV
14530 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
14540 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65 6c 64 20  ck is.  ** held 
14550 75 6e 64 65 72 20 74 77 6f 20 63 69 72 63 75 6d  under two circum
14560 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20 20  stances:.  **.  
14570 2a 2a 20 20 20 31 2e 20 41 66 74 65 72 20 61 20  **   1. After a 
14580 73 75 63 63 65 73 73 66 75 6c 20 68 6f 74 2d 6a  successful hot-j
14590 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c  ournal rollback,
145a0 20 69 74 20 69 73 20 63 61 6c 6c 65 64 20 77 69   it is called wi
145b0 74 68 0a 20 20 2a 2a 20 20 20 20 20 20 65 53 74  th.  **      eSt
145c0 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20  ate==PAGER_NONE 
145d0 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  and eLock==EXCLU
145e0 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a  SIVE_LOCK..  **.
145f0 20 20 2a 2a 20 20 20 32 2e 20 49 66 20 61 20 63    **   2. If a c
14600 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6c  onnection with l
14610 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
14620 75 73 69 76 65 20 68 6f 6c 64 69 6e 67 20 61 6e  usive holding an
14630 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20 2a 2a   EXCLUSIVE .  **
14640 20 20 20 20 20 20 6c 6f 63 6b 20 73 77 69 74 63        lock switc
14650 68 65 73 20 62 61 63 6b 20 74 6f 20 6c 6f 63 6b  hes back to lock
14660 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20  ing_mode=normal 
14670 61 6e 64 20 74 68 65 6e 20 65 78 65 63 75 74 65  and then execute
14680 73 20 61 0a 20 20 2a 2a 20 20 20 20 20 20 72 65  s a.  **      re
14690 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  ad-transaction, 
146a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
146b0 20 63 61 6c 6c 65 64 20 77 69 74 68 20 65 53 74   called with eSt
146c0 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
146d0 52 20 0a 20 20 2a 2a 20 20 20 20 20 20 61 6e 64  R .  **      and
146e0 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56   eLock==EXCLUSIV
146f0 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20  E_LOCK when the 
14700 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
14710 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f   is closed..  */
14720 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
14730 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
14740 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
14750 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
14760 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
14770 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
14780 65 53 74 61 74 65 3c 50 41 47 45 52 5f 57 52 49  eState<PAGER_WRI
14790 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26 20 70 50  TER_LOCKED && pP
147a0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45  ager->eLock<RESE
147b0 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
147c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
147d0 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73  K;.  }..  releas
147e0 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70  eAllSavepoints(p
147f0 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74  Pager);.  assert
14800 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
14810 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  >jfd) || pPager-
14820 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 0a  >pInJournal==0 .
14830 20 20 20 20 20 20 7c 7c 20 28 73 71 6c 69 74 65        || (sqlite
14840 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
14850 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
14860 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  >fd)&SQLITE_IOCA
14870 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 29 0a  P_BATCH_ATOMIC).
14880 20 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65    );.  if( isOpe
14890 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
148a0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
148b0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
148c0 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  r) );..    /* Fi
148d0 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
148e0 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
148f0 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  if( sqlite3Journ
14900 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61  alIsInMemory(pPa
14910 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
14920 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50     /* assert( pP
14930 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
14940 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
14950 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 20 2a  MODE_MEMORY ); *
14960 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  /.      sqlite3O
14970 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
14980 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  fd);.    }else i
14990 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
149a0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
149b0 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
149c0 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  TE ){.      if( 
149d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
149e0 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ff==0 ){.       
149f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14a00 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14a10 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14a20 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
14a30 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
14a40 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
14a50 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
14a60 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
14a70 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65           /* Make
14a80 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 66 69   sure the new fi
14a90 6c 65 20 73 69 7a 65 20 69 73 20 77 72 69 74 74  le size is writt
14aa0 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 6f 64  en into the inod
14ab0 65 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  e right away..  
14ac0 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72          ** Other
14ad0 77 69 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  wise the journal
14ae0 20 6d 69 67 68 74 20 72 65 73 75 72 72 65 63 74   might resurrect
14af0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
14b00 65 72 20 6c 6f 73 73 20 61 6e 64 0a 20 20 20 20  er loss and.    
14b10 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74        ** cause t
14b20 68 65 20 6c 61 73 74 20 74 72 61 6e 73 61 63 74  he last transact
14b30 69 6f 6e 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  ion to roll back
14b40 2e 20 20 53 65 65 0a 20 20 20 20 20 20 20 20 20  .  See.         
14b50 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a   ** https://bugz
14b60 69 6c 6c 61 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72 67  illa.mozilla.org
14b70 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64  /show_bug.cgi?id
14b80 3d 31 30 37 32 37 37 33 0a 20 20 20 20 20 20 20  =1072773.       
14b90 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
14ba0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
14bb0 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
14bc0 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
14bd0 73 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  s);.        }.  
14be0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
14bf0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
14c00 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
14c10 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
14c20 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
14c30 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
14c40 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65  .      || (pPage
14c50 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
14c60 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
14c70 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
14c80 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a  OURNALMODE_WAL).
14c90 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
14ca0 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  = zeroJournalHdr
14cb0 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74  (pPager, hasMast
14cc0 65 72 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70  er||pPager->temp
14cd0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 70 50 61  File);.      pPa
14ce0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
14cf0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
14d00 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
14d10 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65 63  anch may be exec
14d20 75 74 65 64 20 77 69 74 68 20 50 61 67 65 72 2e  uted with Pager.
14d30 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d  journalMode==MEM
14d40 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ORY if.      ** 
14d50 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61  a hot-journal wa
14d60 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62 61  s just rolled ba
14d70 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ck. In this case
14d80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
14d90 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c     ** file shoul
14da0 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20  d be closed and 
14db0 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69 73  deleted. If this
14dc0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74   connection writ
14dd0 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  es to.      ** t
14de0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14df0 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20  , it will do so 
14e00 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f  using an in-memo
14e10 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  ry journal..    
14e20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62    */.      int b
14e30 44 65 6c 65 74 65 20 3d 20 21 70 50 61 67 65 72  Delete = !pPager
14e40 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20  ->tempFile;.    
14e50 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
14e60 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f  3JournalIsInMemo
14e70 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3d  ry(pPager->jfd)=
14e80 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
14e90 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
14ea0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
14eb0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
14ec0 45 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  E .           ||
14ed0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14ee0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
14ef0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
14f00 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
14f10 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
14f20 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
14f30 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
14f40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14f50 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
14f60 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  jfd);.      if( 
14f70 62 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  bDelete ){.     
14f80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
14f90 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
14fa0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
14fb0 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
14fc0 65 78 74 72 61 53 79 6e 63 29 3b 0a 20 20 20 20  extraSync);.    
14fd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23    }.    }.  }..#
14fe0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
14ff0 43 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c 69 74  CK_PAGES.  sqlit
15000 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44  e3PcacheIterateD
15010 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43  irty(pPager->pPC
15020 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f  ache, pager_set_
15030 70 61 67 65 68 61 73 68 29 3b 0a 20 20 69 66 28  pagehash);.  if(
15040 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
15050 3d 30 20 26 26 20 73 71 6c 69 74 65 33 50 63 61  =0 && sqlite3Pca
15060 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
15070 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29  er->pPCache)>0 )
15080 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d  {.    PgHdr *p =
15090 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
150a0 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  kup(pPager, 1);.
150b0 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20      if( p ){.   
150c0 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68 20 3d     p->pageHash =
150d0 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   0;.      sqlite
150e0 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75  3PagerUnrefNotNu
150f0 6c 6c 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ll(p);.    }.  }
15100 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
15110 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
15120 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
15130 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
15140 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
15150 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
15160 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  0;.  if( rc==SQL
15170 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
15180 28 20 4d 45 4d 44 42 20 7c 7c 20 70 61 67 65 72  ( MEMDB || pager
15190 46 6c 75 73 68 4f 6e 43 6f 6d 6d 69 74 28 70 50  FlushOnCommit(pP
151a0 61 67 65 72 2c 20 62 43 6f 6d 6d 69 74 29 20 29  ager, bCommit) )
151b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
151c0 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50  cacheCleanAll(pP
151d0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
151e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
151f0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
15200 65 61 72 57 72 69 74 61 62 6c 65 28 70 50 61 67  earWritable(pPag
15210 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
15220 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
15230 63 61 63 68 65 54 72 75 6e 63 61 74 65 28 70 50  cacheTruncate(pP
15240 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
15250 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
15260 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72    }..  if( pager
15270 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
15280 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68  {.    /* Drop th
15290 65 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b  e WAL write-lock
152a0 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20  , if any. Also, 
152b0 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
152c0 6e 20 77 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a  n was in .    **
152d0 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
152e0 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 62 75 74  clusive mode but
152f0 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64   is no longer, d
15300 72 6f 70 20 74 68 65 20 45 58 43 4c 55 53 49 56  rop the EXCLUSIV
15310 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68  E .    ** lock h
15320 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
15330 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
15340 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
15350 65 33 57 61 6c 45 6e 64 57 72 69 74 65 54 72 61  e3WalEndWriteTra
15360 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
15370 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61 73 73 65  >pWal);.    asse
15380 72 74 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  rt( rc2==SQLITE_
15390 4f 4b 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  OK );.  }else if
153a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
153b0 26 26 20 62 43 6f 6d 6d 69 74 20 26 26 20 70 50  && bCommit && pP
153c0 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
153d0 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  >pPager->dbSize 
153e0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62  ){.    /* This b
153f0 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77  ranch is taken w
15400 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  hen committing a
15410 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
15420 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c  rollback-journal
15430 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 69 66 20  .    ** mode if 
15440 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15450 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6c 61 72  e on disk is lar
15460 67 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74  ger than the dat
15470 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20  abase image..   
15480 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   ** At this poin
15490 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  t the journal ha
154a0 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64  s been finalized
154b0 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63   and the transac
154c0 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 73 75 63  tion .    ** suc
154d0 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 6d 69 74  cessfully commit
154e0 74 65 64 2c 20 62 75 74 20 74 68 65 20 45 58 43  ted, but the EXC
154f0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 73  LUSIVE lock is s
15500 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65  till held on the
15510 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f  .    ** file. So
15520 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 74   it is safe to t
15530 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61  runcate the data
15540 62 61 73 65 20 66 69 6c 65 20 74 6f 20 69 74 73  base file to its
15550 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20   minimum.    ** 
15560 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 20 20  required size.  
15570 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
15580 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
15590 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
155a0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
155b0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
155c0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
155d0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
155e0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f  SQLITE_OK && bCo
155f0 6d 6d 69 74 20 29 7b 0a 20 20 20 20 72 63 20 3d  mmit ){.    rc =
15600 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
15610 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64  ntrol(pPager->fd
15620 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  , SQLITE_FCNTL_C
15630 4f 4d 4d 49 54 5f 50 48 41 53 45 54 57 4f 2c 20  OMMIT_PHASETWO, 
15640 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
15650 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
15660 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
15670 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  ;.  }..  if( !pP
15680 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
15690 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70 61 67  ode .   && (!pag
156a0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
156b0 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c 45 78   || sqlite3WalEx
156c0 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67  clusiveMode(pPag
156d0 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a 20 20  er->pWal, 0)).  
156e0 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67  ){.    rc2 = pag
156f0 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
15700 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
15710 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
15720 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30  ngeCountDone = 0
15730 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
15740 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  eState = PAGER_R
15750 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65 72 2d  EADER;.  pPager-
15760 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
15770 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
15780 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29  QLITE_OK?rc2:rc)
15790 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  ;.}../*.** Execu
157a0 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66  te a rollback if
157b0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
157c0 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c  s active and unl
157d0 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ock the .** data
157e0 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  base file. .**.*
157f0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68  * If the pager h
15800 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72  as already enter
15810 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
15820 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d  te, do not attem
15830 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  pt .** the rollb
15840 61 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d 65  ack at this time
15850 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65 72  . Instead, pager
15860 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c  _unlock() is cal
15870 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  led. The.** call
15880 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   to pager_unlock
15890 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64 20  () will discard 
158a0 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  all in-memory pa
158b0 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74  ges, unlock.** t
158c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
158d0 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 70 61   and move the pa
158e0 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e  ger back to OPEN
158f0 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73 20   state. If this 
15900 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74  .** means that t
15910 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f  here is a hot-jo
15920 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74 68  urnal left in th
15930 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74  e file-system, t
15940 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f 6e 6e  he next .** conn
15950 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e  ection to obtain
15960 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   a shared lock o
15970 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68 69  n the pager (whi
15980 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20 6f  ch may be this o
15990 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72 6f 6c  ne) .** will rol
159a0 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  l it back..**.**
159b0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61   If the pager ha
159c0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 6e  s not already en
159d0 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
159e0 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49 4f  state, but an IO
159f0 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72   or.** malloc er
15a00 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
15a10 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  g a rollback, th
15a20 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74 73  en this will its
15a30 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74 68  elf cause .** th
15a40 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
15a50 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
15a60 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65 20  . Which will be 
15a70 63 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a 2a  cleared by the.*
15a80 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f  * call to pager_
15a90 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65 73  unlock(), as des
15aa0 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f  cribed above..*/
15ab0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
15ac0 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
15ad0 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
15ae0 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
15af0 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
15b00 45 52 52 4f 52 20 26 26 20 70 50 61 67 65 72 2d  ERROR && pPager-
15b10 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
15b20 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  PEN ){.    asser
15b30 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
15b40 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
15b50 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
15b60 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
15b70 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a  RITER_LOCKED ){.
15b80 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
15b90 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
15ba0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
15bb0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61  agerRollback(pPa
15bc0 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ger);.      sqli
15bd0 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
15be0 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  oc();.    }else 
15bf0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
15c00 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
15c10 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
15c20 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
15c30 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20  R_READER );.    
15c40 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e    pager_end_tran
15c50 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
15c60 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
15c70 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  .  pager_unlock(
15c80 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
15c90 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61 74  * Parameter aDat
15ca0 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  a must point to 
15cb0 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61 67  a buffer of pPag
15cc0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
15cd0 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43  es.** of data. C
15ce0 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
15cf0 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73  n a checksum bas
15d00 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65  ed ont the conte
15d10 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70  nts of the .** p
15d20 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20  age of data and 
15d30 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
15d40 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73  e of pPager->cks
15d50 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  umInit..**.** Th
15d60 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c  is is not a real
15d70 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73   checksum. It is
15d80 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65   really just the
15d90 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20   sum of the .** 
15da0 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76  random initial v
15db0 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b  alue (pPager->ck
15dc0 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65  sumInit) and eve
15dd0 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a  ry 200th byte.**
15de0 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
15df0 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  a, starting with
15e00 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70 50   byte offset (pP
15e10 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32  ager->pageSize%2
15e20 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74  00)..** Each byt
15e30 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  e is interpreted
15e40 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73   as an 8-bit uns
15e50 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a  igned integer..*
15e60 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68  *.** Changing th
15e70 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74  e formula used t
15e80 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63  o compute this c
15e90 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20  hecksum results 
15ea0 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61  in an.** incompa
15eb0 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69  tible journal fi
15ec0 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  le format..**.**
15ed0 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72   If journal corr
15ee0 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75  uption occurs du
15ef0 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69  e to a power fai
15f00 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c  lure, the most l
15f10 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72  ikely .** scenar
15f20 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65  io is that one e
15f30 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  nd or the other 
15f40 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69  of the record wi
15f50 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a  ll be changed. .
15f60 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65  ** It is much le
15f70 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74  ss likely that t
15f80 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74  he two ends of t
15f90 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
15fa0 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72  d will be.** cor
15fb0 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64  rect and the mid
15fc0 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20  dle be corrupt. 
15fd0 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65   Thus, this "che
15fe0 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a  cksum" scheme,.*
15ff0 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e  * though fast an
16000 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65  d simple, catche
16010 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b  s the mostly lik
16020 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72  ely kind of corr
16030 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
16040 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75  c u32 pager_cksu
16050 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  m(Pager *pPager,
16060 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61   const u8 *aData
16070 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ){.  u32 cksum =
16080 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
16090 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  it;         /* C
160a0 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f  hecksum value to
160b0 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
160c0 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67   i = pPager->pag
160d0 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20  eSize-200;      
160e0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
160f0 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ter */.  while( 
16100 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d  i>0 ){.    cksum
16110 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20   += aData[i];.  
16120 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a    i -= 200;.  }.
16130 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
16140 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20  }../*.** Report 
16150 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
16160 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72   size and number
16170 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74   of reserved byt
16180 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68  es back.** to th
16190 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64  e codec..*/.#ifd
161a0 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
161b0 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEC.static void 
161c0 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
161d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
161e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43    if( pPager->xC
161f0 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a  odecSizeChng ){.
16200 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64      pPager->xCod
16210 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67 65  ecSizeChng(pPage
16220 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67 65  r->pCodec, pPage
16230 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  r->pageSize,.   
16240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16250 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 50 61          (int)pPa
16260 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a  ger->nReserve);.
16270 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
16280 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72 74  fine pagerReport
16290 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20 4e  Size(X)     /* N
162a0 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e 6f  o-op if we do no
162b0 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64 65  t support a code
162c0 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23 69 66  c */.#endif..#if
162d0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
162e0 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ODEC./*.** Make 
162f0 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20  sure the number 
16300 6f 66 20 72 65 73 65 72 76 65 64 20 62 69 74 73  of reserved bits
16310 20 69 73 20 74 68 65 20 73 61 6d 65 20 69 6e 20   is the same in 
16320 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  the destination.
16330 2a 2a 20 70 61 67 65 72 20 61 73 20 69 74 20 69  ** pager as it i
16340 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 2e  s in the source.
16350 20 20 54 68 69 73 20 63 6f 6d 65 73 20 75 70 20    This comes up 
16360 77 68 65 6e 20 61 20 56 41 43 55 55 4d 20 63 68  when a VACUUM ch
16370 61 6e 67 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6d  anges the.** num
16380 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
16390 62 69 74 73 20 74 6f 20 74 68 65 20 22 6f 70 74  bits to the "opt
163a0 69 6d 61 6c 22 20 61 6d 6f 75 6e 74 2e 0a 2a 2f  imal" amount..*/
163b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
163c0 65 72 41 6c 69 67 6e 52 65 73 65 72 76 65 28 50  erAlignReserve(P
163d0 61 67 65 72 20 2a 70 44 65 73 74 2c 20 50 61 67  ager *pDest, Pag
163e0 65 72 20 2a 70 53 72 63 29 7b 0a 20 20 69 66 28  er *pSrc){.  if(
163f0 20 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76 65   pDest->nReserve
16400 21 3d 70 53 72 63 2d 3e 6e 52 65 73 65 72 76 65  !=pSrc->nReserve
16410 20 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 6e   ){.    pDest->n
16420 52 65 73 65 72 76 65 20 3d 20 70 53 72 63 2d 3e  Reserve = pSrc->
16430 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61  nReserve;.    pa
16440 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 44  gerReportSize(pD
16450 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  est);.  }.}.#end
16460 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  if../*.** Read a
16470 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f   single page fro
16480 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75  m either the jou
16490 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73  rnal file (if is
164a0 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a  MainJrnl==1) or.
164b0 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ** from the sub-
164c0 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61  journal (if isMa
164d0 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70  inJrnl==0) and p
164e0 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70 61 67  layback that pag
164f0 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62  e..** The page b
16500 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20  egins at offset 
16510 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68  *pOffset into th
16520 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66  e file. The *pOf
16530 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73  fset.** value is
16540 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68   increased to th
16550 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
16560 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
16570 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
16580 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
16590 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20 63 68   journal uses ch
165a0 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74  ecksums - the st
165b0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
165c0 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a  does .** not..**
165d0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
165e0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  number of the pa
165f0 67 65 20 72 65 63 6f 72 64 20 72 65 61 64 20 66  ge record read f
16600 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
16610 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
16620 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
16630 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
16640 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  of Pager.dbSize,
16650 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20 69   then playback i
16660 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e 64  s.** skipped and
16670 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
16680 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
16690 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55   pDone is not NU
166a0 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61  LL, then it is a
166b0 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65 73   record of pages
166c0 20 74 68 61 74 20 68 61 76 65 20 61 6c 72 65 61   that have alrea
166d0 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65  dy.** been playe
166e0 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65 20  d back.  If the 
166f0 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65 74  page at *pOffset
16700 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
16710 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a  n played back.**
16720 20 28 69 66 20 74 68 65 20 63 6f 72 72 65 73 70   (if the corresp
16730 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69 74  onding pDone bit
16740 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 73 6b   is set) then sk
16750 69 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b 2e  ip the playback.
16760 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
16770 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72 72  e pDone bit corr
16780 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
16790 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20 69   *pOffset page i
167a0 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74  s set.** prior t
167b0 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  o returning..**.
167c0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 72  ** If the page r
167d0 65 63 6f 72 64 20 69 73 20 73 75 63 63 65 73 73  ecord is success
167e0 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  fully read from 
167f0 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
16800 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c  l file.** and pl
16810 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e 20  ayed back, then 
16820 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
16830 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
16840 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20  error occurs.** 
16850 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74 68  while reading th
16860 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68  e record from th
16870 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
16880 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77 72  file or while wr
16890 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20  iting.** to the 
168a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
168b0 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
168c0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
168d0 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69 73  d. If data.** is
168e0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65   successfully re
168f0 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
16900 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62  -)journal file b
16910 75 74 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ut appears to be
16920 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20 53  .** corrupted, S
16930 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65  QLITE_DONE is re
16940 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73 20  turned. Data is 
16950 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72 75  considered corru
16960 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63  pted in.** two c
16970 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a  ircumstances:.**
16980 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20   .**   * If the 
16990 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62  record page-numb
169a0 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28 30  er is illegal (0
169b0 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e   or PAGER_MJ_PGN
169c0 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66  O), or.**   * If
169d0 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 62   the record is b
169e0 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
169f0 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
16a00 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20  ournal file.**  
16a10 20 20 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b     and the check
16a20 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20 6e  sum field does n
16a30 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72 65 63  ot match the rec
16a40 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a  ord content..**.
16a50 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74 68  ** Neither of th
16a60 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f  ese two scenario
16a70 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20 64  s are possible d
16a80 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69 6e  uring a savepoin
16a90 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  t rollback..**.*
16aa0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
16ab0 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
16ac0 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d  k, then memory m
16ad0 61 79 20 68 61 76 65 20 74 6f 20 62 65 20 64 79  ay have to be dy
16ae0 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c  namically.** all
16af0 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66  ocated by this f
16b00 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73  unction. If this
16b10 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64   is the case and
16b20 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66   an allocation f
16b30 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ails,.** SQLITE_
16b40 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
16b50 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
16b60 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
16b70 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65  one_page(.  Page
16b80 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
16b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16ba0 20 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61   pager being pla
16bb0 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 36  yed back */.  i6
16bc0 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20 20 20  4 *pOffset,     
16bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
16be0 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72 64 20  ffset of record 
16bf0 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20  to playback */. 
16c00 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 2c 20   Bitvec *pDone, 
16c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16c20 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61 67 65  * Bitvec of page
16c30 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65 64  s already played
16c40 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69   back */.  int i
16c50 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20  sMainJrnl,      
16c60 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e           /* 1 ->
16c70 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30   main journal. 0
16c80 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e   -> sub-journal.
16c90 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65   */.  int isSave
16ca0 70 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20  pnt             
16cb0 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
16cc0 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
16cd0 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  back */.){.  int
16ce0 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
16cf0 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
16d00 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
16d10 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20  ing page in the 
16d20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  cache */.  Pgno 
16d30 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
16d40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16d50 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
16d60 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c   page in journal
16d70 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
16d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d90 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
16da0 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20  used for sanity 
16db0 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 63 68  checking */.  ch
16dc0 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20  ar *aData;      
16dd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16de0 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
16df0 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f   for the page */
16e00 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
16e10 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  *jfd;           
16e20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
16e30 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
16e40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
16e50 20 20 69 6e 74 20 69 73 53 79 6e 63 65 64 3b 20    int isSynced; 
16e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e70 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
16e80 61 6c 20 70 61 67 65 20 69 73 20 73 79 6e 63 65  al page is synce
16e90 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  d */.#ifdef SQLI
16ea0 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 2f  TE_HAS_CODEC.  /
16eb0 2a 20 54 68 65 20 6a 72 6e 6c 45 6e 63 20 66 6c  * The jrnlEnc fl
16ec0 61 67 20 69 73 20 74 72 75 65 20 69 66 20 4a 6f  ag is true if Jo
16ed0 75 72 6e 61 6c 20 70 61 67 65 73 20 73 68 6f 75  urnal pages shou
16ee0 6c 64 20 62 65 20 70 61 73 73 65 64 20 74 68 72  ld be passed thr
16ef0 6f 75 67 68 0a 20 20 2a 2a 20 74 68 65 20 63 6f  ough.  ** the co
16f00 64 65 63 2e 20 20 49 74 20 69 73 20 66 61 6c 73  dec.  It is fals
16f10 65 20 66 6f 72 20 70 75 72 65 20 69 6e 2d 6d 65  e for pure in-me
16f20 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a  mory journals. *
16f30 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6a 72  /.  const int jr
16f40 6e 6c 45 6e 63 20 3d 20 28 69 73 4d 61 69 6e 4a  nlEnc = (isMainJ
16f50 72 6e 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  rnl || pPager->s
16f60 75 62 6a 49 6e 4d 65 6d 6f 72 79 3d 3d 30 29 3b  ubjInMemory==0);
16f70 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
16f80 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e  t( (isMainJrnl&~
16f90 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  1)==0 );      /*
16fa0 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30   isMainJrnl is 0
16fb0 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
16fc0 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31  t( (isSavepnt&~1
16fd0 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  )==0 );       /*
16fe0 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30 20   isSavepnt is 0 
16ff0 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  or 1 */.  assert
17000 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20  ( isMainJrnl || 
17010 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20  pDone );     /* 
17020 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65  pDone always use
17030 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  d on sub-journal
17040 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  s */.  assert( i
17050 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e  sSavepnt || pDon
17060 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f  e==0 );   /* pDo
17070 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e  ne never used on
17080 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a   non-savepoint *
17090 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61  /..  aData = pPa
170a0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
170b0 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20    assert( aData 
170c0 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  );         /* Te
170d0 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20  mp storage must 
170e0 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
170f0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  n allocated */. 
17100 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
17110 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
17120 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20  || (!isMainJrnl 
17130 26 26 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b  && isSavepnt) );
17140 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68  ..  /* Either th
17150 65 20 73 74 61 74 65 20 69 73 20 67 72 65 61 74  e state is great
17160 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f 57 52  er than PAGER_WR
17170 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 28 61  ITER_CACHEMOD (a
17180 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
17190 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20  ** or savepoint 
171a0 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20 61 74  rollback done at
171b0 20 74 68 65 20 72 65 71 75 65 73 74 20 6f 66 20   the request of 
171c0 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72 20 74  the caller) or t
171d0 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20 68 6f  his is.  ** a ho
171e0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
171f0 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61 20 68  ck. If it is a h
17200 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
17210 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72 0a 20  ack, the pager. 
17220 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74 65 20   ** is in state 
17230 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73 20 61  OPEN and holds a
17240 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
17250 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  . Hot-journal ro
17260 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e 6c 79  llback.  ** only
17270 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20   reads from the 
17280 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6e 6f  main journal, no
17290 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  t the sub-journa
172a0 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  l..  */.  assert
172b0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
172c0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
172d0 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
172e0 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  | (pPager->eStat
172f0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26  e==PAGER_OPEN &&
17300 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
17310 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
17320 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70    );.  assert( p
17330 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
17340 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
17350 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e 4a 72  EMOD || isMainJr
17360 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  nl );..  /* Read
17370 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
17380 20 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66   and page data f
17390 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
173a0 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20  or sub-journal. 
173b0 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e   ** file. Return
173c0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74   an error code t
173d0 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20  o the caller if 
173e0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
173f0 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d  rs..  */.  jfd =
17400 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50   isMainJrnl ? pP
17410 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67  ager->jfd : pPag
17420 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d  er->sjfd;.  rc =
17430 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
17440 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f   *pOffset, &pgno
17450 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
17460 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
17470 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
17480 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 28 75  e3OsRead(jfd, (u
17490 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65 72  8*)aData, pPager
174a0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f  ->pageSize, (*pO
174b0 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69 66 28  ffset)+4);.  if(
174c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
174d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
174e0 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67 65 72  Offset += pPager
174f0 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 20 2b  ->pageSize + 4 +
17500 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a   isMainJrnl*4;..
17510 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
17520 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
17530 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20  .  This is more 
17540 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49  important that I
17550 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
17560 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20   thought.  If a 
17570 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
17580 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a  curs while the j
17590 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20  ournal is being 
175a0 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74  written,.  ** it
175b0 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76   could cause inv
175c0 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20  alid data to be 
175d0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
175e0 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65   journal.  We ne
175f0 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63  ed to.  ** detec
17600 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64  t this invalid d
17610 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70  ata (with high p
17620 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20  robability) and 
17630 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a  ignore it..  */.
17640 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c    if( pgno==0 ||
17650 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
17660 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
17670 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 53      assert( !isS
17680 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 72 65  avepnt );.    re
17690 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
176a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
176b0 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64  >(Pgno)pPager->d
176c0 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33  bSize || sqlite3
176d0 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65  BitvecTest(pDone
176e0 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72  , pgno) ){.    r
176f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17700 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69  .  }.  if( isMai
17710 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20  nJrnl ){.    rc 
17720 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
17730 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20  , (*pOffset)-4, 
17740 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
17750 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
17760 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65  .    if( !isSave
17770 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73  pnt && pager_cks
17780 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
17790 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
177a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
177b0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
177c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
177d0 69 73 20 70 61 67 65 20 68 61 73 20 61 6c 72 65  is page has alre
177e0 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20  ady been played 
177f0 62 61 63 6b 20 62 65 66 6f 72 65 20 64 75 72 69  back before duri
17800 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  ng the current. 
17810 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68   ** rollback, th
17820 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20  en don't bother 
17830 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63 6b 20  to play it back 
17840 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  again..  */.  if
17850 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d  ( pDone && (rc =
17860 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
17870 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21  t(pDone, pgno))!
17880 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17890 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
178a0 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79  ..  /* When play
178b0 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20 31 2c  ing back page 1,
178c0 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e 52 65   restore the nRe
178d0 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a 20 20  serve setting.  
178e0 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  */.  if( pgno==1
178f0 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 73   && pPager->nRes
17900 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44 61 74  erve!=((u8*)aDat
17910 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20 70 50  a)[20] ){.    pP
17920 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d  ager->nReserve =
17930 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30   ((u8*)aData)[20
17940 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f  ];.    pagerRepo
17950 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  rtSize(pPager);.
17960 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
17970 20 70 61 67 65 72 20 69 73 20 69 6e 20 43 41 43   pager is in CAC
17980 48 45 4d 4f 44 20 73 74 61 74 65 2c 20 74 68 65  HEMOD state, the
17990 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
179a0 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20  a copy of this. 
179b0 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
179c0 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20  pager cache. In 
179d0 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75  this case just u
179e0 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
179f0 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20  cache,.  ** not 
17a00 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17a10 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c  e. The page is l
17a20 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79  eft marked dirty
17a30 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
17a40 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65   **.  ** An exce
17a50 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f  ption to the abo
17a60 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20  ve rule: If the 
17a70 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e  database is in n
17a80 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a  o-sync mode.  **
17a90 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d   and a page is m
17aa0 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69  oved during an i
17ab0 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
17ac0 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  m then the page 
17ad0 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20  may.  ** not be 
17ae0 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
17af0 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20  he. Later: if a 
17b00 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65  malloc() or IO e
17b10 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a  rror occurs.  **
17b20 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61   during a Movepa
17b30 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20  ge() call, then 
17b40 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74  the page may not
17b50 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65   be in the cache
17b60 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f  .  ** either. So
17b70 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64   the condition d
17b80 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20  escribed in the 
17b90 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20  above paragraph 
17ba0 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65  is not.  ** asse
17bb0 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20  rt()able..  **. 
17bc0 20 2a 2a 20 49 66 20 69 6e 20 57 52 49 54 45 52   ** If in WRITER
17bd0 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45 52 5f 46  _DBMOD, WRITER_F
17be0 49 4e 49 53 48 45 44 20 6f 72 20 4f 50 45 4e 20  INISHED or OPEN 
17bf0 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75  state, then we u
17c00 70 64 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 70  pdate the.  ** p
17c10 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74  ager cache if it
17c20 20 65 78 69 73 74 73 20 61 6e 64 20 74 68 65 20   exists and the 
17c30 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70  main file. The p
17c40 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b  age is then mark
17c50 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64 69 72  ed .  ** not dir
17c60 74 79 2e 20 53 69 6e 63 65 20 74 68 69 73 20 63  ty. Since this c
17c70 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 78 65 63  ode is only exec
17c80 75 74 65 64 20 69 6e 20 50 41 47 45 52 5f 4f 50  uted in PAGER_OP
17c90 45 4e 20 73 74 61 74 65 20 66 6f 72 0a 20 20 2a  EN state for.  *
17ca0 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  * a hot-journal 
17cb0 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69 73 20  rollback, it is 
17cc0 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
17cd0 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 69  the page-cache i
17ce0 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69 66 20  s empty.  ** if 
17cf0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
17d00 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20 2a 2a  OPEN state..  **
17d10 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31  .  ** Ticket #11
17d20 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65  71:  The stateme
17d30 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  nt journal might
17d40 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f   contain page co
17d50 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20  ntent that is.  
17d60 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  ** different fro
17d70 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  m the page conte
17d80 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nt at the start 
17d90 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
17da0 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63  on..  ** This oc
17db0 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65  curs when a page
17dc0 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f   is changed prio
17dd0 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
17de0 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  f a statement.  
17df0 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20  ** then changed 
17e00 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65  again within the
17e10 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65   statement.  Whe
17e20 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73  n rolling back s
17e30 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65  uch a.  ** state
17e40 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74  ment we must not
17e50 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72   write to the or
17e60 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
17e70 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20  unless we know. 
17e80 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20   ** for certain 
17e90 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61  that original pa
17ea0 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
17eb0 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20  synced into the 
17ec0 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  main rollback.  
17ed0 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68  ** journal.  Oth
17ee0 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20  erwise, a power 
17ef0 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65  loss might leave
17f00 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69   modified data i
17f10 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
17f20 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74  ase file without
17f30 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
17f40 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
17f50 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20  l that can.  ** 
17f60 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
17f70 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67  base to its orig
17f80 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20  inal form.  Two 
17f90 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20  conditions must 
17fa0 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f  be.  ** met befo
17fb0 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  re writing to th
17fc0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  e database files
17fd0 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61  . (1) the databa
17fe0 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  se must be.  ** 
17ff0 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20  locked.  (2) we 
18000 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72  know that the or
18010 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
18020 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e  ent is fully syn
18030 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ced.  ** in the 
18040 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74  main journal eit
18050 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20  her because the 
18060 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
18070 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a  ache or else.  *
18080 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61  * the page is ma
18090 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63  rked as needSync
180a0 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32  ==0..  **.  ** 2
180b0 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e  008-04-14:  When
180c0 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76   attempting to v
180d0 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20  acuum a corrupt 
180e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
180f0 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
18100 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61  le to fail a sta
18110 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61  tement on a data
18120 62 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e  base that does n
18130 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20  ot yet exist..  
18140 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70  ** Do not attemp
18150 74 20 74 6f 20 77 72 69 74 65 20 69 66 20 64 61  t to write if da
18160 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
18170 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65  never been opene
18180 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 61  d..  */.  if( pa
18190 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
181a0 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30  ) ){.    pPg = 0
181b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
181c0 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  Pg = sqlite3Page
181d0 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  rLookup(pPager, 
181e0 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73  pgno);.  }.  ass
181f0 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d  ert( pPg || !MEM
18200 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
18210 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
18220 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50  PAGER_OPEN || pP
18230 67 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  g==0 || pPager->
18240 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 50 41  tempFile );.  PA
18250 47 45 52 54 52 41 43 45 28 28 22 50 4c 41 59 42  GERTRACE(("PLAYB
18260 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68  ACK %d page %d h
18270 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c  ash(%08x) %s\n",
18280 0a 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45  .           PAGE
18290 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
182a0 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  o, pager_datahas
182b0 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  h(pPager->pageSi
182c0 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c  ze, (u8*)aData),
182d0 0a 20 20 20 20 20 20 20 20 20 20 20 28 69 73 4d  .           (isM
182e0 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f  ainJrnl?"main-jo
182f0 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72  urnal":"sub-jour
18300 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66  nal").  ));.  if
18310 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a  ( isMainJrnl ){.
18320 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 70      isSynced = p
18330 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c  Pager->noSync ||
18340 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70 50   (*pOffset <= pP
18350 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
18360 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
18370 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50 67 3d  isSynced = (pPg=
18380 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66  =0 || 0==(pPg->f
18390 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45  lags & PGHDR_NEE
183a0 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20  D_SYNC));.  }.  
183b0 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
183c0 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 28 70 50  r->fd).   && (pP
183d0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
183e0 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
183f0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
18400 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a  te==PAGER_OPEN).
18410 20 20 20 26 26 20 69 73 53 79 6e 63 65 64 0a 20     && isSynced. 
18420 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74   ){.    i64 ofst
18430 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
18440 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
18450 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  e;.    testcase(
18460 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70   !isSavepnt && p
18470 50 67 21 3d 30 20 26 26 20 28 70 50 67 2d 3e 66  Pg!=0 && (pPg->f
18480 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
18490 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20 20  SYNC)!=0 );.    
184a0 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73  assert( !pagerUs
184b0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
184c0 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
184d0 65 20 64 61 74 61 20 72 65 61 64 20 66 72 6f 6d  e data read from
184e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63   the journal bac
184f0 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
18500 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  ase file..    **
18510 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79   This is usually
18520 20 73 61 66 65 20 65 76 65 6e 20 66 6f 72 20 61   safe even for a
18530 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61  n encrypted data
18540 62 61 73 65 20 2d 20 61 73 20 74 68 65 20 64 61  base - as the da
18550 74 61 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 6e  ta.    ** was en
18560 63 72 79 70 74 65 64 20 62 65 66 6f 72 65 20 69  crypted before i
18570 74 20 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f  t was written to
18580 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
18590 65 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e  e. The exception
185a0 0a 20 20 20 20 2a 2a 20 69 73 20 69 66 20 74 68  .    ** is if th
185b0 65 20 64 61 74 61 20 77 61 73 20 6a 75 73 74 20  e data was just 
185c0 72 65 61 64 20 66 72 6f 6d 20 61 6e 20 69 6e 2d  read from an in-
185d0 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72 6e  memory sub-journ
185e0 61 6c 2e 20 49 6e 20 74 68 61 74 0a 20 20 20 20  al. In that.    
185f0 2a 2a 20 63 61 73 65 20 69 74 20 6d 75 73 74 20  ** case it must 
18600 62 65 20 65 6e 63 72 79 70 74 65 64 20 68 65 72  be encrypted her
18610 65 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 63  e before it is c
18620 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 64  opied into the d
18630 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
18640 69 6c 65 2e 20 20 2a 2f 0a 23 69 66 64 65 66 20  ile.  */.#ifdef 
18650 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
18660 0a 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 45 6e  .    if( !jrnlEn
18670 63 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43  c ){.      CODEC
18680 32 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c  2(pPager, aData,
18690 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c   pgno, 7, rc=SQL
186a0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20  ITE_NOMEM_BKPT, 
186b0 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 72 63  aData);.      rc
186c0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
186d0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75  e(pPager->fd, (u
186e0 38 20 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  8 *)aData, pPage
186f0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73  r->pageSize, ofs
18700 74 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 31  t);.      CODEC1
18710 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20  (pPager, aData, 
18720 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49  pgno, 3, rc=SQLI
18730 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a  TE_NOMEM_BKPT);.
18740 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
18750 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
18760 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
18770 3e 66 64 2c 20 28 75 38 20 2a 29 61 44 61 74 61  >fd, (u8 *)aData
18780 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
18790 7a 65 2c 20 6f 66 73 74 29 3b 0a 0a 20 20 20 20  ze, ofst);..    
187a0 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
187b0 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20  >dbFileSize ){. 
187c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
187d0 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a  ileSize = pgno;.
187e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
187f0 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29 7b  ager->pBackup ){
18800 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
18810 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 69  AS_CODEC.      i
18820 66 28 20 6a 72 6e 6c 45 6e 63 20 29 7b 0a 20 20  f( jrnlEnc ){.  
18830 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50 61        CODEC1(pPa
18840 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
18850 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 3, rc=SQLITE_N
18860 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20  OMEM_BKPT);.    
18870 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
18880 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
18890 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28  pBackup, pgno, (
188a0 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20  u8*)aData);.    
188b0 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
188c0 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20  r, aData, pgno, 
188d0 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  7, rc=SQLITE_NOM
188e0 45 4d 5f 42 4b 50 54 2c 61 44 61 74 61 29 3b 0a  EM_BKPT,aData);.
188f0 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
18900 69 66 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  if.      sqlite3
18910 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
18920 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67  ger->pBackup, pg
18930 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b  no, (u8*)aData);
18940 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
18950 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26  f( !isMainJrnl &
18960 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  & pPg==0 ){.    
18970 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
18980 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73 61  rollback of a sa
18990 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74 61  vepoint and data
189a0 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65 6e   was not written
189b0 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   to.    ** the d
189c0 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20  atabase and the 
189d0 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d  page is not in-m
189e0 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73 20  emory, there is 
189f0 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20  a potential.    
18a00 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e  ** problem. When
18a10 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 65 78   the page is nex
18a20 74 20 66 65 74 63 68 65 64 20 62 79 20 74 68 65  t fetched by the
18a30 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20 69   b-tree layer, i
18a40 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  t .    ** will b
18a50 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
18a60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77  database file, w
18a70 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20  hich may or may 
18a80 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20 63  not be .    ** c
18a90 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a  urrent. .    **.
18aa0 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65      ** There are
18ab0 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66   a couple of dif
18ac0 66 65 72 65 6e 74 20 77 61 79 73 20 74 68 69 73  ferent ways this
18ad0 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c   can happen. All
18ae0 20 61 72 65 20 71 75 69 74 65 0a 20 20 20 20 2a   are quite.    *
18af0 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e 20  * obscure. When 
18b00 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68  running in synch
18b10 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69  ronous mode, thi
18b20 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
18b30 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65  n .    ** if the
18b40 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65 20   page is on the 
18b50 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68 65  free-list at the
18b60 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
18b70 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a  ansaction, then.
18b80 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64      ** populated
18b90 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73 69  , then moved usi
18ba0 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  ng sqlite3PagerM
18bb0 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20 2a  ovepage()..    *
18bc0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c  *.    ** The sol
18bd0 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64 20  ution is to add 
18be0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
18bf0 65 20 74 6f 20 74 68 65 20 63 61 63 68 65 20 63  e to the cache c
18c00 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a  ontaining.    **
18c10 20 74 68 65 20 64 61 74 61 20 6a 75 73 74 20 72   the data just r
18c20 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ead from the sub
18c30 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74  -journal. Mark t
18c40 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
18c50 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20   .    ** and if 
18c60 74 68 65 20 70 61 67 65 72 20 72 65 71 75 69 72  the pager requir
18c70 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  es a journal-syn
18c80 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68 65  c, then mark the
18c90 20 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a 2a   page as .    **
18ca0 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f 75   requiring a jou
18cb0 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65  rnal-sync before
18cc0 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e 0a   it is written..
18cd0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
18ce0 74 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b 0a  t( isSavepnt );.
18cf0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61      assert( (pPa
18d00 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
18d10 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  & SPILLFLAG_ROLL
18d20 42 41 43 4b 29 3d 3d 30 20 29 3b 0a 20 20 20 20  BACK)==0 );.    
18d30 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
18d40 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f  ll |= SPILLFLAG_
18d50 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 72 63  ROLLBACK;.    rc
18d60 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
18d70 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  et(pPager, pgno,
18d80 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20 61   &pPg, 1);.    a
18d90 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e  ssert( (pPager->
18da0 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49  doNotSpill & SPI
18db0 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29  LLFLAG_ROLLBACK)
18dc0 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  !=0 );.    pPage
18dd0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d  r->doNotSpill &=
18de0 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c   ~SPILLFLAG_ROLL
18df0 42 41 43 4b 3b 0a 20 20 20 20 69 66 28 20 72 63  BACK;.    if( rc
18e00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
18e10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 73 71 6c  turn rc;.    sql
18e20 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
18e30 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  rty(pPg);.  }.  
18e40 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f  if( pPg ){.    /
18e50 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64  * No page should
18e60 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69   ever be explici
18e70 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  tly rolled back 
18e80 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20  that is in use, 
18e90 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
18ea0 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69  r page 1 which i
18eb0 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e  s held in use in
18ec0 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
18ed0 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  he lock on the. 
18ee0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
18ef0 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73  ctive. However s
18f00 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62  uch a page may b
18f10 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  e rolled back as
18f20 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a   a result.    **
18f30 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   of an internal 
18f40 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20  error resulting 
18f50 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  in an automatic 
18f60 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
18f70 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
18f80 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ack()..    */.  
18f90 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20    void *pData;. 
18fa0 20 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e     pData = pPg->
18fb0 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70  pData;.    memcp
18fc0 79 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44  y(pData, (u8*)aD
18fd0 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
18fe0 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67  eSize);.    pPag
18ff0 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50  er->xReiniter(pP
19000 67 29 3b 0a 20 20 20 20 2f 2a 20 49 74 20 75 73  g);.    /* It us
19010 65 64 20 74 6f 20 62 65 20 74 68 61 74 20 73 71  ed to be that sq
19020 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
19030 6c 65 61 6e 28 70 50 67 29 20 77 61 73 20 63 61  lean(pPg) was ca
19040 6c 6c 65 64 20 68 65 72 65 2e 20 20 42 75 74 0a  lled here.  But.
19050 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61 6c 6c      ** that call
19060 20 77 61 73 20 64 61 6e 67 65 72 6f 75 73 20 61   was dangerous a
19070 6e 64 20 68 61 64 20 6e 6f 20 64 65 74 65 63 74  nd had no detect
19080 61 62 6c 65 20 62 65 6e 65 66 69 74 20 73 69 6e  able benefit sin
19090 63 65 20 74 68 65 20 63 61 63 68 65 0a 20 20 20  ce the cache.   
190a0 20 2a 2a 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20   ** is normally 
190b0 63 6c 65 61 6e 65 64 20 62 79 20 73 71 6c 69 74  cleaned by sqlit
190c0 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
190d0 28 29 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63  () after rollbac
190e0 6b 20 61 6e 64 20 73 6f 0a 20 20 20 20 2a 2a 20  k and so.    ** 
190f0 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64  has been removed
19100 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 73  . */.    pager_s
19110 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  et_pagehash(pPg)
19120 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
19130 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68  s was page 1, th
19140 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76  en restore the v
19150 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
19160 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a  FileVers..    **
19170 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20   Do this before 
19180 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f  any decoding. */
19190 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  .    if( pgno==1
191a0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
191b0 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
191c0 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61  Vers, &((u8*)pDa
191d0 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70  ta)[24],sizeof(p
191e0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
191f0 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s));.    }..    
19200 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61  /* Decode the pa
19210 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ge just read fro
19220 6d 20 64 69 73 6b 20 2a 2f 0a 23 69 66 20 53 51  m disk */.#if SQ
19230 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
19240 20 20 20 69 66 28 20 6a 72 6e 6c 45 6e 63 20 29     if( jrnlEnc )
19250 7b 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c  { CODEC1(pPager,
19260 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
19270 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f  o, 3, rc=SQLITE_
19280 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 20 7d 0a 23  NOMEM_BKPT); }.#
19290 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
192a0 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70  3PcacheRelease(p
192b0 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Pg);.  }.  retur
192c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
192d0 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72  arameter zMaster
192e0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
192f0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
19300 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20   file. A single 
19310 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
19320 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f  that referred to
19330 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
19340 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73  nal file has jus
19350 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  t been rolled ba
19360 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ck..** This rout
19370 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74  ine checks if it
19380 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
19390 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
193a0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a  r journal file,.
193b0 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69  ** and does so i
193c0 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41  f it is..**.** A
193d0 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20  rgument zMaster 
193e0 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67  may point to Pag
193f0 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f  er.pTmpSpace. So
19400 20 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20   that buffer is 
19410 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  not .** availabl
19420 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e  e for use within
19430 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
19440 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61 73  **.** When a mas
19450 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19460 20 69 73 20 63 72 65 61 74 65 64 2c 20 69 74 20   is created, it 
19470 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
19480 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a 20  h the names .** 
19490 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68  of all of its ch
194a0 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e  ild journals, on
194b0 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72 2c  e after another,
194c0 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75 74   formatted as ut
194d0 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64 20  f-8 .** encoded 
194e0 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f 66  text. The end of
194f0 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   each child jour
19500 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72 6b  nal file is mark
19510 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e 75  ed with a .** nu
19520 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  l-terminator byt
19530 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20 74  e (0x00). i.e. t
19540 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
19550 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ts of a master j
19560 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 66  ournal.** file f
19570 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
19580 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20 64   involving two d
19590 61 74 61 62 61 73 65 73 20 6d 69 67 68 74 20 62  atabases might b
195a0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d  e:.**.**   "/hom
195b0 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72  e/bill/a.db-jour
195c0 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69 6c  nal\x00/home/bil
195d0 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78  l/b.db-journal\x
195e0 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74  00".**.** A mast
195f0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
19600 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c 65  may only be dele
19610 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66 20  ted once all of 
19620 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f  its child .** jo
19630 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65 6e  urnals have been
19640 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
19650 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
19660 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e 74  n reads the cont
19670 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74  ents of the mast
19680 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er-journal file 
19690 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20  into .** memory 
196a0 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67  and loops throug
196b0 68 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 68  h each of the ch
196c0 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ild journal name
196d0 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 63  s. For.** each c
196e0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  hild journal, it
196f0 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a   checks if:.**.*
19700 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69  *   * if the chi
19710 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  ld journal exist
19720 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a 20  s, and if so.** 
19730 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64    * if the child
19740 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e   journal contain
19750 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
19760 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19770 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d 61  .**     file zMa
19780 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ster.**.** If a 
19790 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61  child journal ca
197a0 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74 20  n be found that 
197b0 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66 20  matches both of 
197c0 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a 20  the criteria.** 
197d0 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e 63  above, this func
197e0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 74  tion returns wit
197f0 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
19800 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ing. Otherwise, 
19810 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63 68  if.** no such ch
19820 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ild journal can 
19830 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20 7a  be found, file z
19840 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65 74 65  Master is delete
19850 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66 69  d from.** the fi
19860 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67 20  le-system using 
19870 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
19880 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  )..**.** If an I
19890 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20 74  O error within t
198a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 6e  his function, an
198b0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
198c0 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a  eturned. This.**
198d0 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61   function alloca
198e0 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63 61  tes memory by ca
198f0 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61 6c  lling sqlite3Mal
19900 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c 6c  loc(). If an all
19910 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73  ocation.** fails
19920 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  , SQLITE_NOMEM i
19930 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
19940 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f 20  rwise, if no IO 
19950 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  or malloc errors
19960 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c 49   .** occur, SQLI
19970 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
19980 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54  d..**.** TODO: T
19990 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  his function all
199a0 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65 20  ocates a single 
199b0 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20  block of memory 
199c0 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20 65  to load.** the e
199d0 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
199e0 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
199f0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
19a00 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63 6f  could be.** a co
19a10 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74 65  uple of kilobyte
19a20 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e 74  s or so - potent
19a30 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68 61  ially larger tha
19a40 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 73  n the page .** s
19a50 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
19a60 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74  nt pager_delmast
19a70 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
19a80 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
19a90 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  aster){.  sqlite
19aa0 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
19ab0 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
19ac0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
19ad0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
19ae0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
19af0 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65  te3_file *pMaste
19b00 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27  r;    /* Malloc'
19b10 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  d master-journal
19b20 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
19b30 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
19b40 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20 20  le *pJournal;   
19b50 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69 6c  /* Malloc'd chil
19b60 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  d-journal file d
19b70 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 63  escriptor */.  c
19b80 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72  har *zMasterJour
19b90 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74  nal = 0; /* Cont
19ba0 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ents of master j
19bb0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
19bc0 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72   i64 nMasterJour
19bd0 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  nal;       /* Si
19be0 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ze of master jou
19bf0 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63  rnal file */.  c
19c00 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20  har *zJournal;  
19c10 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
19c20 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75 72 6e  ter to one journ
19c30 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66 69 6c  al within MJ fil
19c40 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  e */.  char *zMa
19c50 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20  sterPtr;        
19c60 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c   /* Space to hol
19c70 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20 66 72  d MJ filename fr
19c80 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  om a journal fil
19c90 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74  e */.  int nMast
19ca0 65 72 50 74 72 3b 20 20 20 20 20 20 20 20 20 20  erPtr;          
19cb0 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 73 70   /* Amount of sp
19cc0 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f  ace allocated to
19cd0 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20 2a 2f   zMasterPtr[] */
19ce0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
19cf0 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74  space for both t
19d00 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20  he pJournal and 
19d10 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73  pMaster file des
19d20 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49  criptors..  ** I
19d30 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70  f successful, op
19d40 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
19d50 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72  urnal file for r
19d60 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70  eading..  */.  p
19d70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65  Master = (sqlite
19d80 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33  3_file *)sqlite3
19d90 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d  MallocZero(pVfs-
19da0 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a  >szOsFile * 2);.
19db0 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71    pJournal = (sq
19dc0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28  lite3_file *)(((
19dd0 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20  u8 *)pMaster) + 
19de0 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b  pVfs->szOsFile);
19df0 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20  .  if( !pMaster 
19e00 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
19e10 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
19e20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73   }else{.    cons
19e30 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 23  t int flags = .#
19e40 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
19e50 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e  _DATA_PROTECTION
19e60 0a 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e  .      (pPager->
19e70 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  vfsFlags&SQLITE_
19e80 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54  OPEN_FILEPROTECT
19e90 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64 69  ION_MASK)|.#endi
19ea0 66 0a 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f  f.      (SQLITE_
19eb0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
19ec0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
19ed0 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72  _JOURNAL);.    r
19ee0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
19ef0 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  n(pVfs, zMaster,
19f00 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c   pMaster, flags,
19f10 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
19f20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
19f30 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
19f40 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68  t;..  /* Load th
19f50 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
19f60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
19f70 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
19f80 20 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74   from.  ** sqlit
19f90 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  e3_malloc() and 
19fa0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
19fb0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20  asterJournal.   
19fc0 41 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a  Also obtain.  **
19fd0 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
19fe0 65 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72  e (in zMasterPtr
19ff0 29 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61  ) to hold the na
1a000 6d 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20  mes of master.  
1a010 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ** journal files
1a020 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
1a030 72 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b  regular rollback
1a040 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a  -journals..  */.
1a050 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1a060 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72  FileSize(pMaster
1a070 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  , &nMasterJourna
1a080 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  l);.  if( rc!=SQ
1a090 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
1a0a0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
1a0b0 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66  nMasterPtr = pVf
1a0c0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
1a0d0 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  .  zMasterJourna
1a0e0 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  l = sqlite3Mallo
1a0f0 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  c(nMasterJournal
1a100 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 20 2b 20   + nMasterPtr + 
1a110 31 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73 74  1);.  if( !zMast
1a120 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
1a130 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1a140 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  EM_BKPT;.    got
1a150 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
1a160 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74  .  }.  zMasterPt
1a170 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72  r = &zMasterJour
1a180 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
1a190 61 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71  al+1];.  rc = sq
1a1a0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73  lite3OsRead(pMas
1a1b0 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
1a1c0 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65  nal, (int)nMaste
1a1d0 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  rJournal, 0);.  
1a1e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a1f0 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
1a200 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65  er_out;.  zMaste
1a210 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72  rJournal[nMaster
1a220 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20  Journal] = 0;.. 
1a230 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
1a240 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68  terJournal;.  wh
1a250 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a  ile( (zJournal-z
1a260 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e  MasterJournal)<n
1a270 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
1a280 0a 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b  .    int exists;
1a290 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1a2a0 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
1a2b0 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
1a2c0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
1a2d0 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66  &exists);.    if
1a2e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a2f0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  ){.      goto de
1a300 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
1a310 20 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74   }.    if( exist
1a320 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e  s ){.      /* On
1a330 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
1a340 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  s pointed to by 
1a350 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
1a360 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20  al exists..     
1a370 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20   ** Open it and 
1a380 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e  check if it poin
1a390 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72  ts at the master
1a3a0 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
1a3b0 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
1a3c0 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
1a3d0 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
1a3e0 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
1a3f0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b   */.      int c;
1a400 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73  .      int flags
1a410 20 3d 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45   = .#if SQLITE_E
1a420 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45  NABLE_DATA_PROTE
1a430 43 54 49 4f 4e 0a 20 20 20 20 20 20 20 20 28 70  CTION.        (p
1a440 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 26  Pager->vfsFlags&
1a450 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49 4c 45  SQLITE_OPEN_FILE
1a460 50 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53 4b 29  PROTECTION_MASK)
1a470 7c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  |.#endif.       
1a480 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
1a490 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
1a4a0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
1a4b0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1a4c0 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
1a4d0 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72   zJournal, pJour
1a4e0 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  nal, flags, 0);.
1a4f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1a500 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a510 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
1a520 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a  r_out;.      }..
1a530 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d        rc = readM
1a540 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f  asterJournal(pJo
1a550 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74  urnal, zMasterPt
1a560 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a  r, nMasterPtr);.
1a570 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
1a580 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a  lose(pJournal);.
1a590 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1a5a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a5b0 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
1a5c0 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a  r_out;.      }..
1a5d0 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65        c = zMaste
1a5e0 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74  rPtr[0]!=0 && st
1a5f0 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c  rcmp(zMasterPtr,
1a600 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20   zMaster)==0;.  
1a610 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20      if( c ){.   
1a620 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20       /* We have 
1a630 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20  a match. Do not 
1a640 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
1a650 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
1a660 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  */.        goto 
1a670 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
1a680 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1a690 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71   zJournal += (sq
1a6a0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a  lite3Strlen30(zJ
1a6b0 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d 0a  ournal)+1);.  }.
1a6c0 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f   .  sqlite3OsClo
1a6d0 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  se(pMaster);.  r
1a6e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
1a6f0 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
1a700 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65  r, 0);..delmaste
1a710 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33  r_out:.  sqlite3
1a720 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75  _free(zMasterJou
1a730 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d 61  rnal);.  if( pMa
1a740 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  ster ){.    sqli
1a750 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74  te3OsClose(pMast
1a760 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
1a770 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61   !isOpen(pJourna
1a780 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  l) );.    sqlite
1a790 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b  3_free(pMaster);
1a7a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1a7b0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
1a7c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
1a7d0 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  d to change the 
1a7e0 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74  actual size of t
1a7f0 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
1a800 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65  file in the file
1a810 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f 6e  -system. This on
1a820 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  ly happens when 
1a830 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
1a840 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20  nsaction,.** or 
1a850 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74  rolling back a t
1a860 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63 6c  ransaction (incl
1a870 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62 61  uding rolling ba
1a880 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
1a890 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
1a8a0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
1a8b0 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20  le is not open, 
1a8c0 6f 72 20 74 68 65 20 70 61 67 65 72 20 69 73 20  or the pager is 
1a8d0 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a  not in either.**
1a8e0 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e 20 73   DBMOD or OPEN s
1a8f0 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74  tate, this funct
1a900 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
1a910 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 73  Otherwise, the s
1a920 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65 20 66  ize .** of the f
1a930 69 6c 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  ile is changed t
1a940 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20 28 6e  o nPage pages (n
1a950 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61 67  Page*pPager->pag
1a960 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20 0a 2a  eSize bytes). .*
1a970 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  * If the file on
1a980 20 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74   disk is current
1a990 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e  ly larger than n
1a9a0 50 61 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e  Page pages, then
1a9b0 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20   use the VFS.** 
1a9c0 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68  xTruncate() meth
1a9d0 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69  od to truncate i
1a9e0 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20  t..**.** Or, it 
1a9f0 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
1aa00 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20  e that the file 
1aa10 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c  on disk is small
1aa20 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67  er than .** nPag
1aa30 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70  e pages. Some op
1aa40 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
1aa50 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63  mplementations c
1aa60 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20  an get confused 
1aa70 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74  if .** you try t
1aa80 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c  o truncate a fil
1aa90 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74  e to some size t
1aaa0 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68  hat is larger th
1aab0 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e  an it .** curren
1aac0 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65 63  tly is, so detec
1aad0 74 20 74 68 69 73 20 63 61 73 65 20 61 6e 64 20  t this case and 
1aae0 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a  write a single z
1aaf0 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20  ero byte to .** 
1ab00 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e  the end of the n
1ab10 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e  ew file instead.
1ab20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
1ab30 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c  sful, return SQL
1ab40 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f  ITE_OK. If an IO
1ab50 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
1ab60 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a  ile modifying.**
1ab70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ab80 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65  le, return the e
1ab90 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65  rror code to the
1aba0 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74   caller..*/.stat
1abb0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75  ic int pager_tru
1abc0 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
1abd0 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
1abe0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1abf0 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
1ac00 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
1ac10 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
1ac20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1ac30 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
1ac40 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 0a 20 20  _READER );.  .  
1ac50 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
1ac60 72 2d 3e 66 64 29 20 0a 20 20 20 26 26 20 28 70  r->fd) .   && (p
1ac70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
1ac80 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
1ac90 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  D || pPager->eSt
1aca0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29  ate==PAGER_OPEN)
1acb0 20 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 63   .  ){.    i64 c
1acc0 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53  urrentSize, newS
1acd0 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50  ize;.    int szP
1ace0 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  age = pPager->pa
1acf0 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65  geSize;.    asse
1ad00 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
1ad10 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
1ad20 4b 20 29 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f  K );.    /* TODO
1ad30 3a 20 49 73 20 69 74 20 73 61 66 65 20 74 6f 20  : Is it safe to 
1ad40 75 73 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65  use Pager.dbFile
1ad50 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20  Size here? */.  
1ad60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1ad70 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
1ad80 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a  >fd, &currentSiz
1ad90 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20  e);.    newSize 
1ada0 3d 20 73 7a 50 61 67 65 2a 28 69 36 34 29 6e 50  = szPage*(i64)nP
1adb0 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  age;.    if( rc=
1adc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75  =SQLITE_OK && cu
1add0 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69  rrentSize!=newSi
1ade0 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ze ){.      if( 
1adf0 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53  currentSize>newS
1ae00 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ize ){.        r
1ae10 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
1ae20 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64  ncate(pPager->fd
1ae30 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20  , newSize);.    
1ae40 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 75 72    }else if( (cur
1ae50 72 65 6e 74 53 69 7a 65 2b 73 7a 50 61 67 65 29  rentSize+szPage)
1ae60 3c 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  <=newSize ){.   
1ae70 20 20 20 20 20 63 68 61 72 20 2a 70 54 6d 70 20       char *pTmp 
1ae80 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
1ae90 61 63 65 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ace;.        mem
1aea0 73 65 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a 50  set(pTmp, 0, szP
1aeb0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65  age);.        te
1aec0 73 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65  stcase( (newSize
1aed0 2d 73 7a 50 61 67 65 29 20 3d 3d 20 63 75 72 72  -szPage) == curr
1aee0 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  entSize );.     
1aef0 20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65     testcase( (ne
1af00 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3e 20  wSize-szPage) > 
1af10 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a   currentSize );.
1af20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1af30 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
1af40 65 72 2d 3e 66 64 2c 20 70 54 6d 70 2c 20 73 7a  er->fd, pTmp, sz
1af50 50 61 67 65 2c 20 6e 65 77 53 69 7a 65 2d 73 7a  Page, newSize-sz
1af60 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
1af70 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1af80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1af90 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
1afa0 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
1afb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1afc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1afd0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
1afe0 61 6e 69 74 69 7a 65 64 20 76 65 72 73 69 6f 6e  anitized version
1aff0 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 2d 73   of the sector-s
1b000 69 7a 65 20 6f 66 20 4f 53 20 66 69 6c 65 20 70  ize of OS file p
1b010 46 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 65 74  File. The.** ret
1b020 75 72 6e 20 76 61 6c 75 65 20 69 73 20 67 75 61  urn value is gua
1b030 72 61 6e 74 65 65 64 20 74 6f 20 6c 69 65 20 62  ranteed to lie b
1b040 65 74 77 65 65 6e 20 33 32 20 61 6e 64 20 4d 41  etween 32 and MA
1b050 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a  X_SECTOR_SIZE..*
1b060 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 63  /.int sqlite3Sec
1b070 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
1b080 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  file *pFile){.  
1b090 69 6e 74 20 69 52 65 74 20 3d 20 73 71 6c 69 74  int iRet = sqlit
1b0a0 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
1b0b0 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 69 52 65  File);.  if( iRe
1b0c0 74 3c 33 32 20 29 7b 0a 20 20 20 20 69 52 65 74  t<32 ){.    iRet
1b0d0 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 20   = 512;.  }else 
1b0e0 69 66 28 20 69 52 65 74 3e 4d 41 58 5f 53 45 43  if( iRet>MAX_SEC
1b0f0 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  TOR_SIZE ){.    
1b100 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54  assert( MAX_SECT
1b110 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a  OR_SIZE>=512 );.
1b120 20 20 20 20 69 52 65 74 20 3d 20 4d 41 58 5f 53      iRet = MAX_S
1b130 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a  ECTOR_SIZE;.  }.
1b140 20 20 72 65 74 75 72 6e 20 69 52 65 74 3b 0a 7d    return iRet;.}
1b150 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1b160 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67  value of the Pag
1b170 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61  er.sectorSize va
1b180 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67  riable for the g
1b190 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61  iven.** pager ba
1b1a0 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  sed on the value
1b1b0 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
1b1c0 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74   xSectorSize met
1b1d0 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70  hod.** of the op
1b1e0 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
1b1f0 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a  . The sector siz
1b200 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 0a  e will be used .
1b210 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
1b220 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69  the size and ali
1b230 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61  gnment of journa
1b240 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a  l header and .**
1b250 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1b260 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20  pointers within 
1b270 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20  created journal 
1b280 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  files..**.** For
1b290 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
1b2a0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
1b2b0 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c  ector size is al
1b2c0 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a  ways 512 bytes..
1b2d0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
1b2e0 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61   for non-tempora
1b2f0 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66  ry files, the ef
1b300 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
1b310 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61  ize is.** the va
1b320 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
1b330 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28  the xSectorSize(
1b340 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64  ) method rounded
1b350 20 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a 20   up to 32 if.** 
1b360 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  it is less than 
1b370 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20 64  32, or rounded d
1b380 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54 4f  own to MAX_SECTO
1b390 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a 20  R_SIZE if it.** 
1b3a0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1b3b0 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e  MAX_SECTOR_SIZE.
1b3c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
1b3d0 6c 65 20 68 61 73 20 74 68 65 20 53 51 4c 49 54  le has the SQLIT
1b3e0 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
1b3f0 45 5f 4f 56 45 52 57 52 49 54 45 20 70 72 6f 70  E_OVERWRITE prop
1b400 65 72 74 79 2c 20 74 68 65 6e 20 73 65 74 0a 2a  erty, then set.*
1b410 2a 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  * the effective 
1b420 73 65 63 74 6f 72 20 73 69 7a 65 20 74 6f 20 69  sector size to i
1b430 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65  ts minimum value
1b440 20 28 35 31 32 29 2e 20 20 54 68 65 20 70 75 72   (512).  The pur
1b450 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50 61 67 65  pose of.** pPage
1b460 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69 73  r->sectorSize is
1b470 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20 22   to define the "
1b480 62 6c 61 73 74 20 72 61 64 69 75 73 22 20 6f 66  blast radius" of
1b490 20 62 79 74 65 73 20 74 68 61 74 0a 2a 2a 20 6d   bytes that.** m
1b4a0 69 67 68 74 20 63 68 61 6e 67 65 20 69 66 20 61  ight change if a
1b4b0 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 77 68   crash occurs wh
1b4c0 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ile writing to a
1b4d0 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 0a   single byte in.
1b4e0 2a 2a 20 74 68 61 74 20 72 61 6e 67 65 2e 20 20  ** that range.  
1b4f0 42 75 74 20 77 69 74 68 20 50 4f 57 45 52 53 41  But with POWERSA
1b500 46 45 5f 4f 56 45 52 57 52 49 54 45 2c 20 74 68  FE_OVERWRITE, th
1b510 65 20 62 6c 61 73 74 20 72 61 64 69 75 73 20 69  e blast radius i
1b520 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68 61 74 20  s zero.** (that 
1b530 69 73 20 77 68 61 74 20 50 4f 57 45 52 53 41 46  is what POWERSAF
1b540 45 5f 4f 56 45 52 57 52 49 54 45 20 6d 65 61 6e  E_OVERWRITE mean
1b550 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e 69 6d 69  s), so we minimi
1b560 7a 65 20 74 68 65 20 73 65 63 74 6f 72 0a 2a 2a  ze the sector.**
1b570 20 73 69 7a 65 2e 20 20 46 6f 72 20 62 61 63 6b   size.  For back
1b580 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
1b590 69 74 79 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62  ity of the rollb
1b5a0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ack journal file
1b5b0 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65 20 63   format,.** we c
1b5c0 61 6e 6e 6f 74 20 72 65 64 75 63 65 20 74 68 65  annot reduce the
1b5d0 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
1b5e0 72 20 73 69 7a 65 20 62 65 6c 6f 77 20 35 31 32  r size below 512
1b5f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1b600 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50   setSectorSize(P
1b610 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1b620 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1b630 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
1b640 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1b650 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
1b660 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20 7c 7c  ->tempFile.   ||
1b670 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
1b680 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1b690 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26 20 0a  (pPager->fd) & .
1b6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
1b6b0 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
1b6c0 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 21  SAFE_OVERWRITE)!
1b6d0 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 53  =0.  ){.    /* S
1b6e0 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e  ector size doesn
1b6f0 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65  't matter for te
1b700 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41  mporary files. A
1b710 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20  lso, the file.  
1b720 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76    ** may not hav
1b730 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65  e been opened ye
1b740 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  t, in which case
1b750 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a   the OsSectorSiz
1b760 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  e().    ** call 
1b770 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 20 2a  will segfault. *
1b780 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
1b790 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a  ctorSize = 512;.
1b7a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
1b7b0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
1b7c0 3d 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53  = sqlite3SectorS
1b7d0 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ize(pPager->fd);
1b7e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c  .  }.}../*.** Pl
1b7f0 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e  ayback the journ
1b800 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74  al and thus rest
1b810 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
1b820 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20   file to.** the 
1b830 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20  state it was in 
1b840 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65  before we starte
1b850 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73  d making changes
1b860 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .  .**.** The jo
1b870 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
1b880 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t is as follows:
1b890 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20   .**.**  (1)  8 
1b8a0 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20  byte prefix.  A 
1b8b0 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c  copy of aJournal
1b8c0 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29  Magic[]..**  (2)
1b8d0 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
1b8e0 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
1b8f0 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
1b900 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  of valid page re
1b910 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69  cords.**       i
1b920 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
1b930 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  If this value is
1b940 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
1b950 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
1b960 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66         number of
1b970 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72   page records fr
1b980 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  om the journal s
1b990 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20  ize..**  (3)  4 
1b9a0 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
1b9b0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1b9c0 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
1b9d0 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20  ue for the .**  
1b9e0 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63       sanity chec
1b9f0 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34  ksum..**  (4)  4
1ba00 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
1ba10 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
1ba20 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72  r of pages to tr
1ba30 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20  uncate the.**   
1ba40 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20      database to 
1ba50 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
1ba60 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79  k..**  (5)  4 by
1ba70 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
1ba80 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1ba90 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20  he sector size. 
1baa0 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20   The header.**  
1bab0 20 20 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e       is this man
1bac0 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  y bytes in size.
1bad0 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74 65  .**  (6)  4 byte
1bae0 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
1baf0 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
1bb00 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 20   page size..**  
1bb10 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69 6e  (7)  zero paddin
1bb20 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65 78  g out to the nex
1bb30 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a 2a  t sector size..*
1bb40 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72 20  *  (8)  Zero or 
1bb50 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61  more pages insta
1bb60 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f  nces, each as fo
1bb70 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20  llows:.**       
1bb80 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20   +  4 byte page 
1bb90 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20  number..**      
1bba0 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67    +  pPager->pag
1bbb0 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
1bbc0 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ata..**        +
1bbd0 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75    4 byte checksu
1bbe0 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20  m.**.** When we 
1bbf0 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75  speak of the jou
1bc00 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20  rnal header, we 
1bc10 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 37  mean the first 7
1bc20 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a   items above..**
1bc30 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74   Each entry in t
1bc40 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e  he journal is an
1bc50 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
1bc60 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a   8th item..**.**
1bc70 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20   Call the value 
1bc80 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
1bc90 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20  bullet "nRec".  
1bca0 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62  nRec is the numb
1bcb0 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70  er of.** valid p
1bcc0 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  age entries in t
1bcd0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
1bce0 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20  most cases, you 
1bcf0 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  can compute the.
1bd00 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  ** value of nRec
1bd10 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
1bd20 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1bd30 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f  le.  But if a po
1bd40 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f  wer.** failure o
1bd50 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68  ccurred while th
1bd60 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
1bd70 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20  ing written, it 
1bd80 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20  could be the.** 
1bd90 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69  case that the si
1bda0 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
1bdb0 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61  l file had alrea
1bdc0 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65  dy been increase
1bdd0 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74  d but.** the ext
1bde0 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e  ra entries had n
1bdf0 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73  ot yet made it s
1be00 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20  afely to disk.  
1be10 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a  In such a case,.
1be20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
1be30 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
1be40 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
1be50 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61   would be too la
1be60 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61  rge.  For.** tha
1be70 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77  t reason, we alw
1be80 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63  ays use the nRec
1be90 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65   value in the he
1bea0 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ader..**.** If t
1beb0 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73  he nRec value is
1bec0 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d   0xffffffff it m
1bed0 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73  eans that nRec s
1bee0 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
1bef0 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
1bf00 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76  le size.  This v
1bf10 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65  alue is used whe
1bf20 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63  n the user selec
1bf30 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e  ts the.** no-syn
1bf40 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65  c option for the
1bf50 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77   journal.  A pow
1bf60 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
1bf70 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74   lead to corrupt
1bf80 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ion.** in this c
1bf90 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68  ase.  But for th
1bfa0 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72  ings like tempor
1bfb0 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68  ary table (which
1bfc0 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65   will be.** dele
1bfd0 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77  ted when the pow
1bfe0 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20  er is restored) 
1bff0 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20  we don't care.  
1c000 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
1c010 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65  le opened as the
1c020 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
1c030 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d   not a well-form
1c040 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  ed.** journal fi
1c050 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  le then all page
1c060 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73  s up to the firs
1c070 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65  t corrupted page
1c080 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62   are rolled.** b
1c090 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73  ack (or no pages
1c0a0 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
1c0b0 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70  header is corrup
1c0c0 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ted). The journa
1c0d0 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65  l file.** is the
1c0e0 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51  n deleted and SQ
1c0f0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
1c100 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20  , just as if no 
1c110 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a  corruption had.*
1c120 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72  * been encounter
1c130 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
1c140 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20  I/O or malloc() 
1c150 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
1c160 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69  e journal-file i
1c170 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a  s not deleted.**
1c180 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
1c190 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
1c1a0 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20  **.** The isHot 
1c1b0 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61  parameter indica
1c1c0 74 65 73 20 74 68 61 74 20 77 65 20 61 72 65 20  tes that we are 
1c1d0 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  trying to rollba
1c1e0 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ck a journal.** 
1c1f0 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 61 20  that might be a 
1c200 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72  hot journal.  Or
1c210 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68  , it could be th
1c220 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
1c230 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20  s .** preserved 
1c240 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e  because of JOURN
1c250 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f  ALMODE_PERSIST o
1c260 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  r JOURNALMODE_TR
1c270 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68  UNCATE..** If th
1c280 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79  e journal really
1c290 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74   is hot, reset t
1c2a0 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 70  he pager cache p
1c2b0 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20  rior rolling.** 
1c2c0 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74  back any content
1c2d0 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  .  If the journa
1c2e0 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73  l is merely pers
1c2f0 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74  istent, no reset
1c300 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a   is.** needed..*
1c310 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1c320 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65  er_playback(Page
1c330 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69  r *pPager, int i
1c340 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  sHot){.  sqlite3
1c350 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
1c360 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34  ger->pVfs;.  i64
1c370 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
1c380 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1c390 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1c3a0 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
1c3b0 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20  u32 nRec;       
1c3c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1c3d0 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e  er of Records in
1c3e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
1c3f0 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
1c400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
1c410 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
1c420 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  ter */.  Pgno mx
1c430 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Pg = 0;         
1c440 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1c450 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69   original file i
1c460 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  n pages */.  int
1c470 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1c480 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
1c490 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75  code of a subrou
1c4a0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
1c4b0 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  s = 1;          
1c4c0 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
1c4d0 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f  rned by sqlite3O
1c4e0 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63  sAccess() */.  c
1c4f0 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
1c500 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
1c510 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
1c520 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f  l file if any */
1c530 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72  .  int needPager
1c540 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54  Reset;      /* T
1c550 72 75 65 20 74 6f 20 72 65 73 65 74 20 70 61 67  rue to reset pag
1c560 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74  e prior to first
1c570 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a   page rollback *
1c580 2f 0a 20 20 69 6e 74 20 6e 50 6c 61 79 62 61 63  /.  int nPlaybac
1c590 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  k = 0;       /* 
1c5a0 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
1c5b0 70 61 67 65 73 20 72 65 73 74 6f 72 65 64 20 66  pages restored f
1c5c0 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  rom journal */. 
1c5d0 20 75 33 32 20 73 61 76 65 64 50 61 67 65 53 69   u32 savedPageSi
1c5e0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
1c5f0 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69 67  eSize;..  /* Fig
1c600 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
1c610 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
1c620 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62  the journal.  Ab
1c630 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a  ort early if.  *
1c640 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
1c650 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61   empty..  */.  a
1c660 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1c670 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
1c680 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1c690 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
1c6a0 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28  fd, &szJ);.  if(
1c6b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c6c0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
1c6d0 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
1c6e0 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74  /* Read the mast
1c6f0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
1c700 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
1c710 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
1c720 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61  nt..  ** If a ma
1c730 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1c740 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66  e name is specif
1c750 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c  ied, but the fil
1c760 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72  e is not.  ** pr
1c770 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74  esent on disk, t
1c780 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
1c790 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64  is not hot and d
1c7a0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
1c7b0 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62  be.  ** played b
1c7c0 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ack..  **.  ** T
1c7d0 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79  ODO: Technically
1c7e0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
1c7f0 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75  s an error becau
1c800 73 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68  se it assumes th
1c810 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50  at.  ** buffer P
1c820 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69  ager.pTmpSpace i
1c830 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s (mxPathname+1)
1c840 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72   bytes or larger
1c850 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a  . i.e. that.  **
1c860 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69   (pPager->pageSi
1c870 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56  ze >= pPager->pV
1c880 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
1c890 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78  ). Using os_unix
1c8a0 2e 63 2c 0a 20 20 2a 2a 20 6d 78 50 61 74 68 6e  .c,.  ** mxPathn
1c8b0 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69 63  ame is 512, whic
1c8c0 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  h is the same as
1c8d0 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c   the minimum all
1c8e0 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a  owable value.  *
1c8f0 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a  * for pageSize..
1c900 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d    */.  zMaster =
1c910 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
1c920 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d  ce;.  rc = readM
1c930 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
1c940 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
1c950 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
1c960 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
1c970 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c980 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30  _OK && zMaster[0
1c990 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ] ){.    rc = sq
1c9a0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
1c9b0 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
1c9c0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
1c9d0 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20  S, &res);.  }.  
1c9e0 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69  zMaster = 0;.  i
1c9f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ca00 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20   || !res ){.    
1ca10 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1ca20 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
1ca30 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
1ca40 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  .  needPagerRese
1ca50 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a  t = isHot;..  /*
1ca60 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69   This loop termi
1ca70 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65  nates either whe
1ca80 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  n a readJournalH
1ca90 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61  dr() or .  ** pa
1caa0 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
1cab0 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74  _page() call ret
1cac0 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
1cad0 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
1cae0 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20  .  ** occurs. . 
1caf0 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29   */.  while( 1 )
1cb00 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  {.    /* Read th
1cb10 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
1cb20 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a  eader from the j
1cb30 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66  ournal file.  If
1cb40 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a   there are.    *
1cb50 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74  * not enough byt
1cb60 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a  es left in the j
1cb70 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
1cb80 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65  a complete heade
1cb90 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20  r, or.    ** it 
1cba0 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68  is corrupted, th
1cbb0 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73  en a process mus
1cbc0 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 68  t have failed wh
1cbd0 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a  ile writing it..
1cbe0 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69      ** This indi
1cbf0 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f  cates nothing mo
1cc00 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  re needs to be r
1cc10 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
1cc20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  */.    rc = read
1cc30 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
1cc40 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26  r, isHot, szJ, &
1cc50 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20  nRec, &mxPg);.  
1cc60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1cc70 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66  _OK ){ .      if
1cc80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
1cc90 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  E ){.        rc 
1cca0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1ccb0 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
1ccc0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1ccd0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
1cce0 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66  Rec is 0xfffffff
1ccf0 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75  f, then this jou
1cd00 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64  rnal was created
1cd10 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20   by a process.  
1cd20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20    ** working in 
1cd30 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68  no-sync mode. Th
1cd40 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
1cd50 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  e rest of the jo
1cd60 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
1cd70 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61  e consists of pa
1cd80 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e  ges, there are n
1cd90 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68  o more journal h
1cda0 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a  eaders. Compute.
1cdb0 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
1cdc0 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f   of nRec based o
1cdd0 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f  n this assumptio
1cde0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
1cdf0 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66  ( nRec==0xffffff
1ce00 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ff ){.      asse
1ce10 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
1ce20 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
1ce30 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
1ce40 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  ;.      nRec = (
1ce50 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52  int)((szJ - JOUR
1ce60 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1ce70 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  r))/JOURNAL_PG_S
1ce80 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
1ce90 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
1cea0 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20  c is 0 and this 
1ceb0 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61  rollback is of a
1cec0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65   transaction cre
1ced0 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20  ated by this.   
1cee0 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20   ** process and 
1cef0 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
1cf00 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74  inal header in t
1cf10 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e  he journal, then
1cf20 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a   it means.    **
1cf30 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20   that this part 
1cf40 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  of the journal w
1cf50 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20  as being filled 
1cf60 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20  but has not yet 
1cf70 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63  been.    ** sync
1cf80 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d  ed to disk.  Com
1cf90 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  pute the number 
1cfa0 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f  of pages based o
1cfb0 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a  n the remaining.
1cfc0 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74      ** size of t
1cfd0 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
1cfe0 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64      ** The third
1cff0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73   term of the tes
1d000 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66  t was added to f
1d010 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  ix ticket #2565.
1d020 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c  .    ** When rol
1d030 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20  ling back a hot 
1d040 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30  journal, nRec==0
1d050 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68   always means th
1d060 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20  at the next.    
1d070 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20  ** chunk of the 
1d080 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
1d090 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62   zero pages to b
1d0a0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
1d0b0 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  But.    ** when 
1d0c0 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b  doing a ROLLBACK
1d0d0 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30   and the nRec==0
1d0e0 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61   chunk is the la
1d0f0 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20  st chunk in.    
1d100 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  ** the journal, 
1d110 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
1d120 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  e journal might 
1d130 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e  contain addition
1d140 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20  al.    ** pages 
1d150 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
1d160 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20  rolled back and 
1d170 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20  that the number 
1d180 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a  of pages .    **
1d190 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
1d1a0 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ted based on the
1d1b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69   journal file si
1d1c0 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
1d1d0 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69  f( nRec==0 && !i
1d1e0 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20  sHot &&.        
1d1f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
1d200 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
1d210 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
1d220 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
1d230 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69  .      nRec = (i
1d240 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  nt)((szJ - pPage
1d250 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
1d260 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
1d270 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a  Pager));.    }..
1d280 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
1d290 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64  s the first head
1d2a0 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  er read from the
1d2b0 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61   journal, trunca
1d2c0 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  te the.    ** da
1d2d0 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b  tabase file back
1d2e0 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
1d2f0 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
1d300 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
1d310 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
1d320 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1d330 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1d340 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
1d350 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20  ager, mxPg);.   
1d360 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d370 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1d380 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1d390 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1d3a0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1d3b0 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20  = mxPg;.    }.. 
1d3c0 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69     /* Copy origi
1d3d0 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66  nal pages out of
1d3e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
1d3f0 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a   back into the .
1d400 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1d410 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65  file and/or page
1d420 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20   cache..    */. 
1d430 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52     for(u=0; u<nR
1d440 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20  ec; u++){.      
1d450 69 66 28 20 6e 65 65 64 50 61 67 65 72 52 65 73  if( needPagerRes
1d460 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  et ){.        pa
1d470 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
1d480 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50  );.        needP
1d490 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20  agerReset = 0;. 
1d4a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
1d4b0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
1d4c0 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
1d4d0 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ,&pPager->journa
1d4e0 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20  lOff,0,1,0);.   
1d4f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d500 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1d510 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20 20 20  nPlayback++;.   
1d520 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d530 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d540 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
1d550 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1d560 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20  alOff = szJ;.   
1d570 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1d580 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1d590 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
1d5a0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
1d5b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1d5c0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62  he journal has b
1d5d0 65 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73  een truncated, s
1d5e0 69 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69  imply stop readi
1d5f0 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  ng and.         
1d600 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74   ** processing t
1d610 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73  he journal. This
1d620 20 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69 66   might happen if
1d630 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1d640 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  .          ** no
1d650 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69  t completely wri
1d660 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20  tten and synced 
1d670 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68  prior to a crash
1d680 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20  .  In that.     
1d690 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68       ** case, th
1d6a0 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  e database shoul
1d6b0 64 20 68 61 76 65 20 6e 65 76 65 72 20 62 65 65  d have never bee
1d6c0 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65  n written in the
1d6d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69  .          ** fi
1d6e0 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20  rst place so it 
1d6f0 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20  is OK to simply 
1d700 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c  abandon the roll
1d710 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20  back. */.       
1d720 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1d730 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  K;.          got
1d740 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1d750 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1d760 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
1d770 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
1d780 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61  rollback, quit a
1d790 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  nd return the er
1d7a0 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ror.          **
1d7b0 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c   code.  This wil
1d7c0 6c 20 63 61 75 73 65 20 74 68 65 20 70 61 67 65  l cause the page
1d7d0 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65  r to enter the e
1d7e0 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20  rror state.     
1d7f0 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20       ** so that 
1d800 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d 20  no further harm 
1d810 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50  will be done.  P
1d820 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a  erhaps the next.
1d830 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
1d840 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f  cess to come alo
1d850 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20  ng will be able 
1d860 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
1d870 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20  database..      
1d880 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
1d890 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1d8a0 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
1d8b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1d8c0 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f    /*NOTREACHED*/
1d8d0 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a  .  assert( 0 );.
1d8e0 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  .end_playback:. 
1d8f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d900 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
1d910 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
1d920 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26  gesize(pPager, &
1d930 73 61 76 65 64 50 61 67 65 53 69 7a 65 2c 20 2d  savedPageSize, -
1d940 31 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 6f 6c  1);.  }.  /* Fol
1d950 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  lowing a rollbac
1d960 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  k, the database 
1d970 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62  file should be b
1d980 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69  ack in its origi
1d990 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70  nal.  ** state p
1d9a0 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
1d9b0 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
1d9c0 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20  tion, so invoke 
1d9d0 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  the.  ** SQLITE_
1d9e0 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
1d9f0 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ED file-control 
1da00 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c  method to disabl
1da10 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72  e the.  ** asser
1da20 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72  tion that the tr
1da30 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
1da40 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a  r was modified..
1da50 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
1da60 54 45 5f 44 45 42 55 47 0a 20 20 73 71 6c 69 74  TE_DEBUG.  sqlit
1da70 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48  e3OsFileControlH
1da80 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 53  int(pPager->fd,S
1da90 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
1daa0 4e 43 48 41 4e 47 45 44 2c 30 29 3b 0a 23 65 6e  NCHANGED,0);.#en
1dab0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  dif..  /* If thi
1dac0 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61  s playback is ha
1dad0 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69  ppening automati
1dae0 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c  cally as a resul
1daf0 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20  t of an IO or . 
1db00 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72   ** malloc error
1db10 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 20 61   that occurred a
1db20 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d  fter the change-
1db30 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61  counter was upda
1db40 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65  ted but .  ** be
1db50 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
1db60 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74  tion was committ
1db70 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61  ed, then the cha
1db80 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a  nge-counter .  *
1db90 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d  * modification m
1dba0 61 79 20 6a 75 73 74 20 68 61 76 65 20 62 65 65  ay just have bee
1dbb0 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66 20 74  n reverted. If t
1dbc0 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65  his happens in e
1dbd0 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d  xclusive .  ** m
1dbe0 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71  ode, then subseq
1dbf0 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  uent transaction
1dc00 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74  s performed by t
1dc10 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  he connection wi
1dc20 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61  ll not.  ** upda
1dc30 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  te the change-co
1dc40 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68  unter at all. Th
1dc50 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63  is may lead to c
1dc60 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e  ache inconsisten
1dc70 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73  cy.  ** problems
1dc80 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65   for other proce
1dc90 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69  sses at some poi
1dca0 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
1dcb0 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20  . So, just.  ** 
1dcc0 69 6e 20 63 61 73 65 20 74 68 69 73 20 68 61 73  in case this has
1dcd0 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72   happened, clear
1dce0 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   the changeCount
1dcf0 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20  Done flag now.. 
1dd00 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68   */.  pPager->ch
1dd10 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
1dd20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1dd30 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
1dd40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d  ITE_OK ){.    zM
1dd50 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  aster = pPager->
1dd60 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72  pTmpSpace;.    r
1dd70 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
1dd80 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
1dd90 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67  d, zMaster, pPag
1dda0 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
1ddb0 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73  name+1);.    tes
1ddc0 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
1ddd0 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66  E_OK );.  }.  if
1dde0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  ( rc==SQLITE_OK.
1ddf0 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
1de00 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
1de10 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61  TER_DBMOD || pPa
1de20 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
1de30 45 52 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20 20  ER_OPEN).  ){.  
1de40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1de50 67 65 72 53 79 6e 63 28 70 50 61 67 65 72 2c 20  gerSync(pPager, 
1de60 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
1de70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1de80 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e     rc = pager_en
1de90 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
1dea0 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d  ager, zMaster[0]
1deb0 21 3d 27 5c 30 27 2c 20 30 29 3b 0a 20 20 20 20  !='\0', 0);.    
1dec0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
1ded0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
1dee0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1def0 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d  OK && zMaster[0]
1df00 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f   && res ){.    /
1df10 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
1df20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1df30 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  and this routine
1df40 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63   will return suc
1df50 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65  cess,.    ** see
1df60 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
1df70 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
1df80 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
1df90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
1dfa0 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
1dfb0 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
1dfc0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1dfd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1dfe0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 48 6f  ;.  }.  if( isHo
1dff0 74 20 26 26 20 6e 50 6c 61 79 62 61 63 6b 20 29  t && nPlayback )
1e000 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
1e010 67 28 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f  g(SQLITE_NOTICE_
1e020 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b  RECOVER_ROLLBACK
1e030 2c 20 22 72 65 63 6f 76 65 72 65 64 20 25 64 20  , "recovered %d 
1e040 70 61 67 65 73 20 66 72 6f 6d 20 25 73 22 2c 0a  pages from %s",.
1e050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e060 6e 50 6c 61 79 62 61 63 6b 2c 20 70 50 61 67 65  nPlayback, pPage
1e070 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  r->zJournal);.  
1e080 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65  }..  /* The Page
1e090 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
1e0a0 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62  iable may have b
1e0b0 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c  een updated whil
1e0c0 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62  e rolling.  ** b
1e0d0 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72  ack a journal cr
1e0e0 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
1e0f0 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72  ss with a differ
1e100 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a  ent sector size.
1e110 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65    ** value. Rese
1e120 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72  t it to the corr
1e130 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ect value for th
1e140 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f  is process..  */
1e150 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  .  setSectorSize
1e160 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
1e170 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
1e180 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   Read the conten
1e190 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f  t for page pPg o
1e1a0 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ut of the databa
1e1b0 73 65 20 66 69 6c 65 20 28 6f 72 20 6f 75 74 20  se file (or out 
1e1c0 6f 66 0a 2a 2a 20 74 68 65 20 57 41 4c 20 69 66  of.** the WAL if
1e1d0 20 74 68 61 74 20 69 73 20 77 68 65 72 65 20 74   that is where t
1e1e0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63  he most recent c
1e1f0 6f 70 79 20 69 66 20 66 6f 75 6e 64 29 20 69 6e  opy if found) in
1e200 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74  to .** pPg->pDat
1e210 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b  a. A shared lock
1e220 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74   or greater must
1e230 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   be held on the 
1e240 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
1e250 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e   before this fun
1e260 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
1e270 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31  .**.** If page 1
1e280 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74   is read, then t
1e290 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  he value of Page
1e2a0 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69  r.dbFileVers[] i
1e2b0 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20  s set to.** the 
1e2c0 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
1e2d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1e2e0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  e..**.** If an I
1e2f0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
1e300 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
1e310 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  r is returned to
1e320 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20   the caller..** 
1e330 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
1e340 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1e350 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e360 72 65 61 64 44 62 50 61 67 65 28 50 67 48 64 72  readDbPage(PgHdr
1e370 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
1e380 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1e390 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20  Pager; /* Pager 
1e3a0 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65  object associate
1e3b0 64 20 77 69 74 68 20 70 61 67 65 20 70 50 67 20  d with page pPg 
1e3c0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
1e3d0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
1e3e0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1e3f0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
1e400 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 75  ITE_OMIT_WAL.  u
1e410 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b 20 20  32 iFrame = 0;  
1e420 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1e430 72 61 6d 65 20 6f 66 20 57 41 4c 20 63 6f 6e 74  rame of WAL cont
1e440 61 69 6e 69 6e 67 20 70 67 6e 6f 20 2a 2f 0a 0a  aining pgno */..
1e450 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1e460 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
1e470 52 45 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42  READER && !MEMDB
1e480 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
1e490 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1e4a0 20 29 3b 0a 0a 20 20 69 66 28 20 70 61 67 65 72   );..  if( pager
1e4b0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
1e4c0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1e4d0 65 33 57 61 6c 46 69 6e 64 46 72 61 6d 65 28 70  e3WalFindFrame(p
1e4e0 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 67  Pager->pWal, pPg
1e4f0 2d 3e 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29  ->pgno, &iFrame)
1e500 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
1e510 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1e520 69 66 28 20 69 46 72 61 6d 65 20 29 7b 0a 20 20  if( iFrame ){.  
1e530 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
1e540 6c 52 65 61 64 46 72 61 6d 65 28 70 50 61 67 65  lReadFrame(pPage
1e550 72 2d 3e 70 57 61 6c 2c 20 69 46 72 61 6d 65 2c  r->pWal, iFrame,
1e560 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1e570 2c 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20  ,pPg->pData);.  
1e580 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b  }else.#endif.  {
1e590 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73 65 74  .    i64 iOffset
1e5a0 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29   = (pPg->pgno-1)
1e5b0 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
1e5c0 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d  geSize;.    rc =
1e5d0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
1e5e0 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e  Pager->fd, pPg->
1e5f0 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
1e600 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 73 65 74  ageSize, iOffset
1e610 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1e620 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1e630 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
1e640 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e650 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1e660 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b   pPg->pgno==1 ){
1e670 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
1e680 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72       /* If the r
1e690 65 61 64 20 69 73 20 75 6e 73 75 63 63 65 73 73  ead is unsuccess
1e6a0 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62 46  ful, set the dbF
1e6b0 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f 6d  ileVers[] to som
1e6c0 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  ething.      ** 
1e6d0 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72 20  that will never 
1e6e0 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65 20  be a valid file 
1e6f0 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c 65  version.  dbFile
1e700 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70 79  Vers[] is a copy
1e710 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79 74  .      ** of byt
1e720 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68 65  es 24..39 of the
1e730 20 64 61 74 61 62 61 73 65 2e 20 20 42 79 74 65   database.  Byte
1e740 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64 20  s 28..31 should 
1e750 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20 20  always be.      
1e760 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65 20 73  ** zero or the s
1e770 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1e780 61 73 65 20 69 6e 20 70 61 67 65 2e 20 42 79 74  ase in page. Byt
1e790 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20 33 35  es 32..35 and 35
1e7a0 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20 73 68  ..39.      ** sh
1e7b0 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75 6d  ould be page num
1e7c0 62 65 72 73 20 77 68 69 63 68 20 61 72 65 20 6e  bers which are n
1e7d0 65 76 65 72 20 30 78 66 66 66 66 66 66 66 66 2e  ever 0xffffffff.
1e7e0 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20 20    So filling.   
1e7f0 20 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64 62     ** pPager->db
1e800 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68 20  FileVers[] with 
1e810 61 6c 6c 20 30 78 66 66 20 62 79 74 65 73 20 73  all 0xff bytes s
1e820 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e 0a 20  hould suffice.. 
1e830 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1e840 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70 74 65   For an encrypte
1e850 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  d database, the 
1e860 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f 72  situation is mor
1e870 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74 65  e complex:  byte
1e880 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e 33  s.      ** 24..3
1e890 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  9 of the databas
1e8a0 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f 69 73  e are white nois
1e8b0 65 2e 20 20 42 75 74 20 74 68 65 20 70 72 6f 62  e.  But the prob
1e8c0 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20 20 20  ability of.     
1e8d0 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73 65 20   ** white noise 
1e8e0 65 71 75 61 6c 69 6e 67 20 31 36 20 62 79 74 65  equaling 16 byte
1e8f0 73 20 6f 66 20 30 78 66 66 20 69 73 20 76 61 6e  s of 0xff is van
1e900 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 73  ishingly small s
1e910 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 73 68  o.      ** we sh
1e920 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65 20 6f 6b  ould still be ok
1e930 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1e940 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
1e950 64 62 46 69 6c 65 56 65 72 73 2c 20 30 78 66 66  dbFileVers, 0xff
1e960 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
1e970 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
1e980 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e990 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d  u8 *dbFileVers =
1e9a0 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61   &((u8*)pPg->pDa
1e9b0 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 20 20 6d  ta)[24];.      m
1e9c0 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
1e9d0 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
1e9e0 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50  eVers, sizeof(pP
1e9f0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1ea00 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
1ea10 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
1ea20 50 67 2d 3e 70 44 61 74 61 2c 20 70 50 67 2d 3e  Pg->pData, pPg->
1ea30 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51  pgno, 3, rc = SQ
1ea40 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29  LITE_NOMEM_BKPT)
1ea50 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  ;..  PAGER_INCR(
1ea60 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
1ea70 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50  addb_count);.  P
1ea80 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
1ea90 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52  ->nRead);.  IOTR
1eaa0 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64  ACE(("PGIN %p %d
1eab0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
1eac0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45  ->pgno));.  PAGE
1ead0 52 54 52 41 43 45 28 28 22 46 45 54 43 48 20 25  RTRACE(("FETCH %
1eae0 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
1eaf0 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
1eb00 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
1eb10 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1eb20 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
1eb30 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65  sh(pPg)));..  re
1eb40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1eb50 2a 20 55 70 64 61 74 65 20 74 68 65 20 76 61 6c  * Update the val
1eb60 75 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65  ue of the change
1eb70 2d 63 6f 75 6e 74 65 72 20 61 74 20 6f 66 66 73  -counter at offs
1eb80 65 74 73 20 32 34 20 61 6e 64 20 39 32 20 69 6e  ets 24 and 92 in
1eb90 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 61  .** the header a
1eba0 6e 64 20 74 68 65 20 73 71 6c 69 74 65 20 76 65  nd the sqlite ve
1ebb0 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20  rsion number at 
1ebc0 6f 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a  offset 96..**.**
1ebd0 20 54 68 69 73 20 69 73 20 61 6e 20 75 6e 63 6f   This is an unco
1ebe0 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64 61 74 65  nditional update
1ebf0 2e 20 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20  .  See also the 
1ec00 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
1ec10 65 63 6f 75 6e 74 65 72 28 29 0a 2a 2a 20 72 6f  ecounter().** ro
1ec20 75 74 69 6e 65 20 77 68 69 63 68 20 6f 6e 6c 79  utine which only
1ec30 20 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61   updates the cha
1ec40 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 66 20 74  nge-counter if t
1ec50 68 65 20 75 70 64 61 74 65 20 69 73 20 61 63 74  he update is act
1ec60 75 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65 64 2c  ually.** needed,
1ec70 20 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   as determined b
1ec80 79 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68  y the pPager->ch
1ec90 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 73 74  angeCountDone st
1eca0 61 74 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f  ate variable..*/
1ecb0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
1ecc0 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63  er_write_changec
1ecd0 6f 75 6e 74 65 72 28 50 67 48 64 72 20 2a 70 50  ounter(PgHdr *pP
1ece0 67 29 7b 0a 20 20 75 33 32 20 63 68 61 6e 67 65  g){.  u32 change
1ecf0 5f 63 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20  _counter;..  /* 
1ed00 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  Increment the va
1ed10 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e  lue just read an
1ed20 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20  d write it back 
1ed30 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20  to byte 24. */. 
1ed40 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20   change_counter 
1ed50 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
1ed60 65 28 28 75 38 2a 29 70 50 67 2d 3e 70 50 61 67  e((u8*)pPg->pPag
1ed70 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 2b  er->dbFileVers)+
1ed80 31 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 28  1;.  put32bits((
1ed90 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74  (char*)pPg->pDat
1eda0 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f  a)+24, change_co
1edb0 75 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c  unter);..  /* Al
1edc0 73 6f 20 73 74 6f 72 65 20 74 68 65 20 53 51 4c  so store the SQL
1edd0 69 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  ite version numb
1ede0 65 72 20 69 6e 20 62 79 74 65 73 20 39 36 2e 2e  er in bytes 96..
1edf0 39 39 20 61 6e 64 20 69 6e 0a 20 20 2a 2a 20 62  99 and in.  ** b
1ee00 79 74 65 73 20 39 32 2e 2e 39 35 20 73 74 6f 72  ytes 92..95 stor
1ee10 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  e the change cou
1ee20 6e 74 65 72 20 66 6f 72 20 77 68 69 63 68 20 74  nter for which t
1ee30 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  he version numbe
1ee40 72 0a 20 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e  r.  ** is valid.
1ee50 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
1ee60 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61  ((char*)pPg->pDa
1ee70 74 61 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63  ta)+92, change_c
1ee80 6f 75 6e 74 65 72 29 3b 0a 20 20 70 75 74 33 32  ounter);.  put32
1ee90 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67  bits(((char*)pPg
1eea0 2d 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51 4c  ->pData)+96, SQL
1eeb0 49 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  ITE_VERSION_NUMB
1eec0 45 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  ER);.}..#ifndef 
1eed0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1eee0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1eef0 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f  ion is invoked o
1ef00 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 61 67  nce for each pag
1ef10 65 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61  e that has alrea
1ef20 64 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69 74  dy been .** writ
1ef30 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f 67  ten into the log
1ef40 20 66 69 6c 65 20 77 68 65 6e 20 61 20 57 41 4c   file when a WAL
1ef50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1ef60 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
1ef70 50 61 72 61 6d 65 74 65 72 20 69 50 67 20 69 73  Parameter iPg is
1ef80 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1ef90 20 6f 66 20 73 61 69 64 20 70 61 67 65 2e 20 54   of said page. T
1efa0 68 65 20 70 43 74 78 20 61 72 67 75 6d 65 6e 74  he pCtx argument
1efb0 20 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c 79   .** is actually
1efc0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1efd0 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
1efe0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65  e..**.** If page
1eff0 20 69 50 67 20 69 73 20 70 72 65 73 65 6e 74 20   iPg is present 
1f000 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61 6e  in the cache, an
1f010 64 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e  d has no outstan
1f020 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2c  ding references,
1f030 0a 2a 2a 20 69 74 20 69 73 20 64 69 73 63 61 72  .** it is discar
1f040 64 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ded. Otherwise, 
1f050 69 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65  if there are one
1f060 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e   or more outstan
1f070 64 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e 63  ding.** referenc
1f080 65 73 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e  es, the page con
1f090 74 65 6e 74 20 69 73 20 72 65 6c 6f 61 64 65 64  tent is reloaded
1f0a0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1f0b0 73 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 74  se. If the.** at
1f0c0 74 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64 20  tempt to reload 
1f0d0 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65  content from the
1f0e0 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65 71   database is req
1f0f0 75 69 72 65 64 20 61 6e 64 20 66 61 69 6c 73 2c  uired and fails,
1f100 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53   .** return an S
1f110 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1f120 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
1f130 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
1f140 63 20 69 6e 74 20 70 61 67 65 72 55 6e 64 6f 43  c int pagerUndoC
1f150 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 43  allback(void *pC
1f160 74 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a 20  tx, Pgno iPg){. 
1f170 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1f180 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
1f190 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29  ager = (Pager *)
1f1a0 70 43 74 78 3b 0a 20 20 50 67 48 64 72 20 2a 70  pCtx;.  PgHdr *p
1f1b0 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Pg;..  assert( p
1f1c0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
1f1d0 72 29 20 29 3b 0a 20 20 70 50 67 20 3d 20 73 71  r) );.  pPg = sq
1f1e0 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
1f1f0 28 70 50 61 67 65 72 2c 20 69 50 67 29 3b 0a 20  (pPager, iPg);. 
1f200 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
1f210 69 66 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  if( sqlite3Pcach
1f220 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50  ePageRefcount(pP
1f230 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  g)==1 ){.      s
1f240 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70  qlite3PcacheDrop
1f250 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
1f260 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  {.      rc = rea
1f270 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20 20  dDbPage(pPg);.  
1f280 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1f290 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f2a0 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
1f2b0 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  er(pPg);.      }
1f2c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
1f2d0 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
1f2e0 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
1f2f0 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  .  /* Normally, 
1f300 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
1f310 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   is rolled back,
1f320 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f 63   any backup proc
1f330 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20 75  esses are.  ** u
1f340 70 64 61 74 65 64 20 61 73 20 64 61 74 61 20 69  pdated as data i
1f350 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66 20  s copied out of 
1f360 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1f370 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68  rnal and into th
1f380 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  e.  ** database.
1f390 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65 6e   This is not gen
1f3a0 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20  erally possible 
1f3b0 77 69 74 68 20 61 20 57 41 4c 20 64 61 74 61 62  with a WAL datab
1f3c0 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c  ase, as.  ** rol
1f3d0 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73  lback involves s
1f3e0 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e 67  imply truncating
1f3f0 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54   the log file. T
1f400 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65  herefore, if one
1f410 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72  .  ** or more fr
1f420 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ames have alread
1f430 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
1f440 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20 74  o the log (and t
1f450 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61  herefore .  ** a
1f460 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  lso copied into 
1f470 74 68 65 20 62 61 63 6b 75 70 20 64 61 74 61 62  the backup datab
1f480 61 73 65 73 29 20 61 73 20 70 61 72 74 20 6f 66  ases) as part of
1f490 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
1f4a0 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63 6b  n,.  ** the back
1f4b0 75 70 73 20 6d 75 73 74 20 62 65 20 72 65 73 74  ups must be rest
1f4c0 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71  arted..  */.  sq
1f4d0 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61  lite3BackupResta
1f4e0 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  rt(pPager->pBack
1f4f0 75 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  up);..  return r
1f500 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1f510 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1f520 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  led to rollback 
1f530 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  a transaction on
1f540 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2e   a WAL database.
1f550 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1f560 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
1f570 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1f580 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1f590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5a0 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
1f5b0 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69   */.  PgHdr *pLi
1f5c0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1f5d0 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
1f5e0 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
1f5f0 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20  revert */..  /* 
1f600 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69 6e  For all pages in
1f610 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74 20   the cache that 
1f620 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64 69  are currently di
1f630 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72 65  rty or have alre
1f640 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72  ady.  ** been wr
1f650 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20 63  itten (but not c
1f660 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68 65  ommitted) to the
1f670 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e   log file, do on
1f680 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 66  e of the .  ** f
1f690 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20  ollowing:.  **. 
1f6a0 20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64 20   **   + Discard 
1f6b0 74 68 65 20 63 61 63 68 65 64 20 70 61 67 65 20  the cached page 
1f6c0 28 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29  (if refcount==0)
1f6d0 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65  , or.  **   + Re
1f6e0 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e  load page conten
1f6f0 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  t from the datab
1f700 61 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e 74  ase (if refcount
1f710 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  >0)..  */.  pPag
1f720 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
1f730 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
1f740 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57  .  rc = sqlite3W
1f750 61 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70  alUndo(pPager->p
1f760 57 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43 61  Wal, pagerUndoCa
1f770 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29  llback, (void *)
1f780 70 50 61 67 65 72 29 3b 0a 20 20 70 4c 69 73 74  pPager);.  pList
1f790 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
1f7a0 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
1f7b0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 77 68  ->pPCache);.  wh
1f7c0 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20 72 63  ile( pList && rc
1f7d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f7e0 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 20     PgHdr *pNext 
1f7f0 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
1f800 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 55  .    rc = pagerU
1f810 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69  ndoCallback((voi
1f820 64 20 2a 29 70 50 61 67 65 72 2c 20 70 4c 69 73  d *)pPager, pLis
1f830 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70 4c  t->pgno);.    pL
1f840 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d  ist = pNext;.  }
1f850 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1f860 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1f870 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70  ction is a wrapp
1f880 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
1f890 33 57 61 6c 46 72 61 6d 65 73 28 29 2e 20 41 73  3WalFrames(). As
1f8a0 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69 6e 67   well as logging
1f8b0 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
1f8c0 20 6f 66 20 74 68 65 20 6c 69 73 74 20 6f 66 20   of the list of 
1f8d0 70 61 67 65 73 20 68 65 61 64 65 64 20 62 79 20  pages headed by 
1f8e0 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74 65 64  pList (connected
1f8f0 20 62 79 20 70 44 69 72 74 79 29 2c 0a 2a 2a 20   by pDirty),.** 
1f900 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f  this function no
1f910 74 69 66 69 65 73 20 61 6e 79 20 61 63 74 69 76  tifies any activ
1f920 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73  e backup process
1f930 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  es that the page
1f940 73 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e 67 65  s have.** change
1f950 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 69  d. .**.** The li
1f960 73 74 20 6f 66 20 70 61 67 65 73 20 70 61 73 73  st of pages pass
1f970 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f 75  ed into this rou
1f980 74 69 6e 65 20 69 73 20 61 6c 77 61 79 73 20 73  tine is always s
1f990 6f 72 74 65 64 20 62 79 20 70 61 67 65 20 6e 75  orted by page nu
1f9a0 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  mber..** Hence, 
1f9b0 69 66 20 70 61 67 65 20 31 20 61 70 70 65 61 72  if page 1 appear
1f9c0 73 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68  s anywhere on th
1f9d0 65 20 6c 69 73 74 2c 20 69 74 20 77 69 6c 6c 20  e list, it will 
1f9e0 62 65 20 74 68 65 20 66 69 72 73 74 20 70 61 67  be the first pag
1f9f0 65 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e  e..*/ .static in
1fa00 74 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73  t pagerWalFrames
1fa10 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
1fa20 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
1fa30 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
1fa40 65 63 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ect */.  PgHdr *
1fa50 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  pList,          
1fa60 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
1fa70 20 6f 66 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f   of frames to lo
1fa80 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75  g */.  Pgno nTru
1fa90 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  ncate,          
1faa0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1fab0 73 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68  se size after th
1fac0 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69  is commit */.  i
1fad0 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20  nt isCommit     
1fae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1faf0 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
1fb00 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 29 7b  s a commit */.){
1fb10 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1fb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb30 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1fb40 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 73 74  e */.  int nList
1fb50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fb60 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1fb70 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70 4c 69   of pages in pLi
1fb80 73 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  st */.  PgHdr *p
1fb90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1fba0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1fbb0 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 61 67 65  ooping over page
1fbc0 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
1fbd0 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b 0a  pPager->pWal );.
1fbe0 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 20    assert( pList 
1fbf0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
1fc00 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69  _DEBUG.  /* Veri
1fc10 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65  fy that the page
1fc20 20 6c 69 73 74 20 69 73 20 69 6e 20 61 63 63 65   list is in acce
1fc30 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20  nding order */. 
1fc40 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 20   for(p=pList; p 
1fc50 26 26 20 70 2d 3e 70 44 69 72 74 79 3b 20 70 3d  && p->pDirty; p=
1fc60 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
1fc70 61 73 73 65 72 74 28 20 70 2d 3e 70 67 6e 6f 20  assert( p->pgno 
1fc80 3c 20 70 2d 3e 70 44 69 72 74 79 2d 3e 70 67 6e  < p->pDirty->pgn
1fc90 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  o );.  }.#endif.
1fca0 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
1fcb0 2d 3e 70 44 69 72 74 79 3d 3d 30 20 7c 7c 20 69  ->pDirty==0 || i
1fcc0 73 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 69 66 28  sCommit );.  if(
1fcd0 20 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20   isCommit ){.   
1fce0 20 2f 2a 20 49 66 20 61 20 57 41 4c 20 74 72 61   /* If a WAL tra
1fcf0 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  nsaction is bein
1fd00 67 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65  g committed, the
1fd10 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69  re is no point i
1fd20 6e 20 77 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a  n writing.    **
1fd30 20 61 6e 79 20 70 61 67 65 73 20 77 69 74 68 20   any pages with 
1fd40 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65  page numbers gre
1fd50 61 74 65 72 20 74 68 61 6e 20 6e 54 72 75 6e 63  ater than nTrunc
1fd60 61 74 65 20 69 6e 74 6f 20 74 68 65 20 57 41 4c  ate into the WAL
1fd70 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68   file..    ** Th
1fd80 65 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  ey will never be
1fd90 20 72 65 61 64 20 62 79 20 61 6e 79 20 63 6c 69   read by any cli
1fda0 65 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65 20 74  ent. So remove t
1fdb0 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 70 44 69  hem from the pDi
1fdc0 72 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73 74 20  rty.    ** list 
1fdd0 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50 67 48  here. */.    PgH
1fde0 64 72 20 2a 2a 70 70 4e 65 78 74 20 3d 20 26 70  dr **ppNext = &p
1fdf0 4c 69 73 74 3b 0a 20 20 20 20 6e 4c 69 73 74 20  List;.    nList 
1fe00 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70  = 0;.    for(p=p
1fe10 4c 69 73 74 3b 20 28 2a 70 70 4e 65 78 74 20 3d  List; (*ppNext =
1fe20 20 70 29 21 3d 30 3b 20 70 3d 70 2d 3e 70 44 69   p)!=0; p=p->pDi
1fe30 72 74 79 29 7b 0a 20 20 20 20 20 20 69 66 28 20  rty){.      if( 
1fe40 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e 63 61  p->pgno<=nTrunca
1fe50 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 70  te ){.        pp
1fe60 4e 65 78 74 20 3d 20 26 70 2d 3e 70 44 69 72 74  Next = &p->pDirt
1fe70 79 3b 0a 20 20 20 20 20 20 20 20 6e 4c 69 73 74  y;.        nList
1fe80 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
1fe90 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  }.    assert( pL
1fea0 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ist );.  }else{.
1feb0 20 20 20 20 6e 4c 69 73 74 20 3d 20 31 3b 0a 20      nList = 1;. 
1fec0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 74   }.  pPager->aSt
1fed0 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57 52  at[PAGER_STAT_WR
1fee0 49 54 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b 0a 0a  ITE] += nList;..
1fef0 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
1ff00 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72 69  o==1 ) pager_wri
1ff10 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  te_changecounter
1ff20 28 70 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d 20  (pList);.  rc = 
1ff30 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73  sqlite3WalFrames
1ff40 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a  (pPager->pWal, .
1ff50 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
1ff60 67 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e  geSize, pList, n
1ff70 54 72 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d  Truncate, isComm
1ff80 69 74 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c 53  it, pPager->walS
1ff90 79 6e 63 46 6c 61 67 73 0a 20 20 29 3b 0a 20 20  yncFlags.  );.  
1ffa0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ffb0 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 70 42 61  K && pPager->pBa
1ffc0 63 6b 75 70 20 29 7b 0a 20 20 20 20 66 6f 72 28  ckup ){.    for(
1ffd0 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d  p=pList; p; p=p-
1ffe0 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20 20  >pDirty){.      
1fff0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64  sqlite3BackupUpd
20000 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63  ate(pPager->pBac
20010 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28 75  kup, p->pgno, (u
20020 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a 20  8 *)p->pData);. 
20030 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66     }.  }..#ifdef
20040 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
20050 47 45 53 0a 20 20 70 4c 69 73 74 20 3d 20 73 71  GES.  pList = sq
20060 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
20070 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
20080 61 63 68 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70  ache);.  for(p=p
20090 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44  List; p; p=p->pD
200a0 69 72 74 79 29 7b 0a 20 20 20 20 70 61 67 65 72  irty){.    pager
200b0 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 29  _set_pagehash(p)
200c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
200d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
200e0 0a 2a 2a 20 42 65 67 69 6e 20 61 20 72 65 61 64  .** Begin a read
200f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
20100 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54  the WAL..**.** T
20110 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65 64  his routine used
20120 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 22 70   to be called "p
20130 61 67 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f 74  agerOpenSnapshot
20140 28 29 22 20 62 65 63 61 75 73 65 20 69 74 20 65  ()" because it e
20150 73 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61  ssentially.** ma
20160 6b 65 73 20 61 20 73 6e 61 70 73 68 6f 74 20 6f  kes a snapshot o
20170 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
20180 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f  t the current po
20190 69 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e 64 20  int in time and 
201a0 70 72 65 73 65 72 76 65 73 0a 2a 2a 20 74 68 61  preserves.** tha
201b0 74 20 73 6e 61 70 73 68 6f 74 20 66 6f 72 20 75  t snapshot for u
201c0 73 65 20 62 79 20 74 68 65 20 72 65 61 64 65 72  se by the reader
201d0 20 69 6e 20 73 70 69 74 65 20 6f 66 20 63 6f 6e   in spite of con
201e0 63 75 72 72 65 6e 74 6c 79 20 63 68 61 6e 67 65  currently change
201f0 73 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20 77 72  s by.** other wr
20200 69 74 65 72 73 20 6f 72 20 63 68 65 63 6b 70 6f  iters or checkpo
20210 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  inters..*/.stati
20220 63 20 69 6e 74 20 70 61 67 65 72 42 65 67 69 6e  c int pagerBegin
20230 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
20240 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
20250 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
20260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20270 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
20280 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67 65   */.  int change
20290 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
202a0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
202b0 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 72   cache must be r
202c0 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  eset */..  asser
202d0 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
202e0 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
202f0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
20300 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c  te==PAGER_OPEN |
20310 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
20320 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  ==PAGER_READER )
20330 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 57  ;..  /* sqlite3W
20340 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63  alEndReadTransac
20350 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74 20 63  tion() was not c
20360 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 70 72  alled for the pr
20370 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72 61 6e  evious.  ** tran
20380 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b 69  saction in locki
20390 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56  ng_mode=EXCLUSIV
203a0 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74 20 6e  E.  So call it n
203b0 6f 77 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20  ow.  If we.  ** 
203c0 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  are in locking_m
203d0 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20 45  ode=NORMAL and E
203e0 6e 64 52 65 61 64 28 29 20 77 61 73 20 70 72 65  ndRead() was pre
203f0 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2c 0a  viously called,.
20400 20 20 2a 2a 20 74 68 65 20 64 75 70 6c 69 63 61    ** the duplica
20410 74 65 20 63 61 6c 6c 20 69 73 20 68 61 72 6d 6c  te call is harml
20420 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ess..  */.  sqli
20430 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
20440 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
20450 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63 20 3d 20  >pWal);..  rc = 
20460 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 52  sqlite3WalBeginR
20470 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  eadTransaction(p
20480 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 63 68  Pager->pWal, &ch
20490 61 6e 67 65 64 29 3b 0a 20 20 69 66 28 20 72 63  anged);.  if( rc
204a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 63  !=SQLITE_OK || c
204b0 68 61 6e 67 65 64 20 29 7b 0a 20 20 20 20 70 61  hanged ){.    pa
204c0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
204d0 29 3b 0a 20 20 20 20 69 66 28 20 55 53 45 46 45  );.    if( USEFE
204e0 54 43 48 28 70 50 61 67 65 72 29 20 29 20 73 71  TCH(pPager) ) sq
204f0 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70  lite3OsUnfetch(p
20500 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29  Pager->fd, 0, 0)
20510 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
20520 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rc;.}.#endif../*
20530 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
20540 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70  n is called as p
20550 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
20560 69 74 69 6f 6e 20 66 72 6f 6d 20 50 41 47 45 52  ition from PAGER
20570 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50 41 47 45  _OPEN.** to PAGE
20580 52 5f 52 45 41 44 45 52 20 73 74 61 74 65 20 74  R_READER state t
20590 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
205a0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
205b0 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 6e 20  base file.** in 
205c0 70 61 67 65 73 20 28 61 73 73 75 6d 69 6e 67 20  pages (assuming 
205d0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 63 75  the page size cu
205e0 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
205f0 6e 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  n Pager.pageSize
20600 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 65  )..**.** If no e
20610 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c  rror occurs, SQL
20620 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
20630 65 64 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ed and the size 
20640 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
20650 2a 2a 20 69 6e 20 70 61 67 65 73 20 69 73 20 73  ** in pages is s
20660 74 6f 72 65 64 20 69 6e 20 2a 70 6e 50 61 67 65  tored in *pnPage
20670 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
20680 65 72 72 6f 72 20 63 6f 64 65 20 28 70 65 72 68  error code (perh
20690 61 70 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f  aps.** SQLITE_IO
206a0 45 52 52 5f 46 53 54 41 54 29 20 69 73 20 72 65  ERR_FSTAT) is re
206b0 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61  turned and *pnPa
206c0 67 65 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64  ge is left unmod
206d0 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ified..*/.static
206e0 20 69 6e 74 20 70 61 67 65 72 50 61 67 65 63 6f   int pagerPageco
206f0 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
20700 72 2c 20 50 67 6e 6f 20 2a 70 6e 50 61 67 65 29  r, Pgno *pnPage)
20710 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20  {.  Pgno nPage; 
20720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20730 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
20740 72 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61  return via *pnPa
20750 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65 72  ge */..  /* Quer
20760 79 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79  y the WAL sub-sy
20770 73 74 65 6d 20 66 6f 72 20 74 68 65 20 64 61 74  stem for the dat
20780 61 62 61 73 65 20 73 69 7a 65 2e 20 54 68 65 20  abase size. The 
20790 57 61 6c 44 62 73 69 7a 65 28 29 0a 20 20 2a 2a  WalDbsize().  **
207a0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
207b0 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 57 41  s zero if the WA
207c0 4c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 28 69  L is not open (i
207d0 2e 65 2e 20 50 61 67 65 72 2e 70 57 61 6c 3d 3d  .e. Pager.pWal==
207e0 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 69 66 20 74  0), or.  ** if t
207f0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
20800 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
20810 65 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20  e. The database 
20820 73 69 7a 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  size is not.  **
20830 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d 20   available from 
20840 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73 74  the WAL sub-syst
20850 65 6d 20 69 66 20 74 68 65 20 6c 6f 67 20 66 69  em if the log fi
20860 6c 65 20 69 73 20 65 6d 70 74 79 20 6f 72 0a 20  le is empty or. 
20870 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   ** contains no 
20880 76 61 6c 69 64 20 63 6f 6d 6d 69 74 74 65 64 20  valid committed 
20890 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20 20  transactions..  
208a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
208b0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
208c0 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73  ER_OPEN );.  ass
208d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
208e0 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck>=SHARED_LOCK 
208f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
20900 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
20910 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
20920 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ger->tempFile==0
20930 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73 71   );.  nPage = sq
20940 6c 69 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70  lite3WalDbsize(p
20950 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20  Pager->pWal);.. 
20960 20 2f 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65   /* If the numbe
20970 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
20980 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
20990 74 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d  t available from
209a0 20 74 68 65 0a 20 20 2a 2a 20 57 41 4c 20 73 75   the.  ** WAL su
209b0 62 2d 73 79 73 74 65 6d 2c 20 64 65 74 65 72 6d  b-system, determ
209c0 69 6e 65 20 74 68 65 20 70 61 67 65 20 63 6f 75  ine the page cou
209d0 6e 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  nt based on the 
209e0 73 69 7a 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65  size of.  ** the
209f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
20a00 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   If the size of 
20a10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20a20 65 20 69 73 20 6e 6f 74 20 61 6e 0a 20 20 2a 2a  e is not an.  **
20a30 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c   integer multipl
20a40 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73 69  e of the page-si
20a50 7a 65 2c 20 72 6f 75 6e 64 20 75 70 20 74 68 65  ze, round up the
20a60 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20   result..  */.  
20a70 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 26 26 20  if( nPage==0 && 
20a80 41 4c 57 41 59 53 28 69 73 4f 70 65 6e 28 70 50  ALWAYS(isOpen(pP
20a90 61 67 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20  ager->fd)) ){.  
20aa0 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20    i64 n = 0;    
20ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ac0 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62 20 66 69  /* Size of db fi
20ad0 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
20ae0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
20af0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
20b00 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20  ager->fd, &n);. 
20b10 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20b20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
20b30 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
20b40 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f     nPage = (Pgno
20b50 29 28 28 6e 2b 70 50 61 67 65 72 2d 3e 70 61 67  )((n+pPager->pag
20b60 65 53 69 7a 65 2d 31 29 20 2f 20 70 50 61 67 65  eSize-1) / pPage
20b70 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
20b80 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  }..  /* If the c
20b90 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66  urrent number of
20ba0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69   pages in the fi
20bb0 6c 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68  le is greater th
20bc0 61 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6e 66  an the.  ** conf
20bd0 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70  igured maximum p
20be0 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63  ager number, inc
20bf0 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65  rease the allowe
20c00 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20  d limit so.  ** 
20c10 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 63 61  that the file ca
20c20 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a  n be read..  */.
20c30 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67    if( nPage>pPag
20c40 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
20c50 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
20c60 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a   = (Pgno)nPage;.
20c70 20 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65 20 3d    }..  *pnPage =
20c80 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e   nPage;.  return
20c90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
20ca0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
20cb0 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43 68 65  IT_WAL./*.** Che
20cc0 63 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20  ck if the *-wal 
20cd0 66 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73  file that corres
20ce0 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61 74  ponds to the dat
20cf0 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20  abase opened by 
20d00 70 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74 73  pPager.** exists
20d10 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
20d20 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20 6f 72   is not empy, or
20d30 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
20d40 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f 65 73   *-wal file does
20d50 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20 28 62  .** not exist (b
20d60 79 20 64 65 6c 65 74 69 6e 67 20 69 74 29 20 69  y deleting it) i
20d70 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
20d80 69 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a  ile is empty..**
20d90 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
20da0 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 74 79  ase is not empty
20db0 20 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c 20 66   and the *-wal f
20dc0 69 6c 65 20 65 78 69 73 74 73 2c 20 6f 70 65 6e  ile exists, open
20dd0 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 69 6e   the pager.** in
20de0 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66 20 74   WAL mode.  If t
20df0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65  he database is e
20e00 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f 20 2a 2d  mpty or if no *-
20e10 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  wal file exists 
20e20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65 72 72  and.** if no err
20e30 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b 65 20  or occurs, make 
20e40 73 75 72 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e  sure Pager.journ
20e50 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20 73 65  alMode is not se
20e60 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f  t to.** PAGER_JO
20e70 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e 0a 2a  URNALMODE_WAL..*
20e80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
20e90 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72 72 6f  TE_OK or an erro
20ea0 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r code..**.** Th
20eb0 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 68 6f  e caller must ho
20ec0 6c 64 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ld a SHARED lock
20ed0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
20ee0 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68   file to call th
20ef0 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20  is.** function. 
20f00 42 65 63 61 75 73 65 20 61 6e 20 45 58 43 4c 55  Because an EXCLU
20f10 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
20f20 20 64 62 20 66 69 6c 65 20 69 73 20 72 65 71 75   db file is requ
20f30 69 72 65 64 20 74 6f 20 64 65 6c 65 74 65 20 0a  ired to delete .
20f40 2a 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20 6e 6f  ** a WAL on a no
20f50 6e 65 2d 65 6d 70 74 79 20 64 61 74 61 62 61 73  ne-empty databas
20f60 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20  e, this ensures 
20f70 74 68 65 72 65 20 69 73 20 6e 6f 20 72 61 63 65  there is no race
20f80 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 62   condition .** b
20f90 65 74 77 65 65 6e 20 74 68 65 20 78 41 63 63 65  etween the xAcce
20fa0 73 73 28 29 20 62 65 6c 6f 77 20 61 6e 64 20 61  ss() below and a
20fb0 6e 20 78 44 65 6c 65 74 65 28 29 20 62 65 69 6e  n xDelete() bein
20fc0 67 20 65 78 65 63 75 74 65 64 20 62 79 20 73 6f  g executed by so
20fd0 6d 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63 6f 6e  me .** other con
20fe0 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  nection..*/.stat
20ff0 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e  ic int pagerOpen
21000 57 61 6c 49 66 50 72 65 73 65 6e 74 28 50 61 67  WalIfPresent(Pag
21010 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
21020 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
21030 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
21040 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
21050 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73 73  ER_OPEN );.  ass
21060 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
21070 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck>=SHARED_LOCK 
21080 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  );..  if( !pPage
21090 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
210a0 20 20 20 69 6e 74 20 69 73 57 61 6c 3b 20 20 20     int isWal;   
210b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210c0 20 2f 2a 20 54 72 75 65 20 69 66 20 57 41 4c 20   /* True if WAL 
210d0 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20  file exists */. 
210e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
210f0 73 41 63 63 65 73 73 28 0a 20 20 20 20 20 20 20  sAccess(.       
21100 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70   pPager->pVfs, p
21110 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c  Pager->zWal, SQL
21120 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
21130 53 2c 20 26 69 73 57 61 6c 0a 20 20 20 20 29 3b  S, &isWal.    );
21140 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
21150 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21160 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20  if( isWal ){.   
21170 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b       Pgno nPage;
21180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21190 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
211a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
211b0 2a 2f 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d  */..        rc =
211c0 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
211d0 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
211e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
211f0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
21200 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
21210 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
21220 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
21230 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
21240 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20  , pPager->zWal, 
21250 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0);.        }els
21260 65 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  e{.          tes
21270 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 50 63  tcase( sqlite3Pc
21280 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50  achePagecount(pP
21290 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
212a0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  0 );.          r
212b0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
212c0 4f 70 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20  OpenWal(pPager, 
212d0 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
212e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
212f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
21300 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
21310 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20  MODE_WAL ){.    
21320 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
21330 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
21340 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
21350 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  TE;.      }.    
21360 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
21370 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  c;.}.#endif../*.
21380 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73 61 76 65  ** Playback save
21390 70 6f 69 6e 74 20 70 53 61 76 65 70 6f 69 6e 74  point pSavepoint
213a0 2e 20 4f 72 2c 20 69 66 20 70 53 61 76 65 70 6f  . Or, if pSavepo
213b0 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20  int==NULL, then 
213c0 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20  playback.** the 
213d0 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f  entire master jo
213e0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
213f0 63 61 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d  case pSavepoint=
21400 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65  =NULL occurs whe
21410 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b  n .** a ROLLBACK
21420 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69   TO command is i
21430 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53 41 56 45  nvoked on a SAVE
21440 50 4f 49 4e 54 20 74 68 61 74 20 69 73 20 61 20  POINT that is a 
21450 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
21460 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a  savepoint..**.**
21470 20 57 68 65 6e 20 70 53 61 76 65 70 6f 69 6e 74   When pSavepoint
21480 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65   is not NULL (me
21490 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e  aning a non-tran
214a0 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e  saction savepoin
214b0 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72  t is .** being r
214c0 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20 74 68 65  olled back), the
214d0 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63  n the rollback c
214e0 6f 6e 73 69 73 74 73 20 6f 66 20 75 70 20 74 6f  onsists of up to
214f0 20 74 68 72 65 65 20 73 74 61 67 65 73 2c 0a 2a   three stages,.*
21500 2a 20 70 65 72 66 6f 72 6d 65 64 20 69 6e 20 74  * performed in t
21510 68 65 20 6f 72 64 65 72 20 73 70 65 63 69 66 69  he order specifi
21520 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61  ed:.**.**   * Pa
21530 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 20 62  ges are played b
21540 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
21550 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69  n journal starti
21560 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a 20 20 20  ng at byte.**   
21570 20 20 6f 66 66 73 65 74 20 50 61 67 65 72 53 61    offset PagerSa
21580 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20  vepoint.iOffset 
21590 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74  and continuing t
215a0 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  o .**     PagerS
215b0 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
215c0 73 65 74 2c 20 6f 72 20 74 6f 20 74 68 65 20 65  set, or to the e
215d0 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  nd of the main j
215e0 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69  ournal.**     fi
215f0 6c 65 20 69 66 20 50 61 67 65 72 53 61 76 65 70  le if PagerSavep
21600 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20  oint.iHdrOffset 
21610 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20  is zero..**.**  
21620 20 2a 20 49 66 20 50 61 67 65 72 53 61 76 65 70   * If PagerSavep
21630 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20  oint.iHdrOffset 
21640 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65  is not zero, the
21650 6e 20 70 61 67 65 73 20 61 72 65 20 70 6c 61 79  n pages are play
21660 65 64 0a 2a 2a 20 20 20 20 20 62 61 63 6b 20 73  ed.**     back s
21670 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 74 68 65  tarting from the
21680 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
21690 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
216a0 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61  owing .**     Pa
216b0 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
216c0 72 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 65  rOffset to the e
216d0 6e 64 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  nd of the main j
216e0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
216f0 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65  **   * Pages are
21700 20 74 68 65 6e 20 70 6c 61 79 65 64 20 62 61 63   then played bac
21710 6b 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  k from the sub-j
21720 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61  ournal file, sta
21730 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74  rting.**     wit
21740 68 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  h the PagerSavep
21750 6f 69 6e 74 2e 69 53 75 62 52 65 63 20 61 6e 64  oint.iSubRec and
21760 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74   continuing to t
21770 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20  he end of.**    
21780 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
21790 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68  e..**.** Through
217a0 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  out the rollback
217b0 20 70 72 6f 63 65 73 73 2c 20 65 61 63 68 20 74   process, each t
217c0 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 72 6f  ime a page is ro
217d0 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a  lled back, the.*
217e0 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
217f0 62 69 74 20 69 73 20 73 65 74 20 69 6e 20 61 20  bit is set in a 
21800 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65  bitvec structure
21810 20 28 76 61 72 69 61 62 6c 65 20 70 44 6f 6e 65   (variable pDone
21820 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65   in the.** imple
21830 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29  mentation below)
21840 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74  . This is used t
21850 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 61 20  o ensure that a 
21860 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  page is only.** 
21870 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20  rolled back the 
21880 66 69 72 73 74 20 74 69 6d 65 20 69 74 20 69 73  first time it is
21890 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 6e 20   encountered in 
218a0 65 69 74 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a  either journal..
218b0 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76 65 70 6f  **.** If pSavepo
218c0 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  int is NULL, the
218d0 6e 20 70 61 67 65 73 20 61 72 65 20 6f 6e 6c 79  n pages are only
218e0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f   played back fro
218f0 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  m the main.** jo
21900 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72  urnal file. Ther
21910 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72  e is no need for
21920 20 61 20 62 69 74 76 65 63 20 69 6e 20 74 68 69   a bitvec in thi
21930 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e  s case..**.** In
21940 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 62 65   either case, be
21950 66 6f 72 65 20 70 6c 61 79 62 61 63 6b 20 63 6f  fore playback co
21960 6d 6d 65 6e 63 65 73 20 74 68 65 20 50 61 67 65  mmences the Page
21970 72 2e 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c  r.dbSize variabl
21980 65 0a 2a 2a 20 69 73 20 72 65 73 65 74 20 74 6f  e.** is reset to
21990 20 74 68 65 20 76 61 6c 75 65 20 74 68 61 74 20   the value that 
219a0 69 74 20 68 65 6c 64 20 61 74 20 74 68 65 20 73  it held at the s
219b0 74 61 72 74 20 6f 66 20 74 68 65 20 73 61 76 65  tart of the save
219c0 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72  point .** (or tr
219d0 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70  ansaction). No p
219e0 61 67 65 20 77 69 74 68 20 61 20 70 61 67 65 2d  age with a page-
219f0 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
21a00 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 0a 2a  han this value.*
21a10 2a 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b  * is played back
21a20 2e 20 49 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f  . If one is enco
21a30 75 6e 74 65 72 65 64 20 69 74 20 69 73 20 73 69  untered it is si
21a40 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f  mply skipped..*/
21a50 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
21a60 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69  rPlaybackSavepoi
21a70 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
21a80 2c 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  , PagerSavepoint
21a90 20 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20   *pSavepoint){. 
21aa0 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
21ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 66 66            /* Eff
21ac0 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74  ective size of t
21ad0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
21ae0 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66  */.  i64 iHdrOff
21af0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
21b00 20 45 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65   End of first se
21b10 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f  gment of main-jo
21b20 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f  urnal records */
21b30 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
21b40 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52  TE_OK;      /* R
21b50 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
21b60 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20  Bitvec *pDone = 
21b70 30 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76  0;       /* Bitv
21b80 65 63 20 74 6f 20 65 6e 73 75 72 65 20 70 61 67  ec to ensure pag
21b90 65 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f  es played back o
21ba0 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61  nly once */..  a
21bb0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
21bc0 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
21bd0 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OR );.  assert( 
21be0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
21bf0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
21c00 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  KED );..  /* All
21c10 6f 63 61 74 65 20 61 20 62 69 74 76 65 63 20 74  ocate a bitvec t
21c20 6f 20 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74  o use to store t
21c30 68 65 20 73 65 74 20 6f 66 20 70 61 67 65 73 20  he set of pages 
21c40 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20  rolled back */. 
21c50 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20   if( pSavepoint 
21c60 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73  ){.    pDone = s
21c70 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
21c80 74 65 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e  te(pSavepoint->n
21c90 4f 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21  Orig);.    if( !
21ca0 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72  pDone ){.      r
21cb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
21cc0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
21cd0 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
21ce0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 62   database size b
21cf0 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ack to the value
21d00 20 69 74 20 77 61 73 20 62 65 66 6f 72 65 20 74   it was before t
21d10 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20  he savepoint .  
21d20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74 65  ** being reverte
21d30 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20  d was opened..  
21d40 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
21d50 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  ize = pSavepoint
21d60 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e   ? pSavepoint->n
21d70 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e 64  Orig : pPager->d
21d80 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 70 50 61  bOrigSize;.  pPa
21d90 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
21da0 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
21db0 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20  empFile;..  if( 
21dc0 21 70 53 61 76 65 70 6f 69 6e 74 20 26 26 20 70  !pSavepoint && p
21dd0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
21de0 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
21df0 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61   pagerRollbackWa
21e00 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  l(pPager);.  }..
21e10 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d    /* Use pPager-
21e20 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74  >journalOff as t
21e30 68 65 20 65 66 66 65 63 74 69 76 65 20 73 69 7a  he effective siz
21e40 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f  e of the main ro
21e50 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
21e60 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c  nal.  The actual
21e70 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c   file might be l
21e80 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20  arger than this 
21e90 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f  in.  ** PAGER_JO
21ea0 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
21eb0 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52  TE or PAGER_JOUR
21ec0 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e  NALMODE_PERSIST.
21ed0 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20    But anything. 
21ee0 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d   ** past pPager-
21ef0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f  >journalOff is o
21f00 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e  ff-limits to us.
21f10 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50  .  */.  szJ = pP
21f20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21f30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  ;.  assert( page
21f40 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
21f50 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a  =0 || szJ==0 );.
21f60 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72  .  /* Begin by r
21f70 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f  olling back reco
21f80 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  rds from the mai
21f90 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69  n journal starti
21fa0 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72  ng at.  ** Pager
21fb0 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65  Savepoint.iOffse
21fc0 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67  t and continuing
21fd0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75   to the next jou
21fe0 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a  rnal header..  *
21ff0 2a 20 54 68 65 72 65 20 6d 69 67 68 74 20 62 65  * There might be
22000 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   records in the 
22010 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61  main journal tha
22020 74 20 68 61 76 65 20 61 20 70 61 67 65 20 6e 75  t have a page nu
22030 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65  mber.  ** greate
22040 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
22050 6e 74 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  nt database size
22060 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65   (pPager->dbSize
22070 29 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a  ) but those.  **
22080 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64   will be skipped
22090 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20   automatically. 
220a0 20 50 61 67 65 73 20 61 72 65 20 61 64 64 65 64   Pages are added
220b0 20 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65   to pDone as the
220c0 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65  y.  ** are playe
220d0 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  d back..  */.  i
220e0 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 26 26  f( pSavepoint &&
220f0 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
22100 61 67 65 72 29 20 29 7b 0a 20 20 20 20 69 48 64  ager) ){.    iHd
22110 72 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e  rOff = pSavepoin
22120 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20  t->iHdrOffset ? 
22130 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72  pSavepoint->iHdr
22140 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20  Offset : szJ;.  
22150 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
22160 6c 4f 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e  lOff = pSavepoin
22170 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20  t->iOffset;.    
22180 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
22190 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
221a0 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f  journalOff<iHdrO
221b0 66 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ff ){.      rc =
221c0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
221d0 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
221e0 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
221f0 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20  lOff, pDone, 1, 
22200 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
22210 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
22220 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65  _DONE );.  }else
22230 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
22240 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
22250 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65  }..  /* Continue
22260 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65   rolling back re
22270 63 6f 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65  cords out of the
22280 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
22290 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74  arting at.  ** t
222a0 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
222b0 20 68 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64   header seen and
222c0 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69   continuing unti
222d0 6c 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  l the effective 
222e0 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  end.  ** of the 
222f0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
22300 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20  e.  Continue to 
22310 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67  skip out-of-rang
22320 65 20 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a  e pages and.  **
22330 20 63 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67   continue adding
22340 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61   pages rolled ba
22350 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a  ck to pDone..  *
22360 2f 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  /.  while( rc==S
22370 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
22380 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73  er->journalOff<s
22390 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69  zJ ){.    u32 ii
223a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
223b0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
223c0 20 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20      u32 nJRec = 
223d0 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  0;     /* Number
223e0 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f   of Journal Reco
223f0 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64  rds */.    u32 d
22400 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72  ummy;.    rc = r
22410 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
22420 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e  ager, 0, szJ, &n
22430 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  JRec, &dummy);. 
22440 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
22450 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20  QLITE_DONE );.. 
22460 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
22470 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   "pPager->journa
22480 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
22490 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
224a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22  ger->journalOff"
224b0 0a 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20  .    ** test is 
224c0 72 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65  related to ticke
224d0 74 20 23 32 35 36 35 2e 20 20 53 65 65 20 74 68  t #2565.  See th
224e0 65 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20  e discussion in 
224f0 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  the.    ** pager
22500 5f 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63  _playback() func
22510 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f  tion for additio
22520 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
22530 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
22540 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20 20 26  nJRec==0 .     &
22550 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
22560 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
22570 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
22580 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
22590 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52      ){.      nJR
225a0 65 63 20 3d 20 28 75 33 32 29 28 28 73 7a 4a 20  ec = (u32)((szJ 
225b0 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
225c0 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47  lOff)/JOURNAL_PG
225d0 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
225e0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30    }.    for(ii=0
225f0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
22600 26 26 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70  && ii<nJRec && p
22610 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
22620 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20  f<szJ; ii++){.  
22630 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
22640 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
22650 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
22660 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44  ->journalOff, pD
22670 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  one, 1, 1);.    
22680 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
22690 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
226a0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72  .  }.  assert( r
226b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
226c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
226d0 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a  ff>=szJ );..  /*
226e0 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62   Finally,  rollb
226f0 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74  ack pages from t
22700 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
22710 20 50 61 67 65 20 74 68 61 74 20 77 65 72 65 0a   Page that were.
22720 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20    ** previously 
22730 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20  rolled back out 
22740 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
22750 6e 61 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e  nal (and are hen
22760 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a  ce in pDone).  *
22770 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65  * will be skippe
22780 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65  d.  Out-of-range
22790 20 70 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20   pages are also 
227a0 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
227b0 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29  if( pSavepoint )
227c0 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20  {.    u32 ii;   
227d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
227e0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
227f0 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36  i64 offset = (i6
22800 34 29 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53  4)pSavepoint->iS
22810 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
22820 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20  >pageSize);..   
22830 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
22840 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
22850 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
22860 6c 53 61 76 65 70 6f 69 6e 74 55 6e 64 6f 28 70  lSavepointUndo(p
22870 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70 53 61  Pager->pWal, pSa
22880 76 65 70 6f 69 6e 74 2d 3e 61 57 61 6c 44 61 74  vepoint->aWalDat
22890 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  a);.    }.    fo
228a0 72 28 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d  r(ii=pSavepoint-
228b0 3e 69 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51  >iSubRec; rc==SQ
228c0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50  LITE_OK && ii<pP
228d0 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69  ager->nSubRec; i
228e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
228f0 72 74 28 20 6f 66 66 73 65 74 3d 3d 28 69 36 34  rt( offset==(i64
22900 29 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  )ii*(4+pPager->p
22910 61 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20  ageSize) );.    
22920 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
22930 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
22940 50 61 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20  Pager, &offset, 
22950 70 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20  pDone, 0, 1);.  
22960 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
22970 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
22980 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
22990 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
229a0 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  Done);.  if( rc=
229b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
229c0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
229d0 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a  lOff = szJ;.  }.
229e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
229f0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
22a00 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
22a10 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
22a20 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c  ges that are all
22a30 6f 77 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 61  owed.** before a
22a40 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 65 63  ttempting to rec
22a50 79 63 6c 65 20 63 6c 65 61 6e 20 61 6e 64 20 75  ycle clean and u
22a60 6e 75 73 65 64 20 70 61 67 65 73 2e 0a 2a 2f 0a  nused pages..*/.
22a70 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
22a80 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61  rSetCachesize(Pa
22a90 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
22aa0 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69   mxPage){.  sqli
22ab0 74 65 33 50 63 61 63 68 65 53 65 74 43 61 63 68  te3PcacheSetCach
22ac0 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  esize(pPager->pP
22ad0 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a  Cache, mxPage);.
22ae0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
22af0 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
22b00 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
22b10 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61  pages that are a
22b20 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65 66 6f 72 65  llowed.** before
22b30 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 73   attempting to s
22b40 70 69 6c 6c 20 70 61 67 65 73 20 74 6f 20 6a 6f  pill pages to jo
22b50 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urnal..*/.int sq
22b60 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 70 69  lite3PagerSetSpi
22b70 6c 6c 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  llsize(Pager *pP
22b80 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
22b90 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
22ba0 74 65 33 50 63 61 63 68 65 53 65 74 53 70 69 6c  te3PcacheSetSpil
22bb0 6c 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  lsize(pPager->pP
22bc0 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a  Cache, mxPage);.
22bd0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
22be0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41  SQLITE_FCNTL_MMA
22bf0 50 5f 53 49 5a 45 20 62 61 73 65 64 20 6f 6e 20  P_SIZE based on 
22c00 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
22c10 65 20 6f 66 20 73 7a 4d 6d 61 70 2e 0a 2a 2f 0a  e of szMmap..*/.
22c20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
22c30 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 50 61 67  rFixMaplimit(Pag
22c40 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66  er *pPager){.#if
22c50 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
22c60 5f 53 49 5a 45 3e 30 0a 20 20 73 71 6c 69 74 65  _SIZE>0.  sqlite
22c70 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61  3_file *fd = pPa
22c80 67 65 72 2d 3e 66 64 3b 0a 20 20 69 66 28 20 69  ger->fd;.  if( i
22c90 73 4f 70 65 6e 28 66 64 29 20 26 26 20 66 64 2d  sOpen(fd) && fd-
22ca0 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73  >pMethods->iVers
22cb0 69 6f 6e 3e 3d 33 20 29 7b 0a 20 20 20 20 73 71  ion>=3 ){.    sq
22cc0 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a  lite3_int64 sz;.
22cd0 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65 72 2d      sz = pPager-
22ce0 3e 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 70 50 61  >szMmap;.    pPa
22cf0 67 65 72 2d 3e 62 55 73 65 46 65 74 63 68 20 3d  ger->bUseFetch =
22d00 20 28 73 7a 3e 30 29 3b 0a 20 20 20 20 73 65 74   (sz>0);.    set
22d10 47 65 74 74 65 72 4d 65 74 68 6f 64 28 70 50 61  GetterMethod(pPa
22d20 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ger);.    sqlite
22d30 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69  3OsFileControlHi
22d40 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  nt(pPager->fd, S
22d50 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50  QLITE_FCNTL_MMAP
22d60 5f 53 49 5a 45 2c 20 26 73 7a 29 3b 0a 20 20 7d  _SIZE, &sz);.  }
22d70 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
22d80 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   Change the maxi
22d90 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20  mum size of any 
22da0 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d  memory mapping m
22db0 61 64 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ade of the datab
22dc0 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69  ase file..*/.voi
22dd0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
22de0 74 4d 6d 61 70 4c 69 6d 69 74 28 50 61 67 65 72  tMmapLimit(Pager
22df0 20 2a 70 50 61 67 65 72 2c 20 73 71 6c 69 74 65   *pPager, sqlite
22e00 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b  3_int64 szMmap){
22e10 0a 20 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61  .  pPager->szMma
22e20 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 70 61  p = szMmap;.  pa
22e30 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70  gerFixMaplimit(p
22e40 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
22e50 20 46 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65   Free as much me
22e60 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65  mory as possible
22e70 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e   from the pager.
22e80 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22e90 50 61 67 65 72 53 68 72 69 6e 6b 28 50 61 67 65  PagerShrink(Page
22ea0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71  r *pPager){.  sq
22eb0 6c 69 74 65 33 50 63 61 63 68 65 53 68 72 69 6e  lite3PcacheShrin
22ec0 6b 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  k(pPager->pPCach
22ed0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a  e);.}../*.** Adj
22ee0 75 73 74 20 73 65 74 74 69 6e 67 73 20 6f 66 20  ust settings of 
22ef0 74 68 65 20 70 61 67 65 72 20 74 6f 20 74 68 6f  the pager to tho
22f00 73 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  se specified in 
22f10 74 68 65 20 70 67 46 6c 61 67 73 20 70 61 72 61  the pgFlags para
22f20 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  meter..**.** The
22f30 20 22 6c 65 76 65 6c 22 20 69 6e 20 70 67 46 6c   "level" in pgFl
22f40 61 67 73 20 26 20 50 41 47 45 52 5f 53 59 4e 43  ags & PAGER_SYNC
22f50 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 20 73 65 74  HRONOUS_MASK set
22f60 73 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73  s the robustness
22f70 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62  .** of the datab
22f80 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75  ase to damage du
22f90 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20  e to OS crashes 
22fa0 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
22fb0 73 20 62 79 0a 2a 2a 20 63 68 61 6e 67 69 6e 67  s by.** changing
22fc0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
22fd0 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69  yncs()s when wri
22fe0 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
22ff0 73 2e 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  s..** There are 
23000 66 6f 75 72 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a  four levels:.**.
23010 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20  **    OFF       
23020 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20  sqlite3OsSync() 
23030 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e  is never called.
23040 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65    This is the de
23050 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20  fault.**        
23060 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72        for tempor
23070 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e  ary and transien
23080 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  t files..**.**  
23090 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20    NORMAL    The 
230a0 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
230b0 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72  d once before wr
230c0 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
230d0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
230e0 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69    database.  Thi
230f0 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64  s is normally ad
23100 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f  equate protectio
23110 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20  n, but.**       
23120 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65         it is the
23130 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69  oretically possi
23140 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79  ble, though very
23150 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20   unlikely,.**   
23160 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20             that 
23170 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f  an inopertune po
23180 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
23190 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72  d leave the jour
231a0 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  nal.**          
231b0 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77      in a state w
231c0 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65  hich would cause
231d0 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
231e0 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20  atabase.**      
231f0 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20          when it 
23200 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
23210 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20  **.**    FULL   
23220 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
23230 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62  s synced twice b
23240 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
23250 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
23260 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
23270 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64  se (with some ad
23280 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
23290 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20  tion - the nRec 
232a0 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20  field.**        
232b0 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75        of the jou
232c0 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65  rnal header - be
232d0 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62  ing written in b
232e0 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a  etween the two.*
232f0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
23300 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73  yncs).  If we as
23310 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e  sume that writin
23320 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  g a.**          
23330 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20      single disk 
23340 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63  sector is atomic
23350 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65  , then this mode
23360 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20   provides.**    
23370 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61            assura
23380 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  nce that the jou
23390 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rnal will not be
233a0 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68   corrupted to th
233b0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
233c0 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69    point of causi
233d0 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65  ng damage to the
233e0 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67   database during
233f0 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
23400 20 20 20 20 45 58 54 52 41 20 20 20 20 20 54 68      EXTRA     Th
23410 69 73 20 69 73 20 6c 69 6b 65 20 46 55 4c 4c 20  is is like FULL 
23420 65 78 63 65 70 74 20 74 68 61 74 20 69 73 20 61  except that is a
23430 6c 73 6f 20 73 79 6e 63 73 20 74 68 65 20 64 69  lso syncs the di
23440 72 65 63 74 6f 72 79 0a 2a 2a 20 20 20 20 20 20  rectory.**      
23450 20 20 20 20 20 20 20 20 74 68 61 74 20 63 6f 6e          that con
23460 74 61 69 6e 73 20 74 68 65 20 72 6f 6c 6c 62 61  tains the rollba
23470 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 66 74 65 72  ck journal after
23480 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a   the rollback.**
23490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f                jo
234a0 75 72 6e 61 6c 20 69 73 20 75 6e 6c 69 6e 6b 65  urnal is unlinke
234b0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f  d..**.** The abo
234c0 76 65 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c  ve is for a roll
234d0 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64  back-journal mod
234e0 65 2e 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65  e.  For WAL mode
234f0 2c 20 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a  , OFF continues.
23500 2a 2a 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20  ** to mean that 
23510 6e 6f 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63  no syncs ever oc
23520 63 75 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61  cur.  NORMAL mea
23530 6e 73 20 74 68 61 74 20 74 68 65 20 57 41 4c 20  ns that the WAL 
23540 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69  is synced.** pri
23550 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
23560 6f 66 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e  of checkpoint an
23570 64 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  d that the datab
23580 61 73 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63  ase file is sync
23590 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e  ed.** at the con
235a0 63 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63  clusion of the c
235b0 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65  heckpoint if the
235c0 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20   entire content 
235d0 6f 66 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61  of the WAL.** wa
235e0 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69  s written back i
235f0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
23600 2e 20 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f  .  But no sync o
23610 70 65 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20  perations occur 
23620 66 6f 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61  for.** an ordina
23630 72 79 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52  ry commit in NOR
23640 4d 41 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41  MAL mode with WA
23650 4c 2e 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74  L.  FULL means t
23660 68 61 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66  hat the WAL.** f
23670 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f  ile is synced fo
23680 6c 6c 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d  llowing each com
23690 6d 69 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69  mit operation, i
236a0 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68  n addition to th
236b0 65 0a 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63  e.** syncs assoc
236c0 69 61 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41  iated with NORMA
236d0 4c 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  L.  There is no 
236e0 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
236f0 65 6e 20 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 45  en FULL.** and E
23700 58 54 52 41 20 66 6f 72 20 57 41 4c 20 6d 6f 64  XTRA for WAL mod
23710 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20  e..**.** Do not 
23720 63 6f 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e  confuse synchron
23730 6f 75 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51  ous=FULL with SQ
23740 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20  LITE_SYNC_FULL. 
23750 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53   The.** SQLITE_S
23760 59 4e 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d  YNC_FULL macro m
23770 65 61 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20  eans to use the 
23780 4d 61 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c  MacOSX-style ful
23790 6c 2d 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67  l-fsync.** using
237a0 20 66 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59   fcntl(F_FULLFSY
237b0 4e 43 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e  NC).  SQLITE_SYN
237c0 43 5f 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74  C_NORMAL means t
237d0 6f 20 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e  o do an.** ordin
237e0 61 72 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c  ary fsync() call
237f0 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64  .  There is no d
23800 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
23810 6e 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  n SQLITE_SYNC_FU
23820 4c 4c 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45  LL.** and SQLITE
23830 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20  _SYNC_NORMAL on 
23840 70 6c 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20  platforms other 
23850 74 68 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75  than MacOSX.  Bu
23860 74 20 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f  t the.** synchro
23870 6e 6f 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73  nous=FULL versus
23880 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52   synchronous=NOR
23890 4d 41 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65  MAL setting dete
238a0 72 6d 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74  rmines when.** t
238b0 68 65 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69  he xSync primiti
238c0 76 65 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64  ve is called and
238d0 20 69 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20   is relevant to 
238e0 61 6c 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a  all platforms..*
238f0 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c  *.** Numeric val
23900 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ues associated w
23910 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73  ith these states
23920 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52   are OFF==1, NOR
23930 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55  MAL=2,.** and FU
23940 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  LL=3..*/.#ifndef
23950 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
23960 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20  ER_PRAGMAS.void 
23970 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46  sqlite3PagerSetF
23980 6c 61 67 73 28 0a 20 20 50 61 67 65 72 20 2a 70  lags(.  Pager *p
23990 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a  Pager,        /*
239a0 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 73 65   The pager to se
239b0 74 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 66  t safety level f
239c0 6f 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  or */.  unsigned
239d0 20 70 67 46 6c 61 67 73 20 20 20 20 20 20 2f 2a   pgFlags      /*
239e0 20 56 61 72 69 6f 75 73 20 66 6c 61 67 73 20 2a   Various flags *
239f0 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
23a00 6c 65 76 65 6c 20 3d 20 70 67 46 6c 61 67 73 20  level = pgFlags 
23a10 26 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e  & PAGER_SYNCHRON
23a20 4f 55 53 5f 4d 41 53 4b 3b 0a 20 20 69 66 28 20  OUS_MASK;.  if( 
23a30 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
23a40 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
23a50 6e 6f 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  noSync = 1;.    
23a60 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
23a70 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
23a80 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 30 3b  ->extraSync = 0;
23a90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
23aa0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20  ager->noSync =  
23ab0 6c 65 76 65 6c 3d 3d 50 41 47 45 52 5f 53 59 4e  level==PAGER_SYN
23ac0 43 48 52 4f 4e 4f 55 53 5f 4f 46 46 20 3f 31 3a  CHRONOUS_OFF ?1:
23ad0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66  0;.    pPager->f
23ae0 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3e  ullSync = level>
23af0 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f  =PAGER_SYNCHRONO
23b00 55 53 5f 46 55 4c 4c 20 3f 31 3a 30 3b 0a 20 20  US_FULL ?1:0;.  
23b10 20 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53    pPager->extraS
23b20 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 50 41 47  ync = level==PAG
23b30 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 45  ER_SYNCHRONOUS_E
23b40 58 54 52 41 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20  XTRA ?1:0;.  }. 
23b50 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
23b60 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ync ){.    pPage
23b70 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 30  r->syncFlags = 0
23b80 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 67  ;.  }else if( pg
23b90 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 46 55  Flags & PAGER_FU
23ba0 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20 20 20 70  LLFSYNC ){.    p
23bb0 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
23bc0 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46   = SQLITE_SYNC_F
23bd0 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ULL;.  }else{.  
23be0 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c    pPager->syncFl
23bf0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
23c00 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20  C_NORMAL;.  }.  
23c10 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
23c20 6c 61 67 73 20 3d 20 28 70 50 61 67 65 72 2d 3e  lags = (pPager->
23c30 73 79 6e 63 46 6c 61 67 73 3c 3c 32 29 3b 0a 20  syncFlags<<2);. 
23c40 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
23c50 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  lSync ){.    pPa
23c60 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67  ger->walSyncFlag
23c70 73 20 7c 3d 20 70 50 61 67 65 72 2d 3e 73 79 6e  s |= pPager->syn
23c80 63 46 6c 61 67 73 3b 0a 20 20 7d 0a 20 20 69 66  cFlags;.  }.  if
23c90 28 20 28 70 67 46 6c 61 67 73 20 26 20 50 41 47  ( (pgFlags & PAG
23ca0 45 52 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e  ER_CKPT_FULLFSYN
23cb0 43 29 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  C) && !pPager->n
23cc0 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  oSync ){.    pPa
23cd0 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67  ger->walSyncFlag
23ce0 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 53 59 4e  s |= (SQLITE_SYN
23cf0 43 5f 46 55 4c 4c 3c 3c 32 29 3b 0a 20 20 7d 0a  C_FULL<<2);.  }.
23d00 20 20 69 66 28 20 70 67 46 6c 61 67 73 20 26 20    if( pgFlags & 
23d10 50 41 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c  PAGER_CACHESPILL
23d20 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
23d30 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53  doNotSpill &= ~S
23d40 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20  PILLFLAG_OFF;.  
23d50 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
23d60 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d  r->doNotSpill |=
23d70 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a   SPILLFLAG_OFF;.
23d80 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
23d90 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
23da0 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
23db0 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  e is incremented
23dc0 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69   whenever the li
23dd0 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74  brary.** attempt
23de0 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  s to open a temp
23df0 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69  orary file.  Thi
23e00 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
23e10 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   used for.** tes
23e20 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
23e30 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66  s only.  .*/.#if
23e40 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
23e50 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
23e60 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  temp_count = 0;.
23e70 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70  #endif../*.** Op
23e80 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
23e90 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  ile..**.** Write
23ea0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
23eb0 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65  ptor into *pFile
23ec0 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
23ed0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a  OK on success .*
23ee0 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
23ef0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
23f00 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69   fail. The OS wi
23f10 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
23f20 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20   .** delete the 
23f30 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77  temporary file w
23f40 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
23f50 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
23f60 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
23f70 56 46 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28  VFS layer xOpen(
23f80 29 20 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65  ) call are those
23f90 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79   specified.** by
23fa0 20 70 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c   parameter vfsFl
23fb0 61 67 73 20 4f 52 65 64 20 77 69 74 68 20 74 68  ags ORed with th
23fc0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
23fd0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
23fe0 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20  EN_READWRITE.** 
23ff0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
24000 43 52 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51  CREATE.**     SQ
24010 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
24020 49 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  IVE.**     SQLIT
24030 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
24040 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LOSE.*/.static i
24050 6e 74 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70  nt pagerOpentemp
24060 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
24070 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  r,        /* The
24080 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   pager object */
24090 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
240a0 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74  *pFile,  /* Writ
240b0 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
240c0 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20  iptor here */.  
240d0 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20  int vfsFlags    
240e0 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
240f0 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
24100 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20   the VFS */.){. 
24110 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
24120 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
24130 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66   code */..#ifdef
24140 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
24150 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
24160 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65  count++;  /* Use
24170 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
24180 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20  d analysis only 
24190 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73  */.#endif..  vfs
241a0 46 6c 61 67 73 20 7c 3d 20 20 0a 23 69 66 20 53  Flags |=  .#if S
241b0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54  QLITE_ENABLE_DAT
241c0 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20  A_PROTECTION.   
241d0 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
241e0 2d 3e 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54  ->vfsFlags&SQLIT
241f0 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54 45  E_OPEN_FILEPROTE
24200 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e  CTION_MASK)|.#en
24210 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20  dif.            
24220 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
24230 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
24240 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20  PEN_CREATE |.   
24250 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
24260 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c  OPEN_EXCLUSIVE |
24270 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
24280 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63  ETEONCLOSE;.  rc
24290 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
242a0 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30  (pPager->pVfs, 0
242b0 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67  , pFile, vfsFlag
242c0 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  s, 0);.  assert(
242d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
242e0 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20  | isOpen(pFile) 
242f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
24300 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
24310 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75   busy handler fu
24320 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  nction..**.** Th
24330 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20  e pager invokes 
24340 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
24350 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   if sqlite3OsLoc
24360 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  k() returns .** 
24370 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e  SQLITE_BUSY when
24380 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61   trying to upgra
24390 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20  de from no-lock 
243a0 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  to a SHARED lock
243b0 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79  ,.** or when try
243c0 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66  ing to upgrade f
243d0 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c  rom a RESERVED l
243e0 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  ock to an EXCLUS
243f0 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74  IVE .** lock. It
24400 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f   does *not* invo
24410 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
24420 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69  ler when upgradi
24430 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45  ng from.** SHARE
24440 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f  D to RESERVED, o
24450 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  r when upgrading
24460 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20   from SHARED to 
24470 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68  EXCLUSIVE.** (wh
24480 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ich occurs durin
24490 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  g hot-journal ro
244a0 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79  llback). Summary
244b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69  :.**.**   Transi
244c0 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
244d0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e              | In
244e0 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c  vokes xBusyHandl
244f0 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  er.**   --------
24500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24530 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20  .**   NO_LOCK   
24540 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f      -> SHARED_LO
24550 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a  CK      | Yes.**
24560 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20     SHARED_LOCK  
24570 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43   -> RESERVED_LOC
24580 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53  K    | No.**   S
24590 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20  HARED_LOCK   -> 
245a0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20  EXCLUSIVE_LOCK  
245b0 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52   | No.**   RESER
245c0 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c  VED_LOCK -> EXCL
245d0 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59  USIVE_LOCK   | Y
245e0 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  es.**.** If the 
245f0 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
24600 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f  lback returns no
24610 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b  n-zero, the lock
24620 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e   is .** retried.
24630 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a   If it returns z
24640 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51  ero, then the SQ
24650 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20  LITE_BUSY error 
24660 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74  is.** returned t
24670 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20  o the caller of 
24680 74 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75  the pager API fu
24690 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nction..*/.void 
246a0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
246b0 75 73 79 48 61 6e 64 6c 65 72 28 0a 20 20 50 61  usyHandler(.  Pa
246c0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
246d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246e0 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
246f0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42  ct */.  int (*xB
24700 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64  usyHandler)(void
24710 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20   *),         /* 
24720 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d  Pointer to busy-
24730 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
24740 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73   */.  void *pBus
24750 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20  yHandlerArg     
24760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
24770 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74  gument to pass t
24780 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  o xBusyHandler *
24790 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 2a 61 70  /.){.  void **ap
247a0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73  ;.  pPager->xBus
247b0 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79  yHandler = xBusy
247c0 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65  Handler;.  pPage
247d0 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
247e0 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65  rg = pBusyHandle
247f0 72 41 72 67 3b 0a 20 20 61 70 20 3d 20 28 76 6f  rArg;.  ap = (vo
24800 69 64 20 2a 2a 29 26 70 50 61 67 65 72 2d 3e 78  id **)&pPager->x
24810 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 61  BusyHandler;.  a
24820 73 73 65 72 74 28 20 28 28 69 6e 74 28 2a 29 28  ssert( ((int(*)(
24830 76 6f 69 64 20 2a 29 29 28 61 70 5b 30 5d 29 29  void *))(ap[0]))
24840 3d 3d 78 42 75 73 79 48 61 6e 64 6c 65 72 20 29  ==xBusyHandler )
24850 3b 0a 20 20 61 73 73 65 72 74 28 20 61 70 5b 31  ;.  assert( ap[1
24860 5d 3d 3d 70 42 75 73 79 48 61 6e 64 6c 65 72 41  ]==pBusyHandlerA
24870 72 67 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  rg );.  sqlite3O
24880 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
24890 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
248a0 49 54 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48 41  ITE_FCNTL_BUSYHA
248b0 4e 44 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29 61  NDLER, (void *)a
248c0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  p);.}../*.** Cha
248d0 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69 7a  nge the page siz
248e0 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50 61  e used by the Pa
248f0 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20  ger object. The 
24900 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a  new page size .*
24910 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a  * is passed in *
24920 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
24930 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
24940 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
24950 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
24960 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
24970 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  , it.** is a no-
24980 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65  op. The value re
24990 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65 72  turned is the er
249a0 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
249b0 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f  code (i.e. .** o
249c0 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45  ne of SQLITE_IOE
249d0 52 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f  RR, an SQLITE_IO
249e0 45 52 52 5f 78 78 78 20 73 75 62 2d 63 6f 64 65  ERR_xxx sub-code
249f0 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29   or SQLITE_FULL)
24a00 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
24a10 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  e, if all of the
24a20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
24a30 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74  rue:.**.**   * t
24a40 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65  he new page size
24a50 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67   (value of *pPag
24a60 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20  eSize) is valid 
24a70 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20  (a power .**    
24a80 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20   of two between 
24a90 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d  512 and SQLITE_M
24aa0 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e  AX_PAGE_SIZE, in
24ab0 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a  clusive), and.**
24ac0 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72  .**   * there ar
24ad0 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
24ae0 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73   page references
24af0 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  , and.**.**   * 
24b00 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
24b10 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e  either not an in
24b20 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
24b30 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20   or it is.**    
24b40 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
24b50 74 61 62 61 73 65 20 74 68 61 74 20 63 75 72 72  tabase that curr
24b60 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f  ently consists o
24b70 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a  f zero pages..**
24b80 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67  .** then the pag
24b90 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73  er object page s
24ba0 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70  ize is set to *p
24bb0 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  PageSize..**.** 
24bc0 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  If the page size
24bd0 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65   is changed, the
24be0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
24bf0 75 73 65 73 20 73 71 6c 69 74 65 33 50 61 67 65  uses sqlite3Page
24c00 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f  rMalloc() .** to
24c10 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61   obtain a new Pa
24c20 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75  ger.pTmpSpace bu
24c30 66 66 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c  ffer. If this al
24c40 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74  location attempt
24c50 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49   .** fails, SQLI
24c60 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
24c70 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67  rned and the pag
24c80 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75  e size remains u
24c90 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e  nchanged. .** In
24ca0 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73   all other cases
24cb0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
24cc0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
24cd0 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
24ce0 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20  is not changed, 
24cf0 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 6f  either because o
24d00 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72  ne of the enumer
24d10 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f  ated.** conditio
24d20 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20  ns above is not 
24d30 74 72 75 65 2c 20 74 68 65 20 70 61 67 65 72 20  true, the pager 
24d40 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61  was in error sta
24d50 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20  te when this.** 
24d60 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
24d70 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20  led, or because 
24d80 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
24d90 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61  ation attempt fa
24da0 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a  iled, .** then *
24db0 70 50 61 67 65 53 69 7a 65 20 69 73 20 73 65 74  pPageSize is set
24dc0 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74   to the old, ret
24dd0 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20  ained page size 
24de0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
24df0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24e00 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
24e10 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
24e20 75 33 32 20 2a 70 50 61 67 65 53 69 7a 65 2c 20  u32 *pPageSize, 
24e30 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20  int nReserve){. 
24e40 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
24e50 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73  _OK;..  /* It is
24e60 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
24e70 20 64 6f 20 61 20 66 75 6c 6c 20 61 73 73 65 72   do a full asser
24e80 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20  t_pager_state() 
24e90 68 65 72 65 2c 20 61 73 20 74 68 69 73 0a 20 20  here, as this.  
24ea0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  ** function may 
24eb0 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77  be called from w
24ec0 69 74 68 69 6e 20 50 61 67 65 72 4f 70 65 6e 28  ithin PagerOpen(
24ed0 29 2c 20 62 65 66 6f 72 65 20 74 68 65 20 73 74  ), before the st
24ee0 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ate.  ** of the 
24ef0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20  Pager object is 
24f00 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69  internally consi
24f10 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  stent..  **.  **
24f20 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68   At one point th
24f30 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
24f40 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66  rned an error if
24f50 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
24f60 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45 52  n .  ** PAGER_ER
24f70 52 4f 52 20 73 74 61 74 65 2e 20 42 75 74 20 73  ROR state. But s
24f80 69 6e 63 65 20 50 41 47 45 52 5f 45 52 52 4f 52  ince PAGER_ERROR
24f90 20 73 74 61 74 65 20 67 75 61 72 61 6e 74 65 65   state guarantee
24fa0 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 72  s that.  ** ther
24fb0 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  e is at least on
24fc0 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  e outstanding pa
24fd0 67 65 20 72 65 66 65 72 65 6e 63 65 2c 20 74 68  ge reference, th
24fe0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  is function.  **
24ff0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
25000 74 68 61 74 20 63 61 73 65 20 61 6e 79 68 6f 77  that case anyhow
25010 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70 61  ..  */..  u32 pa
25020 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53  geSize = *pPageS
25030 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ize;.  assert( p
25040 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70  ageSize==0 || (p
25050 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
25060 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
25070 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20  _MAX_PAGE_SIZE) 
25080 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65 72  );.  if( (pPager
25090 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50  ->memDb==0 || pP
250a0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29  ager->dbSize==0)
250b0 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63  .   && sqlite3Pc
250c0 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
250d0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
250e0 20 0a 20 20 20 26 26 20 70 61 67 65 53 69 7a 65   .   && pageSize
250f0 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 28 75   && pageSize!=(u
25100 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  32)pPager->pageS
25110 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20 63 68  ize .  ){.    ch
25120 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b  ar *pNew = NULL;
25130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25140 4e 65 77 20 74 65 6d 70 20 73 70 61 63 65 20 2a  New temp space *
25150 2f 0a 20 20 20 20 69 36 34 20 6e 42 79 74 65 20  /.    i64 nByte 
25160 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 50  = 0;..    if( pP
25170 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47  ager->eState>PAG
25180 45 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70 65  ER_OPEN && isOpe
25190 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
251a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
251b0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
251c0 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74 65  ager->fd, &nByte
251d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
251e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
251f0 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28  {.      pNew = (
25200 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61  char *)sqlite3Pa
25210 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a  geMalloc(pageSiz
25220 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  e);.      if( !p
25230 4e 65 77 20 29 20 72 63 20 3d 20 53 51 4c 49 54  New ) rc = SQLIT
25240 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
25250 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
25260 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25270 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
25280 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72  pPager);.      r
25290 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  c = sqlite3Pcach
252a0 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 50 61  eSetPageSize(pPa
252b0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
252c0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
252d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
252e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
252f0 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50  lite3PageFree(pP
25300 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29  ager->pTmpSpace)
25310 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
25320 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77  pTmpSpace = pNew
25330 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
25340 64 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f 29 28  dbSize = (Pgno)(
25350 28 6e 42 79 74 65 2b 70 61 67 65 53 69 7a 65 2d  (nByte+pageSize-
25360 31 29 2f 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  1)/pageSize);.  
25370 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
25380 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
25390 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
253a0 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
253b0 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 7d 0a 20  e(pNew);.    }. 
253c0 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53 69 7a 65   }..  *pPageSize
253d0 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
253e0 69 7a 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ize;.  if( rc==S
253f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25400 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
25410 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50 61 67   nReserve = pPag
25420 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20  er->nReserve;.  
25430 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
25440 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76  ve>=0 && nReserv
25450 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 70 50  e<1000 );.    pP
25460 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d  ager->nReserve =
25470 20 28 69 31 36 29 6e 52 65 73 65 72 76 65 3b 0a   (i16)nReserve;.
25480 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53      pagerReportS
25490 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ize(pPager);.   
254a0 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69   pagerFixMaplimi
254b0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  t(pPager);.  }. 
254c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
254d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
254e0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74 65  inter to the "te
254f0 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20 62 75  mporary page" bu
25500 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e  ffer held intern
25510 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70  ally.** by the p
25520 61 67 65 72 2e 20 20 54 68 69 73 20 69 73 20 61  ager.  This is a
25530 20 62 75 66 66 65 72 20 74 68 61 74 20 69 73 20   buffer that is 
25540 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  big enough to ho
25550 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65  ld the.** entire
25560 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61   content of a da
25570 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 54 68  tabase page.  Th
25580 69 73 20 62 75 66 66 65 72 20 69 73 20 75 73 65  is buffer is use
25590 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  d internally.** 
255a0 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
255b0 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72  and will be over
255c0 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72  written whenever
255d0 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f   a rollback.** o
255e0 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65  ccurs.  But othe
255f0 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72  r modules are fr
25600 65 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f  ee to use it too
25610 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20  , as long as.** 
25620 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65  no rollbacks are
25630 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76   happening..*/.v
25640 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
25650 72 54 65 6d 70 53 70 61 63 65 28 50 61 67 65 72  rTempSpace(Pager
25660 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
25670 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  urn pPager->pTmp
25680 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Space;.}../*.** 
25690 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74  Attempt to set t
256a0 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62  he maximum datab
256b0 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69  ase page count i
256c0 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69  f mxPage is posi
256d0 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e  tive. .** Make n
256e0 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50  o changes if mxP
256f0 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e  age is zero or n
25700 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65  egative.  And ne
25710 76 65 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a  ver reduce the.*
25720 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  * maximum page c
25730 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63  ount below the c
25740 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
25750 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
25760 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  ** Regardless of
25770 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20   mxPage, return 
25780 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69  the current maxi
25790 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  mum page count..
257a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
257b0 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  gerMaxPageCount(
257c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
257d0 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66  nt mxPage){.  if
257e0 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20  ( mxPage>0 ){.  
257f0 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
25800 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20   = mxPage;.  }. 
25810 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25820 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
25830 50 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a 20 43  PEN );      /* C
25840 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20 4f 50  alled only by OP
25850 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20 20 61  _MaxPgcnt */.  a
25860 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d  ssert( pPager->m
25870 78 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e 64  xPgno>=pPager->d
25880 62 53 69 7a 65 20 29 3b 20 20 2f 2a 20 4f 50 5f  bSize );  /* OP_
25890 4d 61 78 50 67 63 6e 74 20 65 6e 66 6f 72 63 65  MaxPgcnt enforce
258a0 73 20 74 68 69 73 20 2a 2f 0a 20 20 72 65 74 75  s this */.  retu
258b0 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  rn pPager->mxPgn
258c0 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  o;.}../*.** The 
258d0 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66  following set of
258e0 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
258f0 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  ed to disable th
25900 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49  e simulated.** I
25910 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69  /O error mechani
25920 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69  sm.  These routi
25930 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
25940 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a  avoid simulated.
25950 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61  ** errors in pla
25960 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20  ces where we do 
25970 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65  not care about e
25980 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c  rrors..**.** Unl
25990 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53  ess -DSQLITE_TES
259a0 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65  T=1 is used, the
259b0 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
259c0 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e  all no-ops.** an
259d0 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f  d generate no co
259e0 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  de..*/.#ifdef SQ
259f0 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e  LITE_TEST.extern
25a00 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
25a10 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65  error_pending;.e
25a20 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
25a30 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a  3_io_error_hit;.
25a40 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64  static int saved
25a50 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62  _cnt;.void disab
25a60 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
25a70 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
25a80 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69  saved_cnt = sqli
25a90 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
25aa0 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ding;.  sqlite3_
25ab0 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
25ac0 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e   = -1;.}.void en
25ad0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
25ae0 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
25af0 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
25b00 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76  or_pending = sav
25b10 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a  ed_cnt;.}.#else.
25b20 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65  # define disable
25b30 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
25b40 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20  rors().# define 
25b50 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
25b60 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e  _io_errors().#en
25b70 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
25b80 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65  the first N byte
25b90 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e  s from the begin
25ba0 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65  ning of the file
25bb0 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20   into memory.** 
25bc0 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74  that pDest point
25bd0 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  s to. .**.** If 
25be0 74 68 65 20 70 61 67 65 72 20 77 61 73 20 6f 70  the pager was op
25bf0 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69  ened on a transi
25c00 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e  ent file (zFilen
25c10 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20  ame==""), or.** 
25c20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65  opened on a file
25c30 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74   less than N byt
25c40 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20  es in size, the 
25c50 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73  output buffer is
25c60 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53  .** zeroed and S
25c70 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
25c80 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65  d. The rationale
25c90 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61   for this is tha
25ca0 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  t this .** funct
25cb0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
25cc0 65 61 64 20 64 61 74 61 62 61 73 65 20 68 65 61  ead database hea
25cd0 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20  ders, and a new 
25ce0 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20  transient or.** 
25cf0 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62  zero sized datab
25d00 61 73 65 20 68 61 73 20 61 20 68 65 61 64 65 72  ase has a header
25d10 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65   than consists e
25d20 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65  ntirely of zeroe
25d30 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  s..**.** If any 
25d40 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74 20 66  IO error apart f
25d50 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  rom SQLITE_IOERR
25d60 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65  _SHORT_READ is e
25d70 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74  ncountered,.** t
25d80 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
25d90 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
25da0 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20   caller and the 
25db0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
25dc0 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  ** output buffer
25dd0 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69   undefined..*/.i
25de0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
25df0 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 50 61  eadFileheader(Pa
25e00 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
25e10 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61   N, unsigned cha
25e20 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74  r *pDest){.  int
25e30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
25e40 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c  .  memset(pDest,
25e50 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74   0, N);.  assert
25e60 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
25e70 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
25e80 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  tempFile );..  /
25e90 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
25ea0 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  s only called by
25eb0 20 62 74 72 65 65 20 69 6d 6d 65 64 69 61 74 65   btree immediate
25ec0 6c 79 20 61 66 74 65 72 20 63 72 65 61 74 69 6e  ly after creatin
25ed0 67 0a 20 20 2a 2a 20 74 68 65 20 50 61 67 65 72  g.  ** the Pager
25ee0 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 72 65 20   object.  There 
25ef0 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6e 20  has not been an 
25f00 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 74  opportunity to t
25f10 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a 20 74  ransition.  ** t
25f20 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65 74 2e 0a  o WAL mode yet..
25f30 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21    */.  assert( !
25f40 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
25f50 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 69 73  er) );..  if( is
25f60 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
25f70 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28   ){.    IOTRACE(
25f80 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c  ("DBHDR %p 0 %d\
25f90 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a  n", pPager, N)).
25fa0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
25fb0 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
25fc0 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b  d, pDest, N, 0);
25fd0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
25fe0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
25ff0 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63  READ ){.      rc
26000 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
26010 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
26020 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
26030 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
26040 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77  only be called w
26050 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73  hen a read-trans
26060 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f  action is open o
26070 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 2e 20  n.** the pager. 
26080 49 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 74  It returns the t
26090 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
260a0 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
260b0 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65  base..**.** Howe
260c0 76 65 72 2c 20 69 66 20 74 68 65 20 66 69 6c 65  ver, if the file
260d0 20 69 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e   is between 1 an
260e0 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79  d <page-size> by
260f0 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65  tes in size, the
26100 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20 63 6f  n .** this is co
26110 6e 73 69 64 65 72 65 64 20 61 20 31 20 70 61 67  nsidered a 1 pag
26120 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e file..*/.void 
26130 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
26140 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
26150 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65  ger, int *pnPage
26160 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ){.  assert( pPa
26170 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
26180 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61  ER_READER );.  a
26190 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
261a0 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49  State!=PAGER_WRI
261b0 54 45 52 5f 46 49 4e 49 53 48 45 44 20 29 3b 0a  TER_FINISHED );.
261c0 20 20 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e 74    *pnPage = (int
261d0 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b  )pPager->dbSize;
261e0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  .}.../*.** Try t
261f0 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  o obtain a lock 
26200 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65  of type locktype
26210 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
26220 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73   file. If.** a s
26230 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65  imilar or greate
26240 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  r lock is alread
26250 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e  y held, this fun
26260 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
26270 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53  .** (returning S
26280 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61  QLITE_OK immedia
26290 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  tely)..**.** Oth
262a0 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20  erwise, attempt 
262b0 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  to obtain the lo
262c0 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ck using sqlite3
262d0 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65  OsLock(). Invoke
262e0 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61   .** the busy ca
262f0 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f  llback if the lo
26300 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ck is currently 
26310 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52  not available. R
26320 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20  epeat .** until 
26330 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
26340 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20  k returns false 
26350 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74  or until the att
26360 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61  empt to .** obta
26370 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63  in the lock succ
26380 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  eeds..**.** Retu
26390 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
263a0 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65  success and an e
263b0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
263c0 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a  cannot obtain.**
263d0 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68   the lock. If th
263e0 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  e lock is obtain
263f0 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ed successfully,
26400 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 73   set the Pager.s
26410 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c  tate .** variabl
26420 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65  e to locktype be
26430 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
26440 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
26450 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
26460 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
26470 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
26480 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
26490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264a0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
264b0 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68  code */..  /* Ch
264c0 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73  eck that this is
264d0 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20   either a no-op 
264e0 28 62 65 63 61 75 73 65 20 74 68 65 20 72 65 71  (because the req
264f0 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a  uested lock is .
26500 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c    ** already hel
26510 64 29 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  d), or one of th
26520 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 68  e transitions th
26530 61 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  at the busy-hand
26540 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  ler.  ** may be 
26550 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20  invoked during, 
26560 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
26570 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20   comment above. 
26580 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
26590 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29  SetBusyhandler()
265a0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
265b0 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e   (pPager->eLock>
265c0 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20  =locktype).     
265d0 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c    || (pPager->eL
265e0 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20  ock==NO_LOCK && 
265f0 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
26600 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 7c 7c  _LOCK).       ||
26610 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d   (pPager->eLock=
26620 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26  =RESERVED_LOCK &
26630 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c  & locktype==EXCL
26640 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b  USIVE_LOCK).  );
26650 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20  ..  do {.    rc 
26660 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
26670 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 3b  ager, locktype);
26680 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53  .  }while( rc==S
26690 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 50  QLITE_BUSY && pP
266a0 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
266b0 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79  er(pPager->pBusy
266c0 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20  HandlerArg) );. 
266d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
266e0 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73  *.** Function as
266f0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
26700 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 20 63  traint(pPager) c
26710 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f  hecks that one o
26720 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  f the .** follow
26730 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f 72 20  ing is true for 
26740 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
26750 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
26760 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a   page-cache:.**.
26770 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61 67 65  **   a) The page
26780 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20   number is less 
26790 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
267a0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
267b0 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72 65 6e   .**      curren
267c0 74 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  t database image
267d0 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a  , in pages, OR.*
267e0 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65  *.**   b) if the
267f0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 65   page content we
26800 72 65 20 77 72 69 74 74 65 6e 20 61 74 20 74 68  re written at th
26810 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c  is time, it woul
26820 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65  d not.**      be
26830 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
26840 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
26850 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20 74  content out to t
26860 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  he sub-journal.*
26870 2a 20 20 20 20 20 20 28 61 73 20 64 65 74 65 72  *      (as deter
26880 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74 69 6f  mined by functio
26890 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  n subjRequiresPa
268a0 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ge())..**.** If 
268b0 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73  the condition as
268c0 73 65 72 74 65 64 20 62 79 20 74 68 69 73 20 66  serted by this f
268d0 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74  unction were not
268e0 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a   true, and the.*
268f0 2a 20 64 69 72 74 79 20 70 61 67 65 20 77 65 72  * dirty page wer
26900 65 20 74 6f 20 62 65 20 64 69 73 63 61 72 64 65  e to be discarde
26910 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  d from the cache
26920 20 76 69 61 20 74 68 65 20 70 61 67 65 72 53 74   via the pagerSt
26930 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  ress().** routin
26940 65 2c 20 70 61 67 65 72 53 74 72 65 73 73 28 29  e, pagerStress()
26950 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65   would not write
26960 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
26970 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20  e content to.** 
26980 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26990 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f 69 6e  e. If a savepoin
269a0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 65  t transaction we
269b0 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  re rolled back a
269c0 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68 61 70  fter.** this hap
269d0 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72 72 65  pened, the corre
269e0 63 74 20 62 65 68 61 76 69 6f 72 20 77 6f 75 6c  ct behavior woul
269f0 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72 65 20  d be to restore 
26a00 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63  the current.** c
26a10 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
26a20 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73 69 6e  ge. However, sin
26a30 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e 74 20  ce this content 
26a40 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69  is not present i
26a50 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68 65 20  n either.** the 
26a60 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72  database file or
26a70 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20   the portion of 
26a80 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
26a90 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62  rnal and .** sub
26aa0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20  -journal rolled 
26ab0 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74  back the content
26ac0 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65   could not be re
26ad0 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65 0a 2a  stored and the.*
26ae0 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  * database image
26af0 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f   would become co
26b00 72 72 75 70 74 2e 20 49 74 20 69 73 20 74 68 65  rrupt. It is the
26b10 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61 74 65  refore fortunate
26b20 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73 20 63   that .** this c
26b30 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e  ircumstance cann
26b40 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66  ot arise..*/.#if
26b50 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
26b60 44 45 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f  DEBUG).static vo
26b70 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  id assertTruncat
26b80 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28 50 67  eConstraintCb(Pg
26b90 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61 73 73  Hdr *pPg){.  ass
26ba0 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26  ert( pPg->flags&
26bb0 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20  PGHDR_DIRTY );. 
26bc0 20 61 73 73 65 72 74 28 20 21 73 75 62 6a 52 65   assert( !subjRe
26bd0 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
26be0 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  || pPg->pgno<=pP
26bf0 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  g->pPager->dbSiz
26c00 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  e );.}.static vo
26c10 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  id assertTruncat
26c20 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 67 65  eConstraint(Page
26c30 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71  r *pPager){.  sq
26c40 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61  lite3PcacheItera
26c50 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e  teDirty(pPager->
26c60 70 50 43 61 63 68 65 2c 20 61 73 73 65 72 74 54  pPCache, assertT
26c70 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
26c80 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  tCb);.}.#else.# 
26c90 64 65 66 69 6e 65 20 61 73 73 65 72 74 54 72 75  define assertTru
26ca0 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
26cb0 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a  pPager).#endif..
26cc0 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74  /*.** Truncate t
26cd0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  he in-memory dat
26ce0 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65  abase file image
26cf0 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e   to nPage pages.
26d00 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
26d10 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75  on does not actu
26d20 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20  ally modify the 
26d30 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
26d40 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75   disk. It .** ju
26d50 73 74 20 73 65 74 73 20 74 68 65 20 69 6e 74 65  st sets the inte
26d60 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68  rnal state of th
26d70 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73  e pager object s
26d80 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 74  o that the .** t
26d90 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62  runcation will b
26da0 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20  e done when the 
26db0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
26dc0 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
26dd0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
26de0 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61  ction is only ca
26df0 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66 6f 72  lled right befor
26e00 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  e committing a t
26e10 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 4f  ransaction..** O
26e20 6e 63 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  nce this functio
26e30 6e 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  n has been calle
26e40 64 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  d, the transacti
26e50 6f 6e 20 6d 75 73 74 20 65 69 74 68 65 72 20 62  on must either b
26e60 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b  e.** rolled back
26e70 20 6f 72 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49   or committed. I
26e80 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f  t is not safe to
26e90 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
26ea0 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68 65 6e 20  ion and.** then 
26eb0 63 6f 6e 74 69 6e 75 65 20 77 72 69 74 69 6e 67  continue writing
26ec0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
26ed0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
26ee0 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
26ef0 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
26f00 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  r, Pgno nPage){.
26f10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
26f20 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20  ->dbSize>=nPage 
26f30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
26f40 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
26f50 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
26f60 4f 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  OD );.  pPager->
26f70 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
26f80 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69  .  /* At one poi
26f90 6e 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65  nt the code here
26fa0 20 63 61 6c 6c 65 64 20 61 73 73 65 72 74 54 72   called assertTr
26fb0 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
26fc0 28 29 20 74 6f 0a 20 20 2a 2a 20 65 6e 73 75 72  () to.  ** ensur
26fd0 65 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73  e that all pages
26fe0 20 62 65 69 6e 67 20 74 72 75 6e 63 61 74 65 64   being truncated
26ff0 20 61 77 61 79 20 62 79 20 74 68 69 73 20 6f 70   away by this op
27000 65 72 61 74 69 6f 6e 20 61 72 65 2c 0a 20 20 2a  eration are,.  *
27010 2a 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  * if one or more
27020 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20   savepoints are 
27030 6f 70 65 6e 2c 20 70 72 65 73 65 6e 74 20 69 6e  open, present in
27040 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a   the savepoint .
27050 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 73 6f 20    ** journal so 
27060 74 68 61 74 20 74 68 65 79 20 63 61 6e 20 62 65  that they can be
27070 20 72 65 73 74 6f 72 65 64 20 69 66 20 74 68 65   restored if the
27080 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 72 6f   savepoint is ro
27090 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b 2e 20  lled.  ** back. 
270a0 54 68 69 73 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  This is no longe
270b0 72 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74  r necessary as t
270c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
270d0 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a 20 63 61  now only.  ** ca
270e0 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66 6f 72  lled right befor
270f0 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  e committing a t
27100 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20 61  ransaction. So a
27110 6c 74 68 6f 75 67 68 20 74 68 65 20 0a 20 20 2a  lthough the .  *
27120 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 6d  * Pager object m
27130 61 79 20 73 74 69 6c 6c 20 68 61 76 65 20 6f 70  ay still have op
27140 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 28 50  en savepoints (P
27150 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 21  ager.nSavepoint!
27160 3d 30 29 2c 20 0a 20 20 2a 2a 20 74 68 65 79 20  =0), .  ** they 
27170 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64  cannot be rolled
27180 20 62 61 63 6b 2e 20 53 6f 20 74 68 65 20 61 73   back. So the as
27190 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
271a0 74 72 61 69 6e 74 28 29 20 63 61 6c 6c 0a 20 20  traint() call.  
271b0 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  ** is no longer 
271c0 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d 0a 0a 0a  correct. */.}...
271d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
271e0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65  ion is called be
271f0 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
27200 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
27210 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79  llback. It.** sy
27220 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ncs the journal 
27230 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74 68  file to disk, th
27240 65 6e 20 73 65 74 73 20 70 50 61 67 65 72 2d 3e  en sets pPager->
27250 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 74 68  journalHdr to th
27260 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65  e.** size of the
27270 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f   journal file so
27280 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 5f   that the pager_
27290 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69  playback() routi
272a0 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74  ne knows.** that
272b0 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72   the entire jour
272c0 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65  nal file has bee
272d0 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  n synced..**.** 
272e0 53 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  Syncing a hot-jo
272f0 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62 65  urnal to disk be
27300 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
27310 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20  to roll it back 
27320 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68 61 74  ensures .** that
27330 20 69 66 20 61 20 70 6f 77 65 72 2d 66 61 69 6c   if a power-fail
27340 75 72 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ure occurs durin
27350 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20  g the rollback, 
27360 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
27370 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 72 6f 6c  .** attempts rol
27380 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20  lback following 
27390 73 79 73 74 65 6d 20 72 65 63 6f 76 65 72 79 20  system recovery 
273a0 73 65 65 73 20 74 68 65 20 73 61 6d 65 20 6a 6f  sees the same jo
273b0 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74  urnal.** content
273c0 20 61 73 20 74 68 69 73 20 70 72 6f 63 65 73 73   as this process
273d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79  ..**.** If every
273e0 74 68 69 6e 67 20 67 6f 65 73 20 61 73 20 70 6c  thing goes as pl
273f0 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  anned, SQLITE_OK
27400 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
27410 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20  herwise, .** an 
27420 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
27430 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
27440 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
27450 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
27460 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
27470 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
27480 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
27490 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
274a0 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
274b0 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53  r->jfd, SQLITE_S
274c0 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d  YNC_NORMAL);.  }
274d0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
274e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
274f0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
27500 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
27510 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
27520 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Hdr);.  }.  retu
27530 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51  rn rc;.}..#if SQ
27540 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
27550 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69  ZE>0./*.** Obtai
27560 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  n a reference to
27570 20 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64   a memory mapped
27580 20 70 61 67 65 20 6f 62 6a 65 63 74 20 66 6f 72   page object for
27590 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e   page number pgn
275a0 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f  o. .** The new o
275b0 62 6a 65 63 74 20 77 69 6c 6c 20 75 73 65 20 74  bject will use t
275c0 68 65 20 70 6f 69 6e 74 65 72 20 70 44 61 74 61  he pointer pData
275d0 2c 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  , obtained from 
275e0 78 46 65 74 63 68 28 29 2e 0a 2a 2a 20 49 66 20  xFetch()..** If 
275f0 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
27600 2a 70 70 50 61 67 65 20 74 6f 20 70 6f 69 6e 74  *ppPage to point
27610 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65   to the new page
27620 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 61 6e   reference.** an
27630 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
27640 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  OK. Otherwise, r
27650 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
27660 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 73  error code and s
27670 65 74 0a 2a 2a 20 2a 70 70 50 61 67 65 20 74 6f  et.** *ppPage to
27680 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61 67   zero..**.** Pag
27690 65 20 72 65 66 65 72 65 6e 63 65 73 20 6f 62 74  e references obt
276a0 61 69 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e 67  ained by calling
276b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
276c0 68 6f 75 6c 64 20 62 65 20 72 65 6c 65 61 73 65  hould be release
276d0 64 0a 2a 2a 20 62 79 20 63 61 6c 6c 69 6e 67 20  d.** by calling 
276e0 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50  pagerReleaseMapP
276f0 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  age()..*/.static
27700 20 69 6e 74 20 70 61 67 65 72 41 63 71 75 69 72   int pagerAcquir
27710 65 4d 61 70 50 61 67 65 28 0a 20 20 50 61 67 65  eMapPage(.  Page
27720 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
27730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
27740 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
27750 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
27760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27770 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
27780 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61  */.  void *pData
27790 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
277a0 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 28 29       /* xFetch()
277b0 27 64 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  'd data for this
277c0 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72   page */.  PgHdr
277d0 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20 20 20   **ppPage       
277e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
277f0 54 3a 20 41 63 71 75 69 72 65 64 20 70 61 67 65  T: Acquired page
27800 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
27810 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20  PgHdr *p;       
27820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27830 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64  /* Memory mapped
27840 20 70 61 67 65 20 74 6f 20 72 65 74 75 72 6e 20   page to return 
27850 2a 2f 0a 20 20 0a 20 20 69 66 28 20 70 50 61 67  */.  .  if( pPag
27860 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73  er->pMmapFreelis
27870 74 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  t ){.    *ppPage
27880 20 3d 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 70   = p = pPager->p
27890 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20  MmapFreelist;.  
278a0 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46    pPager->pMmapF
278b0 72 65 65 6c 69 73 74 20 3d 20 70 2d 3e 70 44 69  reelist = p->pDi
278c0 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72  rty;.    p->pDir
278d0 74 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  ty = 0;.    asse
278e0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  rt( pPager->nExt
278f0 72 61 3e 3d 38 20 29 3b 0a 20 20 20 20 6d 65 6d  ra>=8 );.    mem
27900 73 65 74 28 70 2d 3e 70 45 78 74 72 61 2c 20 30  set(p->pExtra, 0
27910 2c 20 38 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 8);.  }else{. 
27920 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 20 3d     *ppPage = p =
27930 20 28 50 67 48 64 72 20 2a 29 73 71 6c 69 74 65   (PgHdr *)sqlite
27940 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65  3MallocZero(size
27950 6f 66 28 50 67 48 64 72 29 20 2b 20 70 50 61 67  of(PgHdr) + pPag
27960 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20  er->nExtra);.   
27970 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
27980 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65     sqlite3OsUnfe
27990 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  tch(pPager->fd, 
279a0 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20  (i64)(pgno-1) * 
279b0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
279c0 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  , pData);.      
279d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
279e0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
279f0 20 20 20 20 70 2d 3e 70 45 78 74 72 61 20 3d 20      p->pExtra = 
27a00 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 3b 0a 20  (void *)&p[1];. 
27a10 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 50 47     p->flags = PG
27a20 48 44 52 5f 4d 4d 41 50 3b 0a 20 20 20 20 70 2d  HDR_MMAP;.    p-
27a30 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70  >nRef = 1;.    p
27a40 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
27a50 72 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  r;.  }..  assert
27a60 28 20 70 2d 3e 70 45 78 74 72 61 3d 3d 28 76 6f  ( p->pExtra==(vo
27a70 69 64 20 2a 29 26 70 5b 31 5d 20 29 3b 0a 20 20  id *)&p[1] );.  
27a80 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65  assert( p->pPage
27a90 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
27aa0 20 70 2d 3e 66 6c 61 67 73 3d 3d 50 47 48 44 52   p->flags==PGHDR
27ab0 5f 4d 4d 41 50 20 29 3b 0a 20 20 61 73 73 65 72  _MMAP );.  asser
27ac0 74 28 20 70 2d 3e 70 50 61 67 65 72 3d 3d 70 50  t( p->pPager==pP
27ad0 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  ager );.  assert
27ae0 28 20 70 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a  ( p->nRef==1 );.
27af0 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e  .  p->pgno = pgn
27b00 6f 3b 0a 20 20 70 2d 3e 70 44 61 74 61 20 3d 20  o;.  p->pData = 
27b10 70 44 61 74 61 3b 0a 20 20 70 50 61 67 65 72 2d  pData;.  pPager-
27b20 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a 0a 20 20  >nMmapOut++;..  
27b30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27b40 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
27b50 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66 65  * Release a refe
27b60 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 70 50  rence to page pP
27b70 67 2e 20 70 50 67 20 6d 75 73 74 20 68 61 76 65  g. pPg must have
27b80 20 62 65 65 6e 20 72 65 74 75 72 6e 65 64 20 62   been returned b
27b90 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69 65 72  y an .** earlier
27ba0 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 41 63   call to pagerAc
27bb0 71 75 69 72 65 4d 61 70 50 61 67 65 28 29 2e 0a  quireMapPage()..
27bc0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
27bd0 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61  agerReleaseMapPa
27be0 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
27bf0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
27c00 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
27c10 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75   pPager->nMmapOu
27c20 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44 69 72  t--;.  pPg->pDir
27c30 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d  ty = pPager->pMm
27c40 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 70 50  apFreelist;.  pP
27c50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
27c60 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20 61 73  ist = pPg;..  as
27c70 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 64  sert( pPager->fd
27c80 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72  ->pMethods->iVer
27c90 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73 71 6c  sion>=3 );.  sql
27ca0 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
27cb0 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28  ager->fd, (i64)(
27cc0 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50 61  pPg->pgno-1)*pPa
27cd0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
27ce0 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f  Pg->pData);.}../
27cf0 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 50 67  *.** Free all Pg
27d00 48 64 72 20 6f 62 6a 65 63 74 73 20 73 74 6f 72  Hdr objects stor
27d10 65 64 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  ed in the Pager.
27d20 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 6c 69  pMmapFreelist li
27d30 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
27d40 69 64 20 70 61 67 65 72 46 72 65 65 4d 61 70 48  id pagerFreeMapH
27d50 64 72 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  drs(Pager *pPage
27d60 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a  r){.  PgHdr *p;.
27d70 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 3b 0a    PgHdr *pNext;.
27d80 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e    for(p=pPager->
27d90 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 70  pMmapFreelist; p
27da0 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  ; p=pNext){.    
27db0 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69 72 74  pNext = p->pDirt
27dc0 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  y;.    sqlite3_f
27dd0 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ree(p);.  }.}../
27de0 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
27df0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
27e00 68 61 73 20 6e 6f 74 20 62 65 20 64 65 6c 65 74  has not be delet
27e10 65 64 20 6f 72 20 72 65 6e 61 6d 65 64 20 6f 75  ed or renamed ou
27e20 74 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72 20  t from.** under 
27e30 74 68 65 20 70 61 67 65 72 2e 20 20 52 65 74 75  the pager.  Retu
27e40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
27e50 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
27e60 73 74 69 6c 6c 20 77 68 65 72 65 20 69 74 20 6f  still where it o
27e70 75 67 68 74 0a 2a 2a 20 74 6f 20 62 65 20 6f 6e  ught.** to be on
27e80 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 6e   disk.  Return n
27e90 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c 49 54 45 5f  on-zero (SQLITE_
27ea0 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44  READONLY_DBMOVED
27eb0 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
27ec0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 66 72 6f  rror.** code fro
27ed0 6d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  m sqlite3OsAcces
27ee0 73 28 29 29 20 69 66 20 74 68 65 20 64 61 74 61  s()) if the data
27ef0 62 61 73 65 20 68 61 73 20 67 6f 6e 65 20 6d 69  base has gone mi
27f00 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssing..*/.static
27f10 20 69 6e 74 20 64 61 74 61 62 61 73 65 49 73 55   int databaseIsU
27f20 6e 6d 6f 76 65 64 28 50 61 67 65 72 20 2a 70 50  nmoved(Pager *pP
27f30 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 62 48 61  ager){.  int bHa
27f40 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 69 6e  sMoved = 0;.  in
27f50 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61  t rc;..  if( pPa
27f60 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 20  ger->tempFile ) 
27f70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27f80 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
27f90 64 62 53 69 7a 65 3d 3d 30 20 29 20 72 65 74 75  dbSize==0 ) retu
27fa0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
27fb0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
27fc0 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 70 50 61  zFilename && pPa
27fd0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30  ger->zFilename[0
27fe0 5d 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ] );.  rc = sqli
27ff0 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
28000 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
28010 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f  ITE_FCNTL_HAS_MO
28020 56 45 44 2c 20 26 62 48 61 73 4d 6f 76 65 64 29  VED, &bHasMoved)
28030 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
28040 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20  TE_NOTFOUND ){. 
28050 20 20 20 2f 2a 20 49 66 20 74 68 65 20 48 41 53     /* If the HAS
28060 5f 4d 4f 56 45 44 20 66 69 6c 65 2d 63 6f 6e 74  _MOVED file-cont
28070 72 6f 6c 20 69 73 20 75 6e 69 6d 70 6c 65 6d 65  rol is unimpleme
28080 6e 74 65 64 2c 20 61 73 73 75 6d 65 20 74 68 61  nted, assume tha
28090 74 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  t the file.    *
280a0 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  * has not been m
280b0 6f 76 65 64 2e 20 20 54 68 61 74 20 69 73 20 74  oved.  That is t
280c0 68 65 20 68 69 73 74 6f 72 69 63 61 6c 20 62 65  he historical be
280d0 68 61 76 69 6f 72 20 6f 66 20 53 51 4c 69 74 65  havior of SQLite
280e0 3a 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 2a  : prior to.    *
280f0 2a 20 76 65 72 73 69 6f 6e 20 33 2e 38 2e 33 2c  * version 3.8.3,
28100 20 69 74 20 6e 65 76 65 72 20 63 68 65 63 6b 65   it never checke
28110 64 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51  d */.    rc = SQ
28120 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
28130 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28140 4f 4b 20 26 26 20 62 48 61 73 4d 6f 76 65 64 20  OK && bHasMoved 
28150 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
28160 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f  TE_READONLY_DBMO
28170 56 45 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  VED;.  }.  retur
28180 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
28190 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67  Shutdown the pag
281a0 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61  e cache.  Free a
281b0 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c  ll memory and cl
281c0 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a  ose all files..*
281d0 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61  *.** If a transa
281e0 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f  ction was in pro
281f0 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20  gress when this 
28200 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
28210 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73  d, that.** trans
28220 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
28230 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73   back.  All outs
28240 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
28250 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a  e invalidated.**
28260 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72   and their memor
28270 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79  y is freed.  Any
28280 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
28290 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65  a page associate
282a0 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70  d.** with this p
282b0 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20  age cache after 
282c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
282d0 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  turns will likel
282e0 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61  y.** result in a
282f0 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a   coredump..**.**
28300 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
28310 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20  lways succeeds. 
28320 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
28330 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74   is active an at
28340 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65  tempt.** is made
28350 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
28360 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
28370 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
28380 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68  rollback .** a h
28390 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62  ot journal may b
283a0 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  e left in the fi
283b0 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20  lesystem but no 
283c0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
283d0 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c  d.** to the call
283e0 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
283f0 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67  e3PagerClose(Pag
28400 65 72 20 2a 70 50 61 67 65 72 2c 20 73 71 6c 69  er *pPager, sqli
28410 74 65 33 20 2a 64 62 29 7b 0a 20 20 75 38 20 2a  te3 *db){.  u8 *
28420 70 54 6d 70 20 3d 20 28 75 38 2a 29 70 50 61 67  pTmp = (u8*)pPag
28430 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
28440 20 61 73 73 65 72 74 28 20 64 62 20 7c 7c 20 70   assert( db || p
28450 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
28460 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)==0 );.  asser
28470 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
28480 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
28490 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  .  disable_simul
284a0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
284b0 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
284c0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
284d0 20 20 70 61 67 65 72 46 72 65 65 4d 61 70 48 64    pagerFreeMapHd
284e0 72 73 28 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a  rs(pPager);.  /*
284f0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
28500 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
28510 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
28520 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
28530 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
28540 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 30 3b  {.    u8 *a = 0;
28550 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 20  .    assert( db 
28560 7c 7c 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d  || pPager->pWal=
28570 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 64 62  =0 );.    if( db
28580 20 26 26 20 30 3d 3d 28 64 62 2d 3e 66 6c 61 67   && 0==(db->flag
28590 73 20 26 20 53 51 4c 49 54 45 5f 4e 6f 43 6b 70  s & SQLITE_NoCkp
285a0 74 4f 6e 43 6c 6f 73 65 29 20 0a 20 20 20 20 20  tOnClose) .     
285b0 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 64 61  && SQLITE_OK==da
285c0 74 61 62 61 73 65 49 73 55 6e 6d 6f 76 65 64 28  tabaseIsUnmoved(
285d0 70 50 61 67 65 72 29 0a 20 20 20 20 29 7b 0a 20  pPager).    ){. 
285e0 20 20 20 20 20 61 20 3d 20 70 54 6d 70 3b 0a 20       a = pTmp;. 
285f0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
28600 57 61 6c 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  WalClose(pPager-
28610 3e 70 57 61 6c 2c 20 64 62 2c 20 70 50 61 67 65  >pWal, db, pPage
28620 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 2c  r->walSyncFlags,
28630 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
28640 65 2c 61 29 3b 0a 20 20 20 20 70 50 61 67 65 72  e,a);.    pPager
28650 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a  ->pWal = 0;.  }.
28660 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72  #endif.  pager_r
28670 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
28680 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
28690 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
286a0 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ager);.  }else{.
286b0 20 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20      /* If it is 
286c0 6f 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a  open, sync the j
286d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f  ournal file befo
286e0 72 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63  re calling Unloc
286f0 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20  kAndRollback..  
28700 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
28710 6e 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61  not done, then a
28720 6e 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69  n unsynced porti
28730 6f 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a  on of the open j
28740 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66  ournal .    ** f
28750 69 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65  ile may be playe
28760 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
28770 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20 70  database. If a p
28780 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63  ower failure occ
28790 75 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c  urs .    ** whil
287a0 65 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e  e this is happen
287b0 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61 73  ing, the databas
287c0 65 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63  e could become c
287d0 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20  orrupt..    **. 
287e0 20 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f     ** If an erro
287f0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
28800 72 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68  rying to sync th
28810 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74  e journal, shift
28820 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a   the pager.    *
28830 2a 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52  * into the ERROR
28840 20 73 74 61 74 65 2e 20 54 68 69 73 20 63 61 75   state. This cau
28850 73 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  ses UnlockAndRol
28860 6c 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20  lback to unlock 
28870 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
28880 61 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ase and close th
28890 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
288a0 69 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e  ithout attemptin
288b0 67 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20  g to roll it.   
288c0 20 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61   ** back or fina
288d0 6c 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78  lize it. The nex
288e0 74 20 64 61 74 61 62 61 73 65 20 75 73 65 72 20  t database user 
288f0 77 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20  will have to do 
28900 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  hot-journal.    
28910 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f  ** rollback befo
28920 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  re accessing the
28930 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
28940 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
28950 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
28960 64 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  d) ){.      page
28970 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
28980 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72  pagerSyncHotJour
28990 6e 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20  nal(pPager));.  
289a0 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c    }.    pagerUnl
289b0 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
289c0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71  Pager);.  }.  sq
289d0 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
289e0 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65  lloc();.  enable
289f0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
28a00 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54  rors();.  PAGERT
28a10 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c  RACE(("CLOSE %d\
28a20 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
28a30 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  er)));.  IOTRACE
28a40 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20  (("CLOSE %p\n", 
28a50 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74  pPager)).  sqlit
28a60 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
28a70 2d 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65  ->jfd);.  sqlite
28a80 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
28a90 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  >fd);.  sqlite3P
28aa0 61 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20  ageFree(pTmp);. 
28ab0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
28ac0 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ose(pPager->pPCa
28ad0 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  che);..#ifdef SQ
28ae0 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
28af0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f   if( pPager->xCo
28b00 64 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72  decFree ) pPager
28b10 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61  ->xCodecFree(pPa
28b20 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65  ger->pCodec);.#e
28b30 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
28b40 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  !pPager->aSavepo
28b50 69 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e  int && !pPager->
28b60 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  pInJournal );.  
28b70 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
28b80 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
28b90 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
28ba0 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69  sjfd) );..  sqli
28bb0 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29  te3_free(pPager)
28bc0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
28bd0 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  E_OK;.}..#if !de
28be0 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c  fined(NDEBUG) ||
28bf0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
28c00 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  TEST)./*.** Retu
28c10 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  rn the page numb
28c20 65 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e  er for page pPg.
28c30 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33  .*/.Pgno sqlite3
28c40 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
28c50 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
28c60 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f  return pPg->pgno
28c70 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
28c80 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
28c90 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
28ca0 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f  for page pPg..*/
28cb0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
28cc0 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50  erRef(DbPage *pP
28cd0 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  g){.  sqlite3Pca
28ce0 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a  cheRef(pPg);.}..
28cf0 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a  /*.** Sync the j
28d00 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72  ournal. In other
28d10 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72   words, make sur
28d20 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20  e all the pages 
28d30 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65  that have.** bee
28d40 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
28d50 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63   journal have ac
28d60 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74  tually reached t
28d70 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68  he surface of th
28d80 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61  e.** disk and ca
28d90 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e  n be restored in
28da0 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20   the event of a 
28db0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
28dc0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
28dd0 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20  he Pager.noSync 
28de0 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
28df0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
28e00 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f  is a no-op..** O
28e10 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 63  therwise, the ac
28e20 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64  tions required d
28e30 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75  epend on the jou
28e40 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68  rnal-mode and th
28e50 65 20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61  e .** device cha
28e60 72 61 63 74 65 72 69 73 74 69 63 73 20 6f 66 20  racteristics of 
28e70 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  the file-system,
28e80 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
28e90 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f  **   * If the jo
28ea0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e  urnal file is an
28eb0 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
28ec0 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69  al file, no acti
28ed0 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62  on need.**     b
28ee0 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20  e taken..**.**  
28ef0 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66   * Otherwise, if
28f00 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73   the device does
28f10 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65   not support the
28f20 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
28f30 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68  perty,.**     th
28f40 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  en the nRec fiel
28f50 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  d of the most re
28f60 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a  cently written j
28f70 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a  ournal header.**
28f80 20 20 20 20 20 69 73 20 75 70 64 61 74 65 64 20       is updated 
28f90 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  to contain the n
28fa0 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c  umber of journal
28fb0 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 68 61   records that ha
28fc0 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77  ve.**     been w
28fd0 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67  ritten following
28fe0 20 69 74 2e 20 49 66 20 74 68 65 20 70 61 67 65   it. If the page
28ff0 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69  r is operating i
29000 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20  n full-sync.**  
29010 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68     mode, then th
29020 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
29030 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20  s synced before 
29040 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 75 70  this field is up
29050 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  dated..**.**   *
29060 20 49 66 20 74 68 65 20 64 65 76 69 63 65 20 64   If the device d
29070 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
29080 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70  the SEQUENTIAL p
29090 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a  roperty, then .*
290a0 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69  *     journal fi
290b0 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a  le is synced..**
290c0 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64  .** Or, in pseud
290d0 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  o-code:.**.**   
290e0 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f  if( NOT <in-memo
290f0 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a  ry journal> ){.*
29100 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41  *     if( NOT SA
29110 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20  FE_APPEND ){.** 
29120 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d        if( <full-
29130 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79  sync mode> ) xSy
29140 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  nc(<journal file
29150 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70  >);.**       <up
29160 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e  date nRec field>
29170 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20  .**     } .**   
29180 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e    if( NOT SEQUEN
29190 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f  TIAL ) xSync(<jo
291a0 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a  urnal file>);.**
291b0 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75     }.**.** If su
291c0 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72  ccessful, this r
291d0 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68  outine clears th
291e0 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
291f0 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20  C flag of every 
29200 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74  .** page current
29210 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72  ly held in memor
29220 79 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  y before returni
29230 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  ng SQLITE_OK. If
29240 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20   an IO.** error 
29250 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
29260 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
29270 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
29280 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
29290 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
292a0 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65  syncJournal(Page
292b0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e  r *pPager, int n
292c0 65 77 48 64 72 29 7b 0a 20 20 69 6e 74 20 72 63  ewHdr){.  int rc
292d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
292e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
292f0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61  urn code */..  a
29300 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
29310 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
29320 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
29330 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
29340 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
29350 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20  TER_DBMOD.  );. 
29360 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
29370 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
29380 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
29390 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
293a0 61 67 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d  ager) );..  rc =
293b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63   sqlite3PagerExc
293c0 6c 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65  lusiveLock(pPage
293d0 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
293e0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
293f0 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61   rc;..  if( !pPa
29400 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
29410 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
29420 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
29430 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
29440 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70  Pager->jfd) && p
29450 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
29460 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
29470 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
29480 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
29490 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
294a0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
294b0 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
294c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
294d0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
294e0 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  fd) );..      if
294f0 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
29500 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
29510 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ND) ){.        /
29520 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61  * This block dea
29530 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75  ls with an obscu
29540 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74  re problem. If t
29550 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69  he last connecti
29560 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  on.        ** th
29570 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73  at wrote to this
29580 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70   database was op
29590 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69  erating in persi
295a0 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20  stent-journal.  
295b0 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74        ** mode, t
295c0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
295d0 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73  file may at this
295e0 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20   point actually 
295f0 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20  be larger.      
29600 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
29610 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73  journalOff bytes
29620 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68  . If the next th
29630 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ing in the journ
29640 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  al.        ** fi
29650 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  le happens to be
29660 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65   a journal-heade
29670 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61  r (written as pa
29680 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  rt of the.      
29690 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f    ** previous co
296a0 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73  nnection's trans
296b0 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63  action), and a c
296c0 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61  rash or power-fa
296d0 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a  ilure .        *
296e0 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e  * occurs after n
296f0 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62  Rec is updated b
29700 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63  ut before this c
29710 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
29720 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79   .        ** any
29730 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68  thing else to th
29740 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
29750 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73  or commits/rolls
29760 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20   back its .     
29770 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
29780 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20  n), then SQLite 
29790 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75  may become confu
297a0 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74  sed when doing t
297b0 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68  he .        ** h
297c0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
297d0 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65  ack following re
297e0 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72  covery. It may r
297f0 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20  oll back all.   
29800 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20       ** of this 
29810 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61  connections data
29820 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74  , then proceed t
29830 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74  o rolling back t
29840 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20  he old,.        
29850 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64  ** out-of-date d
29860 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ata that follows
29870 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f   it. Database co
29880 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
29890 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
298a0 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
298b0 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72  his, if the jour
298c0 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70  nal file does ap
298d0 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a  pear to contain.
298e0 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c          ** a val
298f0 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77  id header follow
29900 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ing Pager.journa
29910 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65  lOff, then write
29920 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20   a 0x00.        
29930 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73  ** byte to the s
29940 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72  tart of it to pr
29950 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65  event it from be
29960 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a  ing recognized..
29970 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
29980 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69     ** Variable i
29990 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73  NextHdrOffset is
299a0 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73   set to the offs
299b0 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73  et at which this
299c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  .        ** prob
299d0 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77  lematic header w
299e0 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74  ill occur, if it
299f0 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20   exists. aMagic 
29a00 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20  is used .       
29a10 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61   ** as a tempora
29a20 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73  ry buffer to ins
29a30 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63  pect the first c
29a40 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f  ouple of bytes o
29a50 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
29a60 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e   potential journ
29a70 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20  al header..     
29a80 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36     */.        i6
29a90 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  4 iNextHdrOffset
29aa0 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61  ;.        u8 aMa
29ab0 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20  gic[8];.        
29ac0 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  u8 zHeader[sizeo
29ad0 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
29ae0 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65  +4];..        me
29af0 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a  mcpy(zHeader, aJ
29b00 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
29b10 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
29b20 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  c));.        put
29b30 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
29b40 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
29b50 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e  agic)], pPager->
29b60 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20  nRec);..        
29b70 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d  iNextHdrOffset =
29b80 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
29b90 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
29ba0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
29bb0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
29bc0 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e  d, aMagic, 8, iN
29bd0 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20  extHdrOffset);. 
29be0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
29bf0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d  QLITE_OK && 0==m
29c00 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
29c10 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20  ournalMagic, 8) 
29c20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  ){.          sta
29c30 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72  tic const u8 zer
29c40 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  obyte = 0;.     
29c50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
29c60 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
29c70 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c  >jfd, &zerobyte,
29c80 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73   1, iNextHdrOffs
29c90 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
29ca0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
29cb0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
29cc0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
29cd0 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
29ce0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
29cf0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
29d00 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
29d10 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
29d20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
29d30 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20   header. If in. 
29d40 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73         ** full-s
29d50 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
29d60 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
29d70 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e  l first. This en
29d80 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  sures that.     
29d90 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68     ** all data h
29da0 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68  as really hit th
29db0 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52  e disk before nR
29dc0 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ec is updated to
29dd0 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a   mark.        **
29de0 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61   it as a candida
29df0 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e  te for rollback.
29e00 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
29e10 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
29e20 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74  ot required if t
29e30 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
29e40 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65  dia supports the
29e50 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45  .        ** SAFE
29e60 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
29e70 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69  . Because in thi
29e80 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74  s case it is not
29e90 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20   possible .     
29ea0 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67     ** for garbag
29eb0 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70  e data to be app
29ec0 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c  ended to the fil
29ed0 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  e, the nRec fiel
29ee0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  d.        ** is 
29ef0 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30  populated with 0
29f00 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74  xFFFFFFFF when t
29f10 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
29f20 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20  r is written.   
29f30 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65       ** and neve
29f40 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  r needs to be up
29f50 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  dated..        *
29f60 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
29f70 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
29f80 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  & 0==(iDc&SQLITE
29f90 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
29fa0 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
29fb0 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
29fc0 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
29fd0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
29fe0 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  er)));.         
29ff0 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
2a000 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
2a010 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2a020 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
2a030 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
2a040 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
2a050 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2a060 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
2a070 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
2a080 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  }.        IOTRAC
2a090 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
2a0a0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
2a0b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29  ger->journalHdr)
2a0c0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2a0d0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a  sqlite3OsWrite(.
2a0e0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
2a0f0 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72  er->jfd, zHeader
2a100 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72  , sizeof(zHeader
2a110 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ), pPager->journ
2a120 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b  alHdr.        );
2a130 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
2a140 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
2a150 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
2a160 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44        if( 0==(iD
2a170 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
2a180 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
2a190 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
2a1a0 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  (("SYNC journal 
2a1b0 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
2a1c0 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
2a1d0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
2a1e0 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
2a1f0 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20  er)).        rc 
2a200 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
2a210 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
2a220 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20  ger->syncFlags| 
2a230 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67  .          (pPag
2a240 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53  er->syncFlags==S
2a250 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f  QLITE_SYNC_FULL?
2a260 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
2a270 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20  ONLY:0).        
2a280 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2a290 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
2a2a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2a2b0 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  }..      pPager-
2a2c0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
2a2d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2a2e0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 48  ;.      if( newH
2a2f0 64 72 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51  dr && 0==(iDc&SQ
2a300 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
2a310 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20  APPEND) ){.     
2a320 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
2a330 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
2a340 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
2a350 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  r(pPager);.     
2a360 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2a370 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
2a380 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2a390 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
2a3a0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
2a3b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2a3c0 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ff;.    }.  }.. 
2a3d0 20 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70   /* Unless the p
2a3e0 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e  ager is in noSyn
2a3f0 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72  c mode, the jour
2a400 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73  nal file was jus
2a410 74 20 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66  t .  ** successf
2a420 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74  ully synced. Eit
2a430 68 65 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74  her way, clear t
2a440 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
2a450 4e 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a  NC flag on .  **
2a460 20 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f   all pages..  */
2a470 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
2a480 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70  ClearSyncFlags(p
2a490 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
2a4a0 0a 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  .  pPager->eStat
2a4b0 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52  e = PAGER_WRITER
2a4c0 5f 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74  _DBMOD;.  assert
2a4d0 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
2a4e0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
2a4f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a500 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
2a510 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
2a520 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b   first in a link
2a530 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79  ed list of dirty
2a540 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64   pages connected
2a550 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72  .** by the PgHdr
2a560 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e  .pDirty pointer.
2a570 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
2a580 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f  rites each one o
2a590 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  f the.** in-memo
2a5a0 72 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ry pages in the 
2a5b0 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61  list to the data
2a5c0 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61  base file. The a
2a5d0 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62  rgument may.** b
2a5e0 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e  e NULL, represen
2a5f0 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69  ting an empty li
2a600 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  st. In this case
2a610 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2a620 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s.** a no-op..**
2a630 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75  .** The pager mu
2a640 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  st hold at least
2a650 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
2a660 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
2a670 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ion.** is called
2a680 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67  . Before writing
2a690 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65   anything to the
2a6a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2a6b0 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20  this lock.** is 
2a6c0 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45  upgraded to an E
2a6d0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
2a6e0 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f  f the lock canno
2a6f0 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a  t be obtained,.*
2a700 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
2a710 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f   returned and no
2a720 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
2a730 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2a740 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66   file..** .** If
2a750 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20   the pager is a 
2a760 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20  temp-file pager 
2a770 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66  and the actual f
2a780 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a  ile-system file.
2a790 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70  ** is not yet op
2a7a0 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65  en, it is create
2a7b0 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66  d and opened bef
2a7c0 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
2a7d0 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e  .** written out.
2a7e0 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20  .**.** Once the 
2a7f0 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70  lock has been up
2a800 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e  graded and, if n
2a810 65 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69  ecessary, the fi
2a820 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68  le opened,.** th
2a830 65 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74  e pages are writ
2a840 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ten out to the d
2a850 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
2a860 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74  list order. Writ
2a870 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73  ing.** a page is
2a880 20 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d   skipped if it m
2a890 65 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74  eets either of t
2a8a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
2a8b0 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  teria:.**.**   *
2a8c0 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
2a8d0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
2a8e0 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f   Pager.dbSize, o
2a8f0 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48  r.**   * The PGH
2a900 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c  DR_DONT_WRITE fl
2a910 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65  ag is set on the
2a920 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
2a930 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61  writing out a pa
2a940 67 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61  ge causes the da
2a950 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67  tabase file to g
2a960 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c  row, Pager.dbFil
2a970 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61  eSize.** is upda
2a980 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
2a990 20 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72   If page 1 is wr
2a9a0 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20  itten out, then 
2a9b0 74 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64  the value cached
2a9c0 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46  .** in Pager.dbF
2a9d0 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64  ileVers[] is upd
2a9e0 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68  ated to match th
2a9f0 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72  e new value stor
2aa00 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74  ed in.** the dat
2aa10 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
2aa20 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
2aa30 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
2aa40 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2aa50 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
2aa60 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c  rror .** occurs,
2aa70 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
2aa80 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
2aa90 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53  r, if the EXCLUS
2aaa0 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a  IVE lock cannot.
2aab0 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20  ** be obtained, 
2aac0 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
2aad0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
2aae0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
2aaf0 74 65 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65  te_pagelist(Page
2ab00 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
2ab10 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
2ab20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2ab30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab40 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2ab50 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75  */..  /* This fu
2ab60 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63  nction is only c
2ab70 61 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61  alled for rollba
2ab80 63 6b 20 70 61 67 65 72 73 20 69 6e 20 57 52 49  ck pagers in WRI
2ab90 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e  TER_DBMOD state.
2aba0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70   */.  assert( !p
2abb0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2abc0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2abd0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2abe0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
2abf0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
2ac00 5f 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65  _DBMOD );.  asse
2ac10 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
2ac20 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
2ac30 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  K );.  assert( i
2ac40 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
2ac50 29 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 44 69 72  ) || pList->pDir
2ac60 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  ty==0 );..  /* I
2ac70 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 61 20  f the file is a 
2ac80 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f  temp-file has no
2ac90 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65  t yet been opene
2aca0 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20  d, open it now. 
2acb0 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70  It.  ** is not p
2acc0 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74  ossible for rc t
2acd0 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20  o be other than 
2ace0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69  SQLITE_OK if thi
2acf0 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73  s branch.  ** is
2ad00 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72   taken, as pager
2ad10 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20  _wait_on_lock() 
2ad20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74  is a no-op for t
2ad30 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a  emp-files..  */.
2ad40 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
2ad50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
2ad60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2ad70 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d  >tempFile && rc=
2ad80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
2ad90 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
2ada0 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61  temp(pPager, pPa
2adb0 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
2adc0 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a  >vfsFlags);.  }.
2add0 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 68 65  .  /* Before the
2ade0 20 66 69 72 73 74 20 77 72 69 74 65 2c 20 67 69   first write, gi
2adf0 76 65 20 74 68 65 20 56 46 53 20 61 20 68 69 6e  ve the VFS a hin
2ae00 74 20 6f 66 20 77 68 61 74 20 74 68 65 20 66 69  t of what the fi
2ae10 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69  nal.  ** file si
2ae20 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f  ze will be..  */
2ae30 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
2ae40 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
2ae50 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
2ae60 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2ae70 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 70 50 61  TE_OK .   && pPa
2ae80 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 3c  ger->dbHintSize<
2ae90 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 0a 20  pPager->dbSize. 
2aea0 20 20 26 26 20 28 70 4c 69 73 74 2d 3e 70 44 69    && (pList->pDi
2aeb0 72 74 79 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 67  rty || pList->pg
2aec0 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 48 69 6e  no>pPager->dbHin
2aed0 74 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 20  tSize).  ){.    
2aee0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
2aef0 46 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  File = pPager->p
2af00 61 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74  ageSize * (sqlit
2af10 65 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72 2d  e3_int64)pPager-
2af20 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c  >dbSize;.    sql
2af30 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
2af40 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64  lHint(pPager->fd
2af50 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  , SQLITE_FCNTL_S
2af60 49 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c  IZE_HINT, &szFil
2af70 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  e);.    pPager->
2af80 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61  dbHintSize = pPa
2af90 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d  ger->dbSize;.  }
2afa0 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ..  while( rc==S
2afb0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73  QLITE_OK && pLis
2afc0 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  t ){.    Pgno pg
2afd0 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  no = pList->pgno
2afe0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
2aff0 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67  re are dirty pag
2b000 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  es in the page c
2b010 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e  ache with page n
2b020 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20  umbers greater. 
2b030 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
2b040 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65  .dbSize, this me
2b050 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ans sqlite3Pager
2b060 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20  TruncateImage() 
2b070 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20  was called to.  
2b080 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69    ** make the fi
2b090 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73  le smaller (pres
2b0a0 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76  umably by auto-v
2b0b0 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20  acuum code). Do 
2b0c0 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a  not write.    **
2b0d0 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20   any such pages 
2b0e0 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  to the file..   
2b0f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c   **.    ** Also,
2b100 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75   do not write ou
2b110 74 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20  t any page that 
2b120 68 61 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f  has the PGHDR_DO
2b130 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20  NT_WRITE flag.  
2b140 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79    ** set (set by
2b150 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
2b160 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a  tWrite())..    *
2b170 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d  /.    if( pgno<=
2b180 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26  pPager->dbSize &
2b190 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61  & 0==(pList->fla
2b1a0 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  gs&PGHDR_DONT_WR
2b1b0 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36  ITE) ){.      i6
2b1c0 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f  4 offset = (pgno
2b1d0 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
2b1e0 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20  >pageSize;   /* 
2b1f0 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20  Offset to write 
2b200 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  */.      char *p
2b210 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
2b220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b230 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
2b240 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a  to write */    .
2b250 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
2b260 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48  pList->flags&PGH
2b270 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30  DR_NEED_SYNC)==0
2b280 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
2b290 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70  ist->pgno==1 ) p
2b2a0 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67  ager_write_chang
2b2b0 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b  ecounter(pList);
2b2c0 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64  ..      /* Encod
2b2d0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  e the database *
2b2e0 2f 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70  /.      CODEC2(p
2b2f0 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44  Pager, pList->pD
2b300 61 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65  ata, pgno, 6, re
2b310 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2b320 4d 5f 42 4b 50 54 2c 20 70 44 61 74 61 29 3b 0a  M_BKPT, pData);.
2b330 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  .      /* Write 
2b340 6f 75 74 20 74 68 65 20 70 61 67 65 20 64 61 74  out the page dat
2b350 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  a. */.      rc =
2b360 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
2b370 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74  pPager->fd, pDat
2b380 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
2b390 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20  ize, offset);.. 
2b3a0 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20       /* If page 
2b3b0 31 20 77 61 73 20 6a 75 73 74 20 77 72 69 74 74  1 was just writt
2b3c0 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65 72  en, update Pager
2b3d0 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d  .dbFileVers to m
2b3e0 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68  atch.      ** th
2b3f0 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72  e value now stor
2b400 65 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ed in the databa
2b410 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74  se file. If writ
2b420 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20 20  ing this .      
2b430 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64 20 74  ** page caused t
2b440 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b450 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65   to grow, update
2b460 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20   dbFileSize. .  
2b470 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
2b480 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
2b490 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
2b4a0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
2b4b0 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65  &pData[24], size
2b4c0 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
2b4d0 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d  eVers));.      }
2b4e0 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  .      if( pgno>
2b4f0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
2b500 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  ze ){.        pP
2b510 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
2b520 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d   = pgno;.      }
2b530 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
2b540 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f  Stat[PAGER_STAT_
2b550 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20  WRITE]++;..     
2b560 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20 62   /* Update any b
2b570 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63 6f  ackup objects co
2b580 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  pying the conten
2b590 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 72  ts of this pager
2b5a0 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
2b5b0 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70  e3BackupUpdate(p
2b5c0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20  Pager->pBackup, 
2b5d0 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74  pgno, (u8*)pList
2b5e0 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  ->pData);..     
2b5f0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
2b600 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20 68  ORE %d page %d h
2b610 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
2b620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b630 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2b640 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  , pgno, pager_pa
2b650 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b  gehash(pList)));
2b660 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
2b670 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c  "PGOUT %p %d\n",
2b680 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
2b690 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
2b6a0 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
2b6b0 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a  writedb_count);.
2b6c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b6d0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f   PAGERTRACE(("NO
2b6e0 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
2b6f0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
2b700 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ger), pgno));.  
2b710 20 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65    }.    pager_se
2b720 74 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  t_pagehash(pList
2b730 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  );.    pList = p
2b740 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
2b750 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2b760 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20  }../*.** Ensure 
2b770 74 68 61 74 20 74 68 65 20 73 75 62 2d 6a 6f 75  that the sub-jou
2b780 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2b790 6e 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65  n. If it is alre
2b7a0 61 64 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a  ady open, this .
2b7b0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  ** function is a
2b7c0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51   no-op..**.** SQ
2b7d0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2b7e0 6e 65 64 20 69 66 20 65 76 65 72 79 74 68 69 6e  ned if everythin
2b7f0 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67  g goes according
2b800 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a   to plan. An .**
2b810 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58   SQLITE_IOERR_XX
2b820 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  X error code is 
2b830 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 63 61  returned if a ca
2b840 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f  ll to sqlite3OsO
2b850 70 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e  pen() .** fails.
2b860 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
2b870 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61  penSubJournal(Pa
2b880 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2b890 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2b8a0 4f 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65  OK;.  if( !isOpe
2b8b0 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
2b8c0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  ){.    const int
2b8d0 20 66 6c 61 67 73 20 3d 20 20 53 51 4c 49 54 45   flags =  SQLITE
2b8e0 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
2b8f0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   | SQLITE_OPEN_R
2b900 45 41 44 57 52 49 54 45 20 0a 20 20 20 20 20 20  EADWRITE .      
2b910 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
2b920 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  EATE | SQLITE_OP
2b930 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 0a 20 20  EN_EXCLUSIVE .  
2b940 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45      | SQLITE_OPE
2b950 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b  N_DELETEONCLOSE;
2b960 0a 20 20 20 20 69 6e 74 20 6e 53 74 6d 74 53 70  .    int nStmtSp
2b970 69 6c 6c 20 3d 20 73 71 6c 69 74 65 33 43 6f 6e  ill = sqlite3Con
2b980 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b 0a  fig.nStmtSpill;.
2b990 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2b9a0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
2b9b0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
2b9c0 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d  EMORY || pPager-
2b9d0 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b  >subjInMemory ){
2b9e0 0a 20 20 20 20 20 20 6e 53 74 6d 74 53 70 69 6c  .      nStmtSpil
2b9f0 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  l = -1;.    }.  
2ba00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
2ba10 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72  urnalOpen(pPager
2ba20 2d 3e 70 56 66 73 2c 20 30 2c 20 70 50 61 67 65  ->pVfs, 0, pPage
2ba30 72 2d 3e 73 6a 66 64 2c 20 66 6c 61 67 73 2c 20  r->sjfd, flags, 
2ba40 6e 53 74 6d 74 53 70 69 6c 6c 29 3b 0a 20 20 7d  nStmtSpill);.  }
2ba50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2ba60 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
2ba70 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75  record of the cu
2ba80 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70  rrent state of p
2ba90 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20 73  age pPg to the s
2baa0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 0a  ub-journal. .**.
2bab0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
2bac0 2c 20 73 65 74 20 74 68 65 20 62 69 74 20 63 6f  , set the bit co
2bad0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70  rresponding to p
2bae0 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20  Pg->pgno in the 
2baf0 62 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61  bitvecs.** for a
2bb00 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ll open savepoin
2bb10 74 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ts before return
2bb20 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
2bb30 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
2bb40 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
2bb50 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63  erything is succ
2bb60 65 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a  essful, an IO.**
2bb70 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74   error code if t
2bb80 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  he attempt to wr
2bb90 69 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  ite to the sub-j
2bba0 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72  ournal fails, or
2bbb0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   .** SQLITE_NOME
2bbc0 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61  M if a malloc fa
2bbd0 69 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69 6e  ils while settin
2bbe0 67 20 61 20 62 69 74 20 69 6e 20 61 20 73 61 76  g a bit in a sav
2bbf0 65 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63  epoint.** bitvec
2bc00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2bc10 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50  subjournalPage(P
2bc20 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e  gHdr *pPg){.  in
2bc30 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2bc40 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
2bc50 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
2bc60 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
2bc70 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
2bc80 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
2bc90 46 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65  F ){..    /* Ope
2bca0 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  n the sub-journa
2bcb0 6c 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74  l, if it has not
2bcc0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70   already been op
2bcd0 65 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73 65  ened */.    asse
2bce0 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
2bcf0 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73  ournal );.    as
2bd00 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
2bd10 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67  ger->jfd) || pag
2bd20 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2bd30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2bd40 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
2bd50 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  jfd) || pPager->
2bd60 6e 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20  nSubRec==0 );.  
2bd70 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55    assert( pagerU
2bd80 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a 20  seWal(pPager) . 
2bd90 20 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65 49          || pageI
2bda0 6e 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  nJournal(pPager,
2bdb0 20 70 50 67 29 20 0a 20 20 20 20 20 20 20 20 20   pPg) .         
2bdc0 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  || pPg->pgno>pPa
2bdd0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
2bde0 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d  .    );.    rc =
2bdf0 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
2be00 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a  pPager);..    /*
2be10 20 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   If the sub-jour
2be20 6e 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73  nal was opened s
2be30 75 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20  uccessfully (or 
2be40 77 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  was already open
2be50 29 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20  ),.    ** write 
2be60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
2be70 72 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  rd into the file
2be80 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  .  */.    if( rc
2be90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2bea0 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61       void *pData
2beb0 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20   = pPg->pData;. 
2bec0 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20       i64 offset 
2bed0 3d 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e 6e  = (i64)pPager->n
2bee0 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72  SubRec*(4+pPager
2bef0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
2bf00 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b     char *pData2;
2bf10 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53  ..#if SQLITE_HAS
2bf20 5f 43 4f 44 45 43 20 20 20 0a 20 20 20 20 20 20  _CODEC   .      
2bf30 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 75 62  if( !pPager->sub
2bf40 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20  jInMemory ){.   
2bf50 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
2bf60 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
2bf70 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20  pgno, 7, return 
2bf80 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
2bf90 54 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20  T, pData2);.    
2bfa0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
2bfb0 20 20 20 20 20 70 44 61 74 61 32 20 3d 20 70 44       pData2 = pD
2bfc0 61 74 61 3b 0a 20 20 20 20 20 20 50 41 47 45 52  ata;.      PAGER
2bfd0 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55  TRACE(("STMT-JOU
2bfe0 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
2bff0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
2c000 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  er), pPg->pgno))
2c010 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
2c020 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
2c030 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70  >sjfd, offset, p
2c040 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
2c050 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c060 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
2c070 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
2c080 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  e(pPager->sjfd, 
2c090 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
2c0a0 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
2c0b0 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  +4);.      }.   
2c0c0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
2c0d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c0e0 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65    pPager->nSubRe
2c0f0 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  c++;.    assert(
2c100 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
2c110 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20  int>0 );.    rc 
2c120 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  = addToSavepoint
2c130 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
2c140 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  pPg->pgno);.  }.
2c150 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73    return rc;.}.s
2c160 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75  tatic int subjou
2c170 72 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69 72  rnalPageIfRequir
2c180 65 64 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ed(PgHdr *pPg){.
2c190 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72    if( subjRequir
2c1a0 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20  esPage(pPg) ){. 
2c1b0 20 20 20 72 65 74 75 72 6e 20 73 75 62 6a 6f 75     return subjou
2c1c0 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20  rnalPage(pPg);. 
2c1d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
2c1e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2c1f0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
2c200 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2c210 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65  ed by the pcache
2c220 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68   layer when it h
2c230 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a  as reached some.
2c240 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c  ** soft memory l
2c250 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74 20  imit. The first 
2c260 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
2c270 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
2c280 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74   object.** (cast
2c290 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68   as a void*). Th
2c2a0 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61 79  e pager is alway
2c2b0 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e  s 'purgeable' (n
2c2c0 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  ot an in-memory.
2c2d0 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54 68  ** database). Th
2c2e0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2c2f0 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  t is a reference
2c300 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74 20   to a page that 
2c310 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  is .** currently
2c320 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20 6e   dirty but has n
2c330 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
2c340 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61  ferences. The pa
2c350 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20  ge.** is always 
2c360 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2c370 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
2c380 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
2c390 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  irst .** argumen
2c3a0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62  t..**.** The job
2c3b0 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
2c3c0 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67  n is to make pPg
2c3d0 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e   clean by writin
2c3e0 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a  g its contents.*
2c3f0 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  * out to the dat
2c400 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70  abase file, if p
2c410 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61  ossible. This ma
2c420 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e  y involve syncin
2c430 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  g the.** journal
2c440 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   file. .**.** If
2c450 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c   successful, sql
2c460 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
2c470 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ean() is called 
2c480 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a  on the page and.
2c490 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
2c4a0 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
2c4b0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
2c4c0 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b  le trying to mak
2c4d0 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c  e the.** page cl
2c4e0 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  ean, the IO erro
2c4f0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
2c500 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ed. If the page 
2c510 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64  cannot be.** mad
2c520 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65  e clean for some
2c530 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62   other reason, b
2c540 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
2c550 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  rs, then SQLITE_
2c560 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
2c570 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63  d by sqlite3Pcac
2c580 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73  heMakeClean() is
2c590 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a   not called..*/.
2c5a0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
2c5b0 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20  Stress(void *p, 
2c5c0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
2c5d0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28  ager *pPager = (
2c5e0 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74  Pager *)p;.  int
2c5f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2c600 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ..  assert( pPg-
2c610 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
2c620 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
2c630 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
2c640 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  RTY );..  /* The
2c650 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53 59   doNotSpill NOSY
2c660 4e 43 20 62 69 74 20 69 73 20 73 65 74 20 64 75  NC bit is set du
2c670 72 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20  ring times when 
2c680 64 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a  doing a sync of.
2c690 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e    ** journal (an
2c6a0 64 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68  d adding a new h
2c6b0 65 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c  eader) is not al
2c6c0 6c 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63  lowed.  This occ
2c6d0 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20  urs.  ** during 
2c6e0 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
2c6f0 50 61 67 65 72 57 72 69 74 65 28 29 20 77 68 69  PagerWrite() whi
2c700 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75  le trying to jou
2c710 72 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20  rnal multiple.  
2c720 2a 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69  ** pages belongi
2c730 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73  ng to the same s
2c740 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ector..  **.  **
2c750 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20   The doNotSpill 
2c760 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 4f 46 46  ROLLBACK and OFF
2c770 20 62 69 74 73 20 69 6e 68 69 62 69 74 73 20 61   bits inhibits a
2c780 6c 6c 20 63 61 63 68 65 20 73 70 69 6c 6c 69 6e  ll cache spillin
2c790 67 0a 20 20 2a 2a 20 72 65 67 61 72 64 6c 65 73  g.  ** regardles
2c7a0 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20  s of whether or 
2c7b0 6e 6f 74 20 61 20 73 79 6e 63 20 69 73 20 72 65  not a sync is re
2c7c0 71 75 69 72 65 64 2e 20 20 54 68 69 73 20 69 73  quired.  This is
2c7d0 20 73 65 74 20 64 75 72 69 6e 67 0a 20 20 2a 2a   set during.  **
2c7e0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 62   a rollback or b
2c7f0 79 20 75 73 65 72 20 72 65 71 75 65 73 74 2c 20  y user request, 
2c800 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20  respectively..  
2c810 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67  **.  ** Spilling
2c820 20 69 73 20 61 6c 73 6f 20 70 72 6f 68 69 62 69   is also prohibi
2c830 74 65 64 20 77 68 65 6e 20 69 6e 20 61 6e 20 65  ted when in an e
2c840 72 72 6f 72 20 73 74 61 74 65 20 73 69 6e 63 65  rror state since
2c850 20 74 68 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a   that could.  **
2c860 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
2c870 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20  e corruption.   
2c880 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  In the current i
2c890 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 74  mplementation it
2c8a0 20 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73   .  ** is imposs
2c8b0 69 62 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33  ible for sqlite3
2c8c0 50 63 61 63 68 65 46 65 74 63 68 28 29 20 74 6f  PcacheFetch() to
2c8d0 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20   be called with 
2c8e0 63 72 65 61 74 65 46 6c 61 67 3d 3d 33 0a 20 20  createFlag==3.  
2c8f0 2a 2a 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  ** while in the 
2c900 65 72 72 6f 72 20 73 74 61 74 65 2c 20 68 65 6e  error state, hen
2c910 63 65 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69  ce it is impossi
2c920 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75  ble for this rou
2c930 74 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20  tine to.  ** be 
2c940 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 65 72  called in the er
2c950 72 6f 72 20 73 74 61 74 65 2e 20 20 4e 65 76 65  ror state.  Neve
2c960 72 74 68 65 6c 65 73 73 2c 20 77 65 20 69 6e 63  rtheless, we inc
2c970 6c 75 64 65 20 61 20 4e 45 56 45 52 28 29 0a 20  lude a NEVER(). 
2c980 20 2a 2a 20 74 65 73 74 20 66 6f 72 20 74 68 65   ** test for the
2c990 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 73 20   error state as 
2c9a0 61 20 73 61 66 65 67 75 61 72 64 20 61 67 61 69  a safeguard agai
2c9b0 6e 73 74 20 66 75 74 75 72 65 20 63 68 61 6e 67  nst future chang
2c9c0 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e  es..  */.  if( N
2c9d0 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
2c9e0 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 53  Code) ) return S
2c9f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74 65 73 74  QLITE_OK;.  test
2ca00 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f  case( pPager->do
2ca10 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c  NotSpill & SPILL
2ca20 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b  FLAG_ROLLBACK );
2ca30 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61  .  testcase( pPa
2ca40 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
2ca50 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20  & SPILLFLAG_OFF 
2ca60 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
2ca70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
2ca80 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f  l & SPILLFLAG_NO
2ca90 53 59 4e 43 20 29 3b 0a 20 20 69 66 28 20 70 50  SYNC );.  if( pP
2caa0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
2cab0 0a 20 20 20 26 26 20 28 28 70 50 61 67 65 72 2d  .   && ((pPager-
2cac0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 28 53  >doNotSpill & (S
2cad0 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
2cae0 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 29  K|SPILLFLAG_OFF)
2caf0 29 21 3d 30 0a 20 20 20 20 20 20 7c 7c 20 28 70  )!=0.      || (p
2cb00 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
2cb10 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 29  R_NEED_SYNC)!=0)
2cb20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2cb30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2cb40 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74  .  pPager->aStat
2cb50 5b 50 41 47 45 52 5f 53 54 41 54 5f 53 50 49 4c  [PAGER_STAT_SPIL
2cb60 4c 5d 2b 2b 3b 0a 20 20 70 50 67 2d 3e 70 44 69  L]++;.  pPg->pDi
2cb70 72 74 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  rty = 0;.  if( p
2cb80 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
2cb90 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 72 69  r) ){.    /* Wri
2cba0 74 65 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d  te a single fram
2cbb0 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  e for this page 
2cbc0 74 6f 20 74 68 65 20 6c 6f 67 2e 20 2a 2f 0a 20  to the log. */. 
2cbd0 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e     rc = subjourn
2cbe0 61 6c 50 61 67 65 49 66 52 65 71 75 69 72 65 64  alPageIfRequired
2cbf0 28 70 50 67 29 3b 20 0a 20 20 20 20 69 66 28 20  (pPg); .    if( 
2cc00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2cc10 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2cc20 72 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65  rWalFrames(pPage
2cc30 72 2c 20 70 50 67 2c 20 30 2c 20 30 29 3b 0a 20  r, pPg, 0, 0);. 
2cc40 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2cc50 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45    .#ifdef SQLITE
2cc60 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54  _ENABLE_BATCH_AT
2cc70 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 69  OMIC_WRITE.    i
2cc80 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
2cc90 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ile==0 ){.      
2cca0 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72  rc = sqlite3Jour
2ccb0 6e 61 6c 43 72 65 61 74 65 28 70 50 61 67 65 72  nalCreate(pPager
2ccc0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66  ->jfd);.      if
2ccd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2cce0 29 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65  ) return pager_e
2ccf0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
2cd00 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
2cd10 20 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68   .    /* Sync th
2cd20 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2cd30 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
2cd40 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67     if( pPg->flag
2cd50 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
2cd60 43 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67 65  C .     || pPage
2cd70 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
2cd80 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
2cd90 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
2cda0 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
2cdb0 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d  Pager, 1);.    }
2cdc0 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  .  .    /* Write
2cdd0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2cde0 20 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f   the page out to
2cdf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2ce00 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  le. */.    if( r
2ce10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2ce20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
2ce30 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2ce40 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b  NEED_SYNC)==0 );
2ce50 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2ce60 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
2ce70 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 20  (pPager, pPg);. 
2ce80 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
2ce90 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
2cea0 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20  clean. */.  if( 
2ceb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2cec0 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
2ced0 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67 65  ("STRESS %d page
2cee0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
2cef0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
2cf00 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  no));.    sqlite
2cf10 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
2cf20 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  (pPg);.  }..  re
2cf30 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
2cf40 28 70 50 61 67 65 72 2c 20 72 63 29 3b 20 0a 7d  (pPager, rc); .}
2cf50 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6c  ../*.** Flush al
2cf60 6c 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 64  l unreferenced d
2cf70 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 64 69  irty pages to di
2cf80 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sk..*/.int sqlit
2cf90 65 33 50 61 67 65 72 46 6c 75 73 68 28 50 61 67  e3PagerFlush(Pag
2cfa0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2cfb0 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e  nt rc = pPager->
2cfc0 65 72 72 43 6f 64 65 3b 0a 20 20 69 66 28 20 21  errCode;.  if( !
2cfd0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48  MEMDB ){.    PgH
2cfe0 64 72 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69  dr *pList = sqli
2cff0 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
2d000 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
2d010 68 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  he);.    assert(
2d020 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
2d030 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
2d040 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
2d050 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74  LITE_OK && pList
2d060 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20   ){.      PgHdr 
2d070 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e  *pNext = pList->
2d080 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20 69 66  pDirty;.      if
2d090 28 20 70 4c 69 73 74 2d 3e 6e 52 65 66 3d 3d 30  ( pList->nRef==0
2d0a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2d0b0 20 70 61 67 65 72 53 74 72 65 73 73 28 28 76 6f   pagerStress((vo
2d0c0 69 64 2a 29 70 50 61 67 65 72 2c 20 70 4c 69 73  id*)pPager, pLis
2d0d0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
2d0e0 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b    pList = pNext;
2d0f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
2d100 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2d110 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
2d120 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20  nitialize a new 
2d130 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64  Pager object and
2d140 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74   put a pointer t
2d150 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61  o it.** in *ppPa
2d160 67 65 72 2e 20 54 68 65 20 70 61 67 65 72 20 73  ger. The pager s
2d170 68 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79  hould eventually
2d180 20 62 65 20 66 72 65 65 64 20 62 79 20 70 61 73   be freed by pas
2d190 73 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71  sing it.** to sq
2d1a0 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
2d1b0 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69  )..**.** The zFi
2d1c0 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20  lename argument 
2d1d0 69 73 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  is the path to t
2d1e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2d1f0 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20   to open..** If 
2d200 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
2d210 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
2d220 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
2d230 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
2d240 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
2d250 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
2d260 63 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72  cached. Temporar
2d270 79 20 66 69 6c 65 73 20 61 72 65 20 62 65 20 64  y files are be d
2d280 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61  eleted.** automa
2d290 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65  tically when the
2d2a0 79 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66  y are closed. If
2d2b0 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
2d2c0 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a  memory:" then .*
2d2d0 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * all informatio
2d2e0 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63  n is held in cac
2d2f0 68 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20  he. It is never 
2d300 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
2d310 20 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65   .** This can be
2d320 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
2d330 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  nt an in-memory 
2d340 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
2d350 54 68 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d  The nExtra param
2d360 65 74 65 72 20 73 70 65 63 69 66 69 65 73 20 74  eter specifies t
2d370 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
2d380 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  es of space allo
2d390 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77  cated.** along w
2d3a0 69 74 68 20 65 61 63 68 20 70 61 67 65 20 72 65  ith each page re
2d3b0 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70  ference. This sp
2d3c0 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ace is available
2d3d0 20 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20   to the user.** 
2d3e0 76 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 50  via the sqlite3P
2d3f0 61 67 65 72 47 65 74 45 78 74 72 61 28 29 20 41  agerGetExtra() A
2d400 50 49 2e 20 20 57 68 65 6e 20 61 20 6e 65 77 20  PI.  When a new 
2d410 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  page is allocate
2d420 64 2c 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  d, the.** first 
2d430 38 20 62 79 74 65 73 20 6f 66 20 74 68 69 73 20  8 bytes of this 
2d440 73 70 61 63 65 20 61 72 65 20 7a 65 72 6f 65 64  space are zeroed
2d450 20 62 75 74 20 74 68 65 20 72 65 6d 61 69 6e 64   but the remaind
2d460 65 72 20 69 73 20 75 6e 69 6e 69 74 69 61 6c 69  er is uninitiali
2d470 7a 65 64 2e 0a 2a 2a 20 28 54 68 65 20 65 78 74  zed..** (The ext
2d480 72 61 20 73 70 61 63 65 20 69 73 20 75 73 65 64  ra space is used
2d490 20 62 79 20 62 74 72 65 65 20 61 73 20 74 68 65   by btree as the
2d4a0 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 2e   MemPage object.
2d4b0 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ).**.** The flag
2d4c0 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73  s argument is us
2d4d0 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 70 72  ed to specify pr
2d4e0 6f 70 65 72 74 69 65 73 20 74 68 61 74 20 61 66  operties that af
2d4f0 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72  fect the.** oper
2d500 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67  ation of the pag
2d510 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65  er. It should be
2d520 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74   passed some bit
2d530 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wise combination
2d540 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52  .** of the PAGER
2d550 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20  _* flags..**.** 
2d560 54 68 65 20 76 66 73 46 6c 61 67 73 20 70 61 72  The vfsFlags par
2d570 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d  ameter is a bitm
2d580 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74  ask to pass to t
2d590 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74  he flags paramet
2d5a0 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70  er.** of the xOp
2d5b0 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74  en() method of t
2d5c0 68 65 20 73 75 70 70 6c 69 65 64 20 56 46 53 20  he supplied VFS 
2d5d0 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c  when opening fil
2d5e0 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  es. .**.** If th
2d5f0 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69  e pager object i
2d600 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
2d610 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
2d620 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75  le opened .** su
2d630 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49  ccessfully, SQLI
2d640 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2d650 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73  d and *ppPager s
2d660 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a  et to point to.*
2d670 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 72 20  * the new pager 
2d680 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72  object. If an er
2d690 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50  ror occurs, *ppP
2d6a0 61 67 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e  ager is set to N
2d6b0 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72  ULL.** and error
2d6c0 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20   code returned. 
2d6d0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
2d6e0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
2d6f0 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65  NOMEM.** (sqlite
2d700 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65  3Malloc() is use
2d710 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  d to allocate me
2d720 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41  mory), SQLITE_CA
2d730 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61  NTOPEN or .** va
2d740 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f  rious SQLITE_IO_
2d750 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69  XXX errors..*/.i
2d760 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
2d770 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
2d780 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
2d790 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66  /* The virtual f
2d7a0 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73  ile system to us
2d7b0 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70  e */.  Pager **p
2d7c0 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
2d7d0 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74  /* OUT: Return t
2d7e0 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
2d7f0 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
2d800 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
2d810 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me,   /* Name of
2d820 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2d830 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
2d840 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
2d850 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
2d860 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74  a bytes append t
2d870 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
2d880 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66   page */.  int f
2d890 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2d8a0 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e      /* flags con
2d8b0 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69  trolling this fi
2d8c0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  le */.  int vfsF
2d8d0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2d8e0 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64   /* flags passed
2d8f0 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
2d900 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
2d910 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  */.  void (*xRei
2d920 6e 69 74 29 28 44 62 50 61 67 65 2a 29 20 2f 2a  nit)(DbPage*) /*
2d930 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69   Function to rei
2d940 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 73 20  nitialize pages 
2d950 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72  */.){.  u8 *pPtr
2d960 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
2d970 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
2d980 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20  Pager object to 
2d990 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  allocate and ret
2d9a0 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  urn */.  int rc 
2d9b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2d9c0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2d9d0 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69   */.  int tempFi
2d9e0 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  le = 0;        /
2d9f0 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20  * True for temp 
2da00 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d  files (incl. in-
2da10 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f  memory files) */
2da20 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30  .  int memDb = 0
2da30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
2da40 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2da50 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  n in-memory file
2da60 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
2da70 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49 41  E_ENABLE_DESERIA
2da80 4c 49 5a 45 0a 20 20 69 6e 74 20 6d 65 6d 4a 4d  LIZE.  int memJM
2da90 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2daa0 2f 2a 20 4d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  /* Memory journa
2dab0 6c 20 6d 6f 64 65 20 2a 2f 0a 23 65 6c 73 65 0a  l mode */.#else.
2dac0 23 20 64 65 66 69 6e 65 20 6d 65 6d 4a 4d 20 30  # define memJM 0
2dad0 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 72 65  .#endif.  int re
2dae0 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20  adOnly = 0;     
2daf0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2db00 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c  is is a read-onl
2db10 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  y file */.  int 
2db20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b  journalFileSize;
2db30 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f       /* Bytes to
2db40 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61   allocate for ea
2db50 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f  ch journal fd */
2db60 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61  .  char *zPathna
2db70 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46  me = 0;     /* F
2db80 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61  ull path to data
2db90 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
2dba0 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30  nt nPathname = 0
2dbb0 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ;       /* Numbe
2dbc0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50  r of bytes in zP
2dbd0 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  athname */.  int
2dbe0 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66   useJournal = (f
2dbf0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49  lags & PAGER_OMI
2dc00 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f  T_JOURNAL)==0; /
2dc10 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20  * False to omit 
2dc20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
2dc30 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71   pcacheSize = sq
2dc40 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28  lite3PcacheSize(
2dc50 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65  );       /* Byte
2dc60 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f  s to allocate fo
2dc70 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 33  r PCache */.  u3
2dc80 32 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53  2 szPageDflt = S
2dc90 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
2dca0 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66  GE_SIZE;  /* Def
2dcb0 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a  ault page size *
2dcc0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2dcd0 7a 55 72 69 20 3d 20 30 3b 20 20 20 20 2f 2a 20  zUri = 0;    /* 
2dce0 55 52 49 20 61 72 67 73 20 74 6f 20 63 6f 70 79  URI args to copy
2dcf0 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d   */.  int nUri =
2dd00 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
2dd10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
2dd20 73 20 6f 66 20 55 52 49 20 61 72 67 73 20 61 74  s of URI args at
2dd30 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f 2a 20   *zUri */..  /* 
2dd40 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
2dd50 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65 71  uch space is req
2dd60 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a  uired for each j
2dd70 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64  ournal file-hand
2dd80 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61  le.  ** (there a
2dd90 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20  re two of them, 
2dda0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
2ddb0 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75   and the sub-jou
2ddc0 72 6e 61 6c 29 2e 20 20 2a 2f 0a 20 20 6a 6f 75  rnal).  */.  jou
2ddd0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52  rnalFileSize = R
2dde0 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a 6f 75  OUND8(sqlite3Jou
2ddf0 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 29 3b  rnalSize(pVfs));
2de00 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f  ..  /* Set the o
2de10 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 74  utput variable t
2de20 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61  o NULL in case a
2de30 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  n error occurs. 
2de40 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  */.  *ppPager = 
2de50 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0;..#ifndef SQLI
2de60 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
2de70 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 50  .  if( flags & P
2de80 41 47 45 52 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  AGER_MEMORY ){. 
2de90 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20     memDb = 1;.  
2dea0 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
2deb0 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
2dec0 29 7b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61  ){.      zPathna
2ded0 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
2dee0 72 44 75 70 28 30 2c 20 7a 46 69 6c 65 6e 61 6d  rDup(0, zFilenam
2def0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  e);.      if( zP
2df00 61 74 68 6e 61 6d 65 3d 3d 30 20 20 29 20 72 65  athname==0  ) re
2df10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2df20 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 6e 50  M_BKPT;.      nP
2df30 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
2df40 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e  3Strlen30(zPathn
2df50 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 46 69 6c  ame);.      zFil
2df60 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d  ename = 0;.    }
2df70 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
2df80 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74  * Compute and st
2df90 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74  ore the full pat
2dfa0 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f  hname in an allo
2dfb0 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f 69  cated buffer poi
2dfc0 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20  nted.  ** to by 
2dfd0 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74  zPathname, lengt
2dfe0 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c  h nPathname. Or,
2dff0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74 65   if this is a te
2e000 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20  mporary file,.  
2e010 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50  ** leave both nP
2e020 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74  athname and zPat
2e030 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a  hname set to 0..
2e040 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
2e050 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
2e060 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f 6e 73  e[0] ){.    cons
2e070 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 6e  t char *z;.    n
2e080 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d  Pathname = pVfs-
2e090 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20  >mxPathname+1;. 
2e0a0 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73     zPathname = s
2e0b0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
2e0c0 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d 65 2a 32  w(0, nPathname*2
2e0d0 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68  );.    if( zPath
2e0e0 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  name==0 ){.     
2e0f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2e100 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
2e110 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30  .    zPathname[0
2e120 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73  ] = 0; /* Make s
2e130 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ure initialized 
2e140 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61 74 68  even if FullPath
2e150 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a  name() fails */.
2e160 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e170 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70  OsFullPathname(p
2e180 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  Vfs, zFilename, 
2e190 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68  nPathname, zPath
2e1a0 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50 61 74 68  name);.    nPath
2e1b0 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  name = sqlite3St
2e1c0 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65  rlen30(zPathname
2e1d0 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55 72 69 20  );.    z = zUri 
2e1e0 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b 73 71 6c  = &zFilename[sql
2e1f0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
2e200 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20 20 20  lename)+1];.    
2e210 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20  while( *z ){.   
2e220 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33 53     z += sqlite3S
2e230 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20 20  trlen30(z)+1;.  
2e240 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65 33      z += sqlite3
2e250 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a 20  Strlen30(z)+1;. 
2e260 20 20 20 7d 0a 20 20 20 20 6e 55 72 69 20 3d 20     }.    nUri = 
2e270 28 69 6e 74 29 28 26 7a 5b 31 5d 20 2d 20 7a 55  (int)(&z[1] - zU
2e280 72 69 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ri);.    assert(
2e290 20 6e 55 72 69 3e 3d 30 20 29 3b 0a 20 20 20 20   nUri>=0 );.    
2e2a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2e2b0 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38  K && nPathname+8
2e2c0 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
2e2d0 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  e ){.      /* Th
2e2e0 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
2e2f0 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  en when the jour
2e300 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69 72 65  nal path require
2e310 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68  d by.      ** th
2e320 65 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67  e database being
2e330 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20   opened will be 
2e340 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e  more than pVfs->
2e350 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20  mxPathname.     
2e360 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e   ** bytes in len
2e370 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  gth. This means 
2e380 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
2e390 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20  not be opened,. 
2e3a0 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69       ** as it wi
2e3b0 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ll not be possib
2e3c0 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a  le to open the j
2e3d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65  ournal file or e
2e3e0 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65  ven.      ** che
2e3f0 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ck for a hot-jou
2e400 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64  rnal before read
2e410 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ing..      */.  
2e420 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2e430 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
2e440 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
2e450 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e460 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
2e470 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  e(0, zPathname);
2e480 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2e490 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
2e4a0 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
2e4b0 79 20 66 6f 72 20 74 68 65 20 50 61 67 65 72 20  y for the Pager 
2e4c0 73 74 72 75 63 74 75 72 65 2c 20 50 43 61 63 68  structure, PCach
2e4d0 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20  e object, the.  
2e4e0 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64 65  ** three file de
2e4f0 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64  scriptors, the d
2e500 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
2e510 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  e and the journa
2e520 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d  l .  ** file nam
2e530 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e  e. The layout in
2e540 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f   memory is as fo
2e550 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  llows:.  **.  **
2e560 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63       Pager objec
2e570 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2e580 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67       (sizeof(Pag
2e590 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20  er) bytes).  ** 
2e5a0 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63      PCache objec
2e5b0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2e5c0 20 20 20 20 28 73 71 6c 69 74 65 33 50 63 61 63      (sqlite3Pcac
2e5d0 68 65 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a  heSize() bytes).
2e5e0 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73    **     Databas
2e5f0 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  e file handle   
2e600 20 20 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e           (pVfs->
2e610 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a  szOsFile bytes).
2e620 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75    **     Sub-jou
2e630 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
2e640 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61           (journa
2e650 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29  lFileSize bytes)
2e660 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a  .  **     Main j
2e670 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
2e680 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e  le        (journ
2e690 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73  alFileSize bytes
2e6a0 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62  ).  **     Datab
2e6b0 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20  ase file name   
2e6c0 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74             (nPat
2e6d0 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20  hname+1 bytes). 
2e6e0 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20   **     Journal 
2e6f0 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20  file name       
2e700 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61          (nPathna
2e710 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20  me+8+1 bytes).  
2e720 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20  */.  pPtr = (u8 
2e730 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
2e740 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28  ero(.    ROUND8(
2e750 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29  sizeof(*pPager))
2e760 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72   +      /* Pager
2e770 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
2e780 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53    ROUND8(pcacheS
2e790 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20 20  ize) +          
2e7a0 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63   /* PCache objec
2e7b0 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28  t */.    ROUND8(
2e7c0 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20  pVfs->szOsFile) 
2e7d0 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d  +       /* The m
2e7e0 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20  ain db file */. 
2e7f0 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
2e800 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20  ze * 2 +        
2e810 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75    /* The two jou
2e820 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20  rnal files */ . 
2e830 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31     nPathname + 1
2e840 20 2b 20 6e 55 72 69 20 2b 20 20 20 20 20 20 20   + nUri +       
2e850 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a    /* zFilename *
2e860 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  /.    nPathname 
2e870 2b 20 38 20 2b 20 32 20 20 20 20 20 20 20 20 20  + 8 + 2         
2e880 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c       /* zJournal
2e890 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
2e8a0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
2e8b0 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 20  + nPathname + 4 
2e8c0 2b 20 32 20 20 20 20 20 20 20 20 20 20 20 20 2f  + 2            /
2e8d0 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64 69 66  * zWal */.#endif
2e8e0 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
2e8f0 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
2e900 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54 5f  MENT(SQLITE_INT_
2e910 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46 69  TO_PTR(journalFi
2e920 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20 69 66  leSize)) );.  if
2e930 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73  ( !pPtr ){.    s
2e940 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
2e950 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2e960 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2e970 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
2e980 70 50 61 67 65 72 20 3d 20 20 20 20 20 20 20 20  pPager =        
2e990 20 20 20 20 20 20 28 50 61 67 65 72 2a 29 28 70        (Pager*)(p
2e9a0 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Ptr);.  pPager->
2e9b0 70 50 43 61 63 68 65 20 3d 20 20 20 20 28 50 43  pPCache =    (PC
2e9c0 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d 20 52  ache*)(pPtr += R
2e9d0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50  OUND8(sizeof(*pP
2e9e0 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61 67 65  ager)));.  pPage
2e9f0 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c 69 74  r->fd =   (sqlit
2ea00 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b  e3_file*)(pPtr +
2ea10 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53  = ROUND8(pcacheS
2ea20 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  ize));.  pPager-
2ea30 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33  >sjfd = (sqlite3
2ea40 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20  _file*)(pPtr += 
2ea50 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f  ROUND8(pVfs->szO
2ea60 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61 67 65  sFile));.  pPage
2ea70 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69 74  r->jfd =  (sqlit
2ea80 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b  e3_file*)(pPtr +
2ea90 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  = journalFileSiz
2eaa0 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46  e);.  pPager->zF
2eab0 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28 63 68  ilename =    (ch
2eac0 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75  ar*)(pPtr += jou
2ead0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20  rnalFileSize);. 
2eae0 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
2eaf0 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50  YTE_ALIGNMENT(pP
2eb00 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20  ager->jfd) );.. 
2eb10 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
2eb20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20  Pager.zFilename 
2eb30 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e  and Pager.zJourn
2eb40 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20 72  al buffers, if r
2eb50 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66  equired. */.  if
2eb60 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ( zPathname ){. 
2eb70 20 20 20 61 73 73 65 72 74 28 20 6e 50 61 74 68     assert( nPath
2eb80 6e 61 6d 65 3e 30 20 29 3b 0a 20 20 20 20 70 50  name>0 );.    pP
2eb90 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d  ager->zJournal =
2eba0 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20     (char*)(pPtr 
2ebb0 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31  += nPathname + 1
2ebc0 20 2b 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65   + nUri);.    me
2ebd0 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69  mcpy(pPager->zFi
2ebe0 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  lename, zPathnam
2ebf0 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, nPathname);. 
2ec00 20 20 20 69 66 28 20 6e 55 72 69 20 29 20 6d 65     if( nUri ) me
2ec10 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 46  mcpy(&pPager->zF
2ec20 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d  ilename[nPathnam
2ec30 65 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e 55 72 69  e+1], zUri, nUri
2ec40 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  );.    memcpy(pP
2ec50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
2ec60 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
2ec70 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70  name);.    memcp
2ec80 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  y(&pPager->zJour
2ec90 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20  nal[nPathname], 
2eca0 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30 30 22 2c 20  "-journal\000", 
2ecb0 38 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  8+2);.    sqlite
2ecc0 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 50 61  3FileSuffix3(pPa
2ecd0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
2ece0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2ecf0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2ed00 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 70  E_OMIT_WAL.    p
2ed10 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d 20 26 70  Pager->zWal = &p
2ed20 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
2ed30 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 5d 3b 0a  nPathname+8+1];.
2ed40 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
2ed50 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74 68 6e 61  r->zWal, zPathna
2ed60 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a  me, nPathname);.
2ed70 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
2ed80 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68 6e 61  er->zWal[nPathna
2ed90 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30 30 30 22 2c  me], "-wal\000",
2eda0 20 34 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74   4+1);.    sqlit
2edb0 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 50  e3FileSuffix3(pP
2edc0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2edd0 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 29 3b 0a   pPager->zWal);.
2ede0 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
2edf0 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74  e3DbFree(0, zPat
2ee00 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50  hname);.  }.  pP
2ee10 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66  ager->pVfs = pVf
2ee20 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73  s;.  pPager->vfs
2ee30 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73  Flags = vfsFlags
2ee40 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
2ee50 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a   pager file..  *
2ee60 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
2ee70 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
2ee80 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f 75  ] ){.    int fou
2ee90 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
2eea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53            /* VFS
2eeb0 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20   flags returned 
2eec0 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  by xOpen() */.  
2eed0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2eee0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
2eef0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50  r->zFilename, pP
2ef00 61 67 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c 61  ager->fd, vfsFla
2ef10 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20  gs, &fout);.    
2ef20 61 73 73 65 72 74 28 20 21 6d 65 6d 44 62 20 29  assert( !memDb )
2ef30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
2ef40 45 4e 41 42 4c 45 5f 44 45 53 45 52 49 41 4c 49  ENABLE_DESERIALI
2ef50 5a 45 0a 20 20 20 20 6d 65 6d 4a 4d 20 3d 20 28  ZE.    memJM = (
2ef60 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
2ef70 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e  _MEMORY)!=0;.#en
2ef80 64 69 66 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79  dif.    readOnly
2ef90 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f   = (fout&SQLITE_
2efa0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 21 3d  OPEN_READONLY)!=
2efb0 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  0;..    /* If th
2efc0 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65  e file was succe
2efd0 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66  ssfully opened f
2efe0 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
2eff0 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f  cess,.    ** cho
2f000 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61  ose a default pa
2f010 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20  ge size in case 
2f020 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74  we have to creat
2f030 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
2f040 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
2f050 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
2f060 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  e is the maximum
2f070 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
2f080 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44  **    + SQLITE_D
2f090 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2f0a0 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68  ,.    **    + Th
2f0b0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
2f0c0 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63   by sqlite3OsSec
2f0d0 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a  torSize().    **
2f0e0 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73      + The larges
2f0f0 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74  t page size that
2f100 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
2f110 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20  atomically..    
2f120 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
2f130 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f140 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69    int iDc = sqli
2f150 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
2f160 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
2f170 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 69 66  r->fd);.      if
2f180 28 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  ( !readOnly ){. 
2f190 20 20 20 20 20 20 20 73 65 74 53 65 63 74 6f 72         setSector
2f1a0 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
2f1b0 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2f1c0 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
2f1d0 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41  _SIZE<=SQLITE_MA
2f1e0 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
2f1f0 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66  IZE);.        if
2f200 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61  ( szPageDflt<pPa
2f210 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
2f220 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2f230 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
2f240 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ize>SQLITE_MAX_D
2f250 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2f260 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f270 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
2f280 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2f290 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20  PAGE_SIZE;.     
2f2a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2f2b0 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66          szPageDf
2f2c0 6c 74 20 3d 20 28 75 33 32 29 70 50 61 67 65 72  lt = (u32)pPager
2f2d0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20  ->sectorSize;.  
2f2e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f2f0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
2f300 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
2f310 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 7b 0a  WRITE.        {.
2f320 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69            int ii
2f330 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
2f340 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
2f350 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e  ATOMIC512==(512>
2f360 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >8));.          
2f370 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
2f380 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28  CAP_ATOMIC64K==(
2f390 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20  65536>>8));.    
2f3a0 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
2f3b0 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
2f3c0 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36  PAGE_SIZE<=65536
2f3d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  );.          for
2f3e0 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20  (ii=szPageDflt; 
2f3f0 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ii<=SQLITE_MAX_D
2f400 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2f410 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20  ; ii=ii*2){.    
2f420 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26          if( iDc&
2f430 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
2f440 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b  OMIC|(ii>>8)) ){
2f450 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
2f460 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a  zPageDflt = ii;.
2f470 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2f480 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f490 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
2f4a0 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
2f4b0 3e 6e 6f 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65  >noLock = sqlite
2f4c0 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46  3_uri_boolean(zF
2f4d0 69 6c 65 6e 61 6d 65 2c 20 22 6e 6f 6c 6f 63 6b  ilename, "nolock
2f4e0 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ", 0);.      if(
2f4f0 20 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49   (iDc & SQLITE_I
2f500 4f 43 41 50 5f 49 4d 4d 55 54 41 42 4c 45 29 21  OCAP_IMMUTABLE)!
2f510 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c  =0.       || sql
2f520 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
2f530 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 69 6d 6d  (zFilename, "imm
2f540 75 74 61 62 6c 65 22 2c 20 30 29 20 29 7b 0a 20  utable", 0) ){. 
2f550 20 20 20 20 20 20 20 20 20 76 66 73 46 6c 61 67           vfsFlag
2f560 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
2f570 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
2f580 20 20 20 20 20 67 6f 74 6f 20 61 63 74 5f 6c 69       goto act_li
2f590 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3b 0a 20 20  ke_temp_file;.  
2f5a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
2f5b0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  lse{.    /* If a
2f5c0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
2f5d0 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
2f5e0 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69   is not opened i
2f5f0 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20  mmediately..    
2f600 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
2f610 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65  we accept the de
2f620 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
2f630 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c  and delay actual
2f640 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e  ly.    ** openin
2f650 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c  g the file until
2f660 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
2f670 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20  to OsWrite()..  
2f680 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
2f690 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20   branch is also 
2f6a0 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  run for an in-me
2f6b0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 41  mory database. A
2f6c0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20  n in-memory.    
2f6d0 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 74  ** database is t
2f6e0 68 65 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d  he same as a tem
2f6f0 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e  p-file that is n
2f700 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74  ever written out
2f710 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20   to.    ** disk 
2f720 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d  and uses an in-m
2f730 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a  emory rollback j
2f740 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20  ournal..    **. 
2f750 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63     ** This branc
2f760 68 20 61 6c 73 6f 20 72 75 6e 73 20 66 6f 72 20  h also runs for 
2f770 66 69 6c 65 73 20 6d 61 72 6b 65 64 20 61 73 20  files marked as 
2f780 69 6d 6d 75 74 61 62 6c 65 2e 0a 20 20 20 20 2a  immutable..    *
2f790 2f 20 0a 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70  / .act_like_temp
2f7a0 5f 66 69 6c 65 3a 0a 20 20 20 20 74 65 6d 70 46  _file:.    tempF
2f7b0 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ile = 1;.    pPa
2f7c0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
2f7d0 47 45 52 5f 52 45 41 44 45 52 3b 20 20 20 20 20  GER_READER;     
2f7e0 2f 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61 6c  /* Pretend we al
2f7f0 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63  ready have a loc
2f800 6b 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d  k */.    pPager-
2f810 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49  >eLock = EXCLUSI
2f820 56 45 5f 4c 4f 43 4b 3b 20 20 20 20 2f 2a 20 50  VE_LOCK;    /* P
2f830 72 65 74 65 6e 64 20 77 65 20 61 72 65 20 69 6e  retend we are in
2f840 20 45 58 43 4c 55 53 49 56 45 20 6d 6f 64 65 20   EXCLUSIVE mode 
2f850 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  */.    pPager->n
2f860 6f 4c 6f 63 6b 20 3d 20 31 3b 20 20 20 20 20 20  oLock = 1;      
2f870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
2f880 6e 6f 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  no locking */.  
2f890 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66    readOnly = (vf
2f8a0 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
2f8b0 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20  EN_READONLY);.  
2f8c0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
2f8d0 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61  owing call to Pa
2f8e0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
2f8f0 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74   serves to set t
2f900 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a  he value of .  *
2f910 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  * Pager.pageSize
2f920 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65   and to allocate
2f930 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53   the Pager.pTmpS
2f940 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a  pace buffer..  *
2f950 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2f960 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
2f970 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d  ert( pPager->mem
2f980 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  Db==0 );.    rc 
2f990 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
2f9a0 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
2f9b0 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d  , &szPageDflt, -
2f9c0 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
2f9d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2f9e0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  );.  }..  /* Ini
2f9f0 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63  tialize the PCac
2fa00 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  he object. */.  
2fa10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2fa20 4b 20 29 7b 0a 20 20 20 20 6e 45 78 74 72 61 20  K ){.    nExtra 
2fa30 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29  = ROUND8(nExtra)
2fa40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 45  ;.    assert( nE
2fa50 78 74 72 61 3e 3d 38 20 26 26 20 6e 45 78 74 72  xtra>=8 && nExtr
2fa60 61 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 72 63  a<1000 );.    rc
2fa70 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
2fa80 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c  Open(szPageDflt,
2fa90 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c   nExtra, !memDb,
2faa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2fab0 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70          !memDb?p
2fac0 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76  agerStress:0, (v
2fad0 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50  oid *)pPager, pP
2fae0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
2faf0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20    }..  /* If an 
2fb00 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 61  error occurred a
2fb10 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 20  bove, free the  
2fb20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
2fb30 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69  and close the fi
2fb40 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  le..  */.  if( r
2fb50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2fb60 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
2fb70 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
2fb80 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
2fb90 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
2fba0 53 70 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69  Space);.    sqli
2fbb0 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29  te3_free(pPager)
2fbc0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
2fbd0 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41  .  }..  PAGERTRA
2fbe0 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c  CE(("OPEN %d %s\
2fbf0 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44  n", FILEHANDLEID
2fc00 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50  (pPager->fd), pP
2fc10 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
2fc20 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f  );.  IOTRACE(("O
2fc30 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50  PEN %p %s\n", pP
2fc40 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46  ager, pPager->zF
2fc50 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61  ilename))..  pPa
2fc60 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
2fc70 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c  = (u8)useJournal
2fc80 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
2fc90 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a  tmtOpen = 0; */.
2fca0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2fcb0 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20  tInUse = 0; */. 
2fcc0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   /* pPager->nRef
2fcd0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2fce0 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
2fcf0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2fd00 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
2fd10 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2fd20 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f  r->nPage = 0; */
2fd30 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  .  pPager->mxPgn
2fd40 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50  o = SQLITE_MAX_P
2fd50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20  AGE_COUNT;.  /* 
2fd60 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
2fd70 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f  PAGER_UNLOCK; */
2fd80 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72  .  /* pPager->er
2fd90 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20  rMask = 0; */.  
2fda0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2fdb0 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b   = (u8)tempFile;
2fdc0 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46  .  assert( tempF
2fdd0 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
2fde0 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20  NGMODE_NORMAL . 
2fdf0 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70           || temp
2fe00 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
2fe10 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
2fe20 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  E );.  assert( P
2fe30 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2fe40 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b  _EXCLUSIVE==1 );
2fe50 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
2fe60 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74  siveMode = (u8)t
2fe70 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67  empFile; .  pPag
2fe80 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
2fe90 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  one = pPager->te
2fea0 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
2feb0 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65  ->memDb = (u8)me
2fec0 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72  mDb;.  pPager->r
2fed0 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65  eadOnly = (u8)re
2fee0 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74  adOnly;.  assert
2fef0 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20  ( useJournal || 
2ff00 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
2ff10 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f   );.  pPager->no
2ff20 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74  Sync = pPager->t
2ff30 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 70  empFile;.  if( p
2ff40 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
2ff50 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2ff60 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30  ger->fullSync==0
2ff70 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2ff80 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e  pPager->extraSyn
2ff90 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
2ffa0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  rt( pPager->sync
2ffb0 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20  Flags==0 );.    
2ffc0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2ffd0 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20  walSyncFlags==0 
2ffe0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2fff0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
30000 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
30010 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 30 3b  ->extraSync = 0;
30020 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
30030 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
30040 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  SYNC_NORMAL;.   
30050 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63   pPager->walSync
30060 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
30070 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 28 53 51  YNC_NORMAL | (SQ
30080 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
30090 3c 3c 32 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  <<2);.  }.  /* p
300a0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
300b0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
300c0 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
300d0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
300e0 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20  ger->pLast = 0; 
300f0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78  */.  pPager->nEx
30100 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72  tra = (u16)nExtr
30110 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  a;.  pPager->jou
30120 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20  rnalSizeLimit = 
30130 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a  SQLITE_DEFAULT_J
30140 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49  OURNAL_SIZE_LIMI
30150 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  T;.  assert( isO
30160 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
30170 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  || tempFile );. 
30180 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
30190 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 75  Pager);.  if( !u
301a0 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
301b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
301c0 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
301d0 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20  RNALMODE_OFF;.  
301e0 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62 20  }else if( memDb 
301f0 7c 7c 20 6d 65 6d 4a 4d 20 29 7b 0a 20 20 20 20  || memJM ){.    
30200 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
30210 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
30220 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a  NALMODE_MEMORY;.
30230 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d    }.  /* pPager-
30240 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >xBusyHandler = 
30250 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
30260 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
30270 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  rg = 0; */.  pPa
30280 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d  ger->xReiniter =
30290 20 78 52 65 69 6e 69 74 3b 0a 20 20 73 65 74 47   xReinit;.  setG
302a0 65 74 74 65 72 4d 65 74 68 6f 64 28 70 50 61 67  etterMethod(pPag
302b0 65 72 29 3b 0a 20 20 2f 2a 20 6d 65 6d 73 65 74  er);.  /* memset
302c0 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
302d0 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
302e0 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20  ->aHash)); */.  
302f0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61  /* pPager->szMma
30300 70 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  p = SQLITE_DEFAU
30310 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45 20 2f 2f 20  LT_MMAP_SIZE // 
30320 77 69 6c 6c 20 62 65 20 73 65 74 20 62 79 20 62  will be set by b
30330 74 72 65 65 2e 63 20 2a 2f 0a 0a 20 20 2a 70 70  tree.c */..  *pp
30340 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
30350 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30360 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54  OK;.}..../*.** T
30370 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
30380 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61  called after tra
30390 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20  nsitioning from 
303a0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a  PAGER_UNLOCK to.
303b0 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  ** PAGER_SHARED 
303c0 73 74 61 74 65 2e 20 49 74 20 74 65 73 74 73 20  state. It tests 
303d0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  if there is a ho
303e0 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e  t journal presen
303f0 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65  t in.** the file
30400 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20  -system for the 
30410 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68  given pager. A h
30420 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e  ot journal is on
30430 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73  e that .** needs
30440 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
30450 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f  ck. According to
30460 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
30470 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  a hot-journal.**
30480 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 66 20   file exists if 
30490 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72  the following cr
304a0 69 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a 0a  iteria are met:.
304b0 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f  **.**   * The jo
304c0 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
304d0 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79  s in the file sy
304e0 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  stem, and.**   *
304f0 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c 64   No process hold
30500 73 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  s a RESERVED or 
30510 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
30520 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30530 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68  e, and.**   * Th
30540 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
30550 69 74 73 65 6c 66 20 69 73 20 67 72 65 61 74 65  itself is greate
30560 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69  r than 0 bytes i
30570 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20  n size, and.**  
30580 20 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74   * The first byt
30590 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
305a0 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64   file exists and
305b0 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a   is not 0x00..**
305c0 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
305d0 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
305e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
305f0 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20  0 but a journal 
30600 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20  file.** exists, 
30610 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79  that is probably
30620 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
30630 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61  left over from a
30640 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61   prior.** databa
30650 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  se with the same
30660 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63   name. In this c
30670 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ase the journal 
30680 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20  file is.** just 
30690 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73  deleted using Os
306a0 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73  Delete, *pExists
306b0 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64   is set to 0 and
306c0 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
306d0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
306e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
306f0 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66 20  es not check if 
30700 74 68 65 72 65 20 69 73 20 61 20 6d 61 73 74 65  there is a maste
30710 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
30720 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  me.** at the end
30730 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49 66   of the file. If
30740 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20 74   there is, and t
30750 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  hat master journ
30760 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20  al file.** does 
30770 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20  not exist, then 
30780 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
30790 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68   is not really h
307a0 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63  ot. In this.** c
307b0 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ase this routine
307c0 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 66   will return a f
307d0 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20 54  alse-positive. T
307e0 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
307f0 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77  k().** routine w
30800 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61  ill discover tha
30810 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
30820 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  le is not really
30830 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c   hot and .** wil
30840 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61  l not roll it ba
30850 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ck. .**.** If a 
30860 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
30870 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78 69   is found to exi
30880 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20  st, *pExists is 
30890 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a  set to 1 and .**
308a0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
308b0 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a  ned. If no hot-j
308c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70  ournal file is p
308d0 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74 73  resent, *pExists
308e0 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20   is.** set to 0 
308f0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
30900 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
30910 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
30920 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f  ile trying.** to
30930 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   determine wheth
30940 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d  er or not a hot-
30950 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
30960 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  sts, the IO erro
30970 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65 74  r.** code is ret
30980 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61  urned and the va
30990 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73 20  lue of *pExists 
309a0 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  is undefined..*/
309b0 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48  .static int hasH
309c0 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  otJournal(Pager 
309d0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 45  *pPager, int *pE
309e0 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74 65  xists){.  sqlite
309f0 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
30a00 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
30a10 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  s;.  int rc = SQ
30a20 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
30a30 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
30a40 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73 74  e */.  int exist
30a50 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  s = 1;          
30a60 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
30a70 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  a journal file i
30a80 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
30a90 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21 21  nt jrnlOpen = !!
30aa0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
30ab0 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  fd);..  assert( 
30ac0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
30ad0 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
30ae0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
30af0 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  d) );.  assert( 
30b00 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
30b10 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a 20  PAGER_OPEN );.. 
30b20 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70 65   assert( jrnlOpe
30b30 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74 65  n==0 || ( sqlite
30b40 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
30b50 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
30b60 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51 4c 49  >jfd) &.    SQLI
30b70 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54  TE_IOCAP_UNDELET
30b80 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a 20  ABLE_WHEN_OPEN. 
30b90 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73   ));..  *pExists
30ba0 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a 72 6e   = 0;.  if( !jrn
30bb0 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  lOpen ){.    rc 
30bc0 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
30bd0 73 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  s(pVfs, pPager->
30be0 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
30bf0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
30c00 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20 20  &exists);.  }.  
30c10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30c20 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20  K && exists ){. 
30c30 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20     int locked = 
30c40 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
30c50 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20 70  * True if some p
30c60 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52  rocess holds a R
30c70 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a  ESERVED lock */.
30c80 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f 6e  .    /* Race con
30c90 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41 6e  dition here:  An
30ca0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69  other process mi
30cb0 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 68 6f  ght have been ho
30cc0 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  lding the.    **
30cd0 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
30ce0 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a 6f  ck and have a jo
30cf0 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74 68  urnal open at th
30d00 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  e sqlite3OsAcces
30d10 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  s() .    ** call
30d20 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65 6e   above, but then
30d30 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
30d40 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68 65  nal and drop the
30d50 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20 20   lock before.   
30d60 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74 68   ** we get to th
30d70 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69  e following sqli
30d80 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
30d90 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20 20  edLock() call.  
30da0 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69  If that.    ** i
30db0 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 69 73  s the case, this
30dc0 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 74   routine might t
30dd0 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61 20  hink there is a 
30de0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  hot journal when
30df0 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74 20  .    ** in fact 
30e00 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20 20  there is none.  
30e10 54 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e 20  This results in 
30e20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  a false-positive
30e30 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20 20   which will.    
30e40 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68  ** be dealt with
30e50 20 62 79 20 74 68 65 20 70 6c 61 79 62 61 63 6b   by the playback
30e60 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b 65   routine.  Ticke
30e70 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f 0a  t #3883..    */.
30e80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
30e90 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
30ea0 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
30eb0 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69 66  &locked);.    if
30ec0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30ed0 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20  && !locked ){.  
30ee0 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 20      Pgno nPage; 
30ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f00 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
30f10 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66  es in database f
30f20 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73  ile */..      as
30f30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
30f40 6d 70 46 69 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  mpFile==0 );.   
30f50 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
30f60 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
30f70 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  nPage);.      if
30f80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30f90 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
30fa0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
30fb0 20 7a 65 72 6f 20 70 61 67 65 73 20 69 6e 20 73   zero pages in s
30fc0 69 7a 65 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ize, that means 
30fd0 74 68 61 74 20 65 69 74 68 65 72 20 28 31 29 20  that either (1) 
30fe0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a  the.        ** j
30ff0 6f 75 72 6e 61 6c 20 69 73 20 61 20 72 65 6d 6e  ournal is a remn
31000 61 6e 74 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  ant from a prior
31010 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
31020 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 77 68 65  he same name whe
31030 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  re.        ** th
31040 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
31050 62 75 74 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72  but not the jour
31060 6e 61 6c 20 77 61 73 20 64 65 6c 65 74 65 64 2c  nal was deleted,
31070 20 6f 72 20 28 32 29 20 74 68 65 20 69 6e 69 74   or (2) the init
31080 69 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ial.        ** t
31090 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
310a0 70 6f 70 75 6c 61 74 65 73 20 61 20 6e 65 77 20  populates a new 
310b0 64 61 74 61 62 61 73 65 20 69 73 20 62 65 69 6e  database is bein
310c0 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20  g rolled back.. 
310d0 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 65 69 74         ** In eit
310e0 68 65 72 20 63 61 73 65 2c 20 74 68 65 20 6a 6f  her case, the jo
310f0 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 20 62  urnal file can b
31100 65 20 64 65 6c 65 74 65 64 2e 20 20 48 6f 77 65  e deleted.  Howe
31110 76 65 72 2c 20 74 61 6b 65 20 63 61 72 65 0a 20  ver, take care. 
31120 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 74 6f         ** not to
31130 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
31140 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69  nal file if it i
31150 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 64  s already open d
31160 75 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  ue to.        **
31170 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50 45   journal_mode=PE
31180 52 53 49 53 54 2e 0a 20 20 20 20 20 20 20 20 2a  RSIST..        *
31190 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50  /.        if( nP
311a0 61 67 65 3d 3d 30 20 26 26 20 21 6a 72 6e 6c 4f  age==0 && !jrnlO
311b0 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
311c0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
311d0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
311e0 20 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72         if( pager
311f0 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52  LockDb(pPager, R
31200 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53  ESERVED_LOCK)==S
31210 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31220 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
31230 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50  sDelete(pVfs, pP
31240 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
31250 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
31260 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
31270 6c 75 73 69 76 65 4d 6f 64 65 20 29 20 70 61 67  lusiveMode ) pag
31280 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
31290 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
312a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
312b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
312c0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
312d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
312e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
312f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
31300 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ists and no othe
31310 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  r connection has
31320 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20 20   a reserved.    
31330 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61        ** or grea
31340 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
31350 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e  database file. N
31360 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  ow check that th
31370 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20  ere is.         
31380 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   ** at least one
31390 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20   non-zero bytes 
313a0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
313b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
313c0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  ..          ** I
313d0 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e  f there is, then
313e0 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69   we consider thi
313f0 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  s journal to be 
31400 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20  hot. If not, .  
31410 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61          ** it ca
31420 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20  n be ignored..  
31430 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
31440 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70       if( !jrnlOp
31450 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
31460 20 20 69 6e 74 20 66 20 3d 20 0a 23 69 66 20 53    int f = .#if S
31470 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54  QLITE_ENABLE_DAT
31480 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20  A_PROTECTION.   
31490 20 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67             (pPag
314a0 65 72 2d 3e 76 66 73 46 6c 61 67 73 26 53 51 4c  er->vfsFlags&SQL
314b0 49 54 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52 4f  ITE_OPEN_FILEPRO
314c0 54 45 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23  TECTION_MASK)|.#
314d0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
314e0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
314f0 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
31500 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
31510 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  L;.            r
31520 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
31530 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
31540 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
31550 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20  ->jfd, f, &f);. 
31560 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31570 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
31580 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31590 20 20 20 20 20 20 75 38 20 66 69 72 73 74 20 3d        u8 first =
315a0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
315b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
315c0 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
315d0 28 76 6f 69 64 20 2a 29 26 66 69 72 73 74 2c 20  (void *)&first, 
315e0 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  1, 0);.         
315f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
31600 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
31610 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
31620 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
31630 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  OK;.            
31640 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
31650 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20  ( !jrnlOpen ){. 
31660 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
31670 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
31680 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
31690 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
316a0 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28      *pExists = (
316b0 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20  first!=0);.     
316c0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
316d0 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  c==SQLITE_CANTOP
316e0 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  EN ){.          
316f0 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f    /* If we canno
31700 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62  t open the rollb
31710 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ack journal file
31720 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65   in order to see
31730 20 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20   if.            
31740 2a 2a 20 69 74 20 68 61 73 20 61 20 7a 65 72 6f  ** it has a zero
31750 20 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69   header, that mi
31760 67 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e  ght be due to an
31770 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20   I/O error, or. 
31780 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
31790 20 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f   might be due to
317a0 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74   the race condit
317b0 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62  ion described ab
317c0 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20  ove and in.     
317d0 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74         ** ticket
317e0 20 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20   #3883.  Either 
317f0 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74  way, assume that
31800 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
31810 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20  hot..           
31820 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62   ** This might b
31830 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69  e a false positi
31840 76 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69  ve.  But if it i
31850 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  s, then the.    
31860 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d          ** autom
31870 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61  atic journal pla
31880 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65  yback and recove
31890 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c  ry mechanism wil
318a0 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20  l deal.         
318b0 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e     ** with it un
318c0 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45  der an EXCLUSIVE
318d0 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64   lock where we d
318e0 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20  o not need to.  
318f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72            ** wor
31900 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20  ry so much with 
31910 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e  race conditions.
31920 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
31930 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78              *pEx
31940 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  ists = 1;.      
31950 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
31960 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
31970 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
31980 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
31990 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
319a0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
319b0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
319c0 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20  obtain a shared 
319d0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
319e0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74  base file..** It
319f0 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63   is illegal to c
31a00 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
31a10 47 65 74 28 29 20 75 6e 74 69 6c 20 61 66 74 65  Get() until afte
31a20 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  r this function.
31a30 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75 63 63  ** has been succ
31a40 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e  essfully called.
31a50 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c 6f 63   If a shared-loc
31a60 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
31a70 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66  d when.** this f
31a80 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
31a90 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
31aa0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
31ab0 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  owing operations
31ac0 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66 6f 72   are also perfor
31ad0 6d 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  med by this func
31ae0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29  tion..**.**   1)
31af0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
31b00 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41   currently in PA
31b10 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 28  GER_OPEN state (
31b20 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20  no lock held.** 
31b30 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61       on the data
31b40 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e  base file), then
31b50 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
31b60 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a  ade to obtain a.
31b70 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 20 6c  **      SHARED l
31b80 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
31b90 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69  ase file. Immedi
31ba0 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61  ately after obta
31bb0 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  ining.**      th
31bc0 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  e SHARED lock, t
31bd0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69  he file-system i
31be0 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20  s checked for a 
31bf0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20  hot-journal,.** 
31c00 20 20 20 20 20 77 68 69 63 68 20 69 73 20 70 6c       which is pl
31c10 61 79 65 64 20 62 61 63 6b 20 69 66 20 70 72 65  ayed back if pre
31c20 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20  sent. Following 
31c30 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  any hot-journal 
31c40 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63  .**      rollbac
31c50 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  k, the contents 
31c60 6f 66 20 74 68 65 20 63 61 63 68 65 20 61 72 65  of the cache are
31c70 20 76 61 6c 69 64 61 74 65 64 20 62 79 20 63 68   validated by ch
31c80 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74  ecking.**      t
31c90 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74  he 'change-count
31ca0 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65  er' field of the
31cb0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
31cc0 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20  eader and.**    
31cd0 20 20 64 69 73 63 61 72 64 65 64 20 69 66 20 74    discarded if t
31ce0 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f  hey are found to
31cf0 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a   be invalid..**.
31d00 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65 20 70  **   2) If the p
31d10 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
31d20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
31d30 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  e, and there are
31d40 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20   currently.**   
31d50 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e     no outstandin
31d60 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
31d70 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69  any pages, and i
31d80 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
31d90 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68  tate,.**      th
31da0 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
31db0 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74   made to clear t
31dc0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 62  he error state b
31dd0 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20  y discarding.** 
31de0 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74       the content
31df0 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 63 61  s of the page ca
31e00 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20  che and rolling 
31e10 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f  back any open jo
31e20 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69  urnal.**      fi
31e30 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  le..**.** If eve
31e40 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
31e50 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
31e60 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
31e70 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a   an IO error .**
31e80 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6c 6f   occurs while lo
31e90 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  cking the databa
31ea0 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  se, checking for
31eb0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
31ec0 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c 6c 69  ile or .** rolli
31ed0 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ng back a journa
31ee0 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20 65  l file, the IO e
31ef0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
31f00 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
31f10 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64  lite3PagerShared
31f20 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  Lock(Pager *pPag
31f30 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
31f40 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
31f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
31f60 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
31f70 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
31f80 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72  s only called fr
31f90 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20 6f 6e  om b-tree and on
31fa0 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ly when there ar
31fb0 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74 61  e no.  ** outsta
31fc0 6e 64 69 6e 67 20 70 61 67 65 73 2e 20 54 68 69  nding pages. Thi
31fd0 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74  s implies that t
31fe0 68 65 20 70 61 67 65 72 20 73 74 61 74 65 20 73  he pager state s
31ff0 68 6f 75 6c 64 20 65 69 74 68 65 72 0a 20 20 2a  hould either.  *
32000 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20 52 45 41  * be OPEN or REA
32010 44 45 52 2e 20 52 45 41 44 45 52 20 69 73 20 6f  DER. READER is o
32020 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20  nly possible if 
32030 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 72 20  the pager is or 
32040 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65 78 63  was in .  ** exc
32050 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f  lusive access mo
32060 64 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  de.  */.  assert
32070 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
32080 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
32090 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20  pPCache)==0 );. 
320a0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
320b0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
320c0 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
320d0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
320e0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70  =PAGER_OPEN || p
320f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
32100 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
32110 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
32120 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
32130 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70  _OK );..  if( !p
32140 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
32150 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  r) && pPager->eS
32160 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
32170 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 48 6f 74   ){.    int bHot
32180 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20 20 20  Journal = 1;    
32190 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
321a0 20 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20   there exists a 
321b0 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  hot journal-file
321c0 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
321d0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61   !MEMDB );.    a
321e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
321f0 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50  empFile==0 || pP
32200 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
32210 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a  LUSIVE_LOCK );..
32220 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
32230 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
32240 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
32250 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
32260 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32270 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
32280 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  >eLock==NO_LOCK 
32290 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  || pPager->eLock
322a0 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29  ==UNKNOWN_LOCK )
322b0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69  ;.      goto fai
322c0 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  led;.    }..    
322d0 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20  /* If a journal 
322e0 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64  file exists, and
322f0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53   there is no RES
32300 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
32310 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
32320 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  e file, then it 
32330 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20  either needs to 
32340 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f  be played back o
32350 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  r deleted..    *
32360 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
32370 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ->eLock<=SHARED_
32380 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  LOCK ){.      rc
32390 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c   = hasHotJournal
323a0 28 70 50 61 67 65 72 2c 20 26 62 48 6f 74 4a 6f  (pPager, &bHotJo
323b0 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  urnal);.    }.  
323c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
323d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
323e0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  o failed;.    }.
323f0 20 20 20 20 69 66 28 20 62 48 6f 74 4a 6f 75 72      if( bHotJour
32400 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  nal ){.      if(
32410 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
32420 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  y ){.        rc 
32430 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
32440 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  Y_ROLLBACK;.    
32450 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
32460 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
32470 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
32480 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
32490 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
324a0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
324b0 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f  is.      ** impo
324c0 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53  rtant that a RES
324d0 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
324e0 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  t obtained on th
324f0 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20  e way to the.   
32500 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
32510 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65  lock. If it were
32520 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  , another proces
32530 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65  s might open the
32540 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
32550 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20  se file, detect 
32560 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
32570 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20  k, and conclude 
32580 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
32590 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61  * database is sa
325a0 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65  fe to read while
325b0 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
325c0 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74   still rolling t
325d0 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74  he .      ** hot
325e0 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20  -journal back.. 
325f0 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
32600 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
32610 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
32620 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
32630 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20  requested, any. 
32640 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72       ** other pr
32650 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67  ocess attempting
32660 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
32670 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c  atabase file wil
32680 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20  l get to .      
32690 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  ** this point in
326a0 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
326b0 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73  il to obtain its
326c0 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c   own EXCLUSIVE l
326d0 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  ock .      ** on
326e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
326f0 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  le..      **.   
32700 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65     ** Unless the
32710 20 70 61 67 65 72 20 69 73 20 69 6e 20 6c 6f 63   pager is in loc
32720 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73  king_mode=exclus
32730 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f  ive mode, the lo
32740 63 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64  ck is.      ** d
32750 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 53 48 41  owngraded to SHA
32760 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72 65 20  RED_LOCK before 
32770 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
32780 74 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  turns..      */.
32790 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
327a0 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45  LockDb(pPager, E
327b0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
327c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
327d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
327e0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
327f0 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20        }. .      
32800 2f 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  /* If it is not 
32810 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 61 6e 64  already open and
32820 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73   the file exists
32830 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e 20 74   on disk, open t
32840 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  he .      ** jou
32850 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72  rnal for read/wr
32860 69 74 65 20 61 63 63 65 73 73 2e 20 57 72 69 74  ite access. Writ
32870 65 20 61 63 63 65 73 73 20 69 73 20 72 65 71 75  e access is requ
32880 69 72 65 64 20 62 65 63 61 75 73 65 20 0a 20 20  ired because .  
32890 20 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c 75 73      ** in exclus
328a0 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
328b0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
328c0 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74  tor will be kept
328d0 20 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20   open .      ** 
328e0 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 75 73 65  and possibly use
328f0 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  d for a transact
32900 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 41 6c  ion later on. Al
32910 73 6f 2c 20 77 72 69 74 65 2d 61 63 63 65 73 73  so, write-access
32920 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73   .      ** is us
32930 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 74  ually required t
32940 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
32950 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72 6e 61  ournal in journa
32960 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74 20 0a  l_mode=persist .
32970 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20 28 61        ** mode (a
32980 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f 75 72  nd also for jour
32990 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74  nal_mode=truncat
329a0 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  e on some system
329b0 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  s)..      **.   
329c0 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75     ** If the jou
329d0 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78  rnal does not ex
329e0 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20  ist, it usually 
329f0 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20  means that some 
32a00 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
32a10 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e 61 67  connection manag
32a20 65 64 20 74 6f 20 67 65 74 20 69 6e 20 61 6e 64  ed to get in and
32a30 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 62 65   roll it back be
32a40 66 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  fore .      ** t
32a50 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  his connection o
32a60 62 74 61 69 6e 65 64 20 74 68 65 20 65 78 63 6c  btained the excl
32a70 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f 76 65  usive lock above
32a80 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20 20 20  . Or, it .      
32a90 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61 74  ** may mean that
32aa0 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
32ab0 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  n the error-stat
32ac0 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20 20  e when this.    
32ad0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61    ** function wa
32ae0 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65  s called and the
32af0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
32b00 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20  es not exist..  
32b10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
32b20 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
32b30 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
32b40 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63   sqlite3_vfs * c
32b50 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67  onst pVfs = pPag
32b60 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 20 20  er->pVfs;.      
32b70 20 20 69 6e 74 20 62 45 78 69 73 74 73 3b 20 20    int bExists;  
32b80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
32b90 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66  rue if journal f
32ba0 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ile exists */.  
32bb0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
32bc0 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20  e3OsAccess(.    
32bd0 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50          pVfs, pP
32be0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
32bf0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
32c00 49 53 54 53 2c 20 26 62 45 78 69 73 74 73 29 3b  ISTS, &bExists);
32c10 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
32c20 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 45  =SQLITE_OK && bE
32c30 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20  xists ){.       
32c40 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
32c50 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66  .          int f
32c60 20 3d 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45   = .#if SQLITE_E
32c70 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45  NABLE_DATA_PROTE
32c80 43 54 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20  CTION.          
32c90 20 20 28 70 50 61 67 65 72 2d 3e 76 66 73 46 6c    (pPager->vfsFl
32ca0 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
32cb0 46 49 4c 45 50 52 4f 54 45 43 54 49 4f 4e 5f 4d  FILEPROTECTION_M
32cc0 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a 20 20 20  ASK)|.#endif.   
32cd0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
32ce0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
32cf0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
32d00 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
32d10 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
32d20 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
32d30 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
32d40 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
32d50 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
32d60 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
32d70 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  , f, &fout);.   
32d80 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
32d90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
32da0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
32db0 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  fd) );.         
32dc0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
32dd0 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54  OK && fout&SQLIT
32de0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
32df0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
32e00 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
32e10 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  PEN_BKPT;.      
32e20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
32e30 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
32e40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
32e50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
32e60 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79  . .      /* Play
32e70 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20  back and delete 
32e80 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72  the journal.  Dr
32e90 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  op the database 
32ea0 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c  write.      ** l
32eb0 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
32ec0 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
32ed0 20 50 75 72 67 65 20 74 68 65 20 63 61 63 68 65   Purge the cache
32ee0 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a   before.      **
32ef0 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
32f00 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f  e hot-journal so
32f10 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65   that we don't e
32f20 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20 20 20  nd up with.     
32f30 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   ** an inconsist
32f40 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e 63  ent cache.  Sync
32f50 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c   the hot journal
32f60 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a   before playing.
32f70 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63 6b        ** it back
32f80 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63 65   since the proce
32f90 73 73 20 74 68 61 74 20 63 72 61 73 68 65 64 20  ss that crashed 
32fa0 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f 74  and left the hot
32fb0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
32fc0 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20 6e  * probably did n
32fd0 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20 77  ot sync it and w
32fe0 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74  e are required t
32ff0 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20 20  o always sync.  
33000 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e      ** the journ
33010 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e  al before playin
33020 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 20  g it back..     
33030 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
33040 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
33050 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
33060 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
33070 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  OK );.        rc
33080 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a   = pagerSyncHotJ
33090 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
330a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
330b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
330c0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
330d0 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
330e0 72 2c 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  r, !pPager->temp
330f0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  File);.         
33100 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
33110 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20  = PAGER_OPEN;.  
33120 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
33130 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d  lse if( !pPager-
33140 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
33150 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 55  {.        pagerU
33160 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  nlockDb(pPager, 
33170 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
33180 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
33190 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
331a0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
331b0 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
331c0 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  n if an error oc
331d0 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
331e0 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20 20  g to open.      
331f0 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61 63    ** or roll bac
33200 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  k a hot-journal 
33210 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61 6e  while holding an
33220 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
33230 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   The.        ** 
33240 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 72  pager_unlock() r
33250 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63  outine will be c
33260 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72 65 74  alled before ret
33270 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63 6b  urning to unlock
33280 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
33290 66 69 6c 65 2e 20 49 66 20 74 68 65 20 75 6e 6c  file. If the unl
332a0 6f 63 6b 20 61 74 74 65 6d 70 74 20 66 61 69 6c  ock attempt fail
332b0 73 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 65 4c  s, then Pager.eL
332c0 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20 20 20 20  ock must be.    
332d0 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 55 4e      ** set to UN
332e0 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65 20  KNOWN_LOCK (see 
332f0 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
33300 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f  e the #define fo
33310 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 55 4e  r .        ** UN
33320 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76 65  KNOWN_LOCK above
33330 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61 74   for an explanat
33340 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20 20 2a  ion). .        *
33350 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  *.        ** In 
33360 6f 72 64 65 72 20 74 6f 20 67 65 74 20 70 61 67  order to get pag
33370 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 64  er_unlock() to d
33380 6f 20 74 68 69 73 2c 20 73 65 74 20 50 61 67 65  o this, set Page
33390 72 2e 65 53 74 61 74 65 20 74 6f 0a 20 20 20 20  r.eState to.    
333a0 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45 52 52      ** PAGER_ERR
333b0 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20  OR now. This is 
333c0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6f 75  not actually cou
333d0 6e 74 65 64 20 61 73 20 61 20 74 72 61 6e 73 69  nted as a transi
333e0 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tion.        ** 
333f0 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  to ERROR state i
33400 6e 20 74 68 65 20 73 74 61 74 65 20 64 69 61 67  n the state diag
33410 72 61 6d 20 61 74 20 74 68 65 20 74 6f 70 20 6f  ram at the top o
33420 66 20 74 68 69 73 20 66 69 6c 65 2c 0a 20 20 20  f this file,.   
33430 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65       ** since we
33440 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 73   know that the s
33450 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  ame call to page
33460 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20  r_unlock() will 
33470 76 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  very.        ** 
33480 73 68 6f 72 74 6c 79 20 74 72 61 6e 73 69 74 69  shortly transiti
33490 6f 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  on the pager obj
334a0 65 63 74 20 74 6f 20 74 68 65 20 4f 50 45 4e 20  ect to the OPEN 
334b0 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a 20  state. Calling. 
334c0 20 20 20 20 20 20 20 2a 2a 20 61 73 73 65 72 74         ** assert
334d0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20 77  _pager_state() w
334e0 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20 61  ould fail now, a
334f0 73 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  s it should not 
33500 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20  be possible.    
33510 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 20      ** to be in 
33520 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e  ERROR state when
33530 20 74 68 65 72 65 20 61 72 65 20 7a 65 72 6f 20   there are zero 
33540 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
33550 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 66   .        ** ref
33560 65 72 65 6e 63 65 73 2e 0a 20 20 20 20 20 20 20  erences..       
33570 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67 65   */.        page
33580 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
33590 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  rc);.        got
335a0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
335b0 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
335c0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
335d0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
335e0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50       assert( (pP
335f0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41  ager->eLock==SHA
33600 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20  RED_LOCK).      
33610 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
33620 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
33630 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  & pPager->eLock>
33640 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20  SHARED_LOCK).   
33650 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
33660 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
33670 6d 70 46 69 6c 65 20 26 26 20 70 50 61 67 65 72  mpFile && pPager
33680 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c  ->hasHeldSharedL
33690 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ock ){.      /* 
336a0 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  The shared-lock 
336b0 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63  has just been ac
336c0 71 75 69 72 65 64 20 74 68 65 6e 20 63 68 65 63  quired then chec
336d0 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 65  k to.      ** se
336e0 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
336f0 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
33700 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74  ied.  If the dat
33710 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65  abase has change
33720 64 2c 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75 73  d,.      ** flus
33730 68 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68  h the cache.  Th
33740 65 20 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c  e hasHeldSharedL
33750 6f 63 6b 20 66 6c 61 67 20 70 72 65 76 65 6e 74  ock flag prevent
33760 73 20 74 68 69 73 20 66 72 6f 6d 0a 20 20 20 20  s this from.    
33770 20 20 2a 2a 20 6f 63 63 75 72 72 69 6e 67 20 6f    ** occurring o
33780 6e 20 74 68 65 20 76 65 72 79 20 66 69 72 73 74  n the very first
33790 20 61 63 63 65 73 73 20 74 6f 20 61 20 66 69 6c   access to a fil
337a0 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  e, in order to s
337b0 61 76 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  ave a.      ** s
337c0 69 6e 67 6c 65 20 75 6e 6e 65 63 65 73 73 61 72  ingle unnecessar
337d0 79 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  y sqlite3OsRead(
337e0 29 20 63 61 6c 6c 20 61 74 20 74 68 65 20 73 74  ) call at the st
337f0 61 72 74 2d 75 70 2e 0a 20 20 20 20 20 20 2a 2a  art-up..      **
33800 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61  .      ** Databa
33810 73 65 20 63 68 61 6e 67 65 73 20 61 72 65 20 64  se changes are d
33820 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69  etected by looki
33830 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62  ng at 15 bytes b
33840 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a  eginning.      *
33850 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69  * at offset 24 i
33860 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54  nto the file.  T
33870 68 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68  he first 4 of th
33880 65 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65  ese 16 bytes are
33890 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62  .      ** a 32-b
338a0 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20  it counter that 
338b0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
338c0 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e  ith each change.
338d0 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f    The.      ** o
338e0 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67  ther bytes chang
338f0 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20  e randomly with 
33900 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65  each file change
33910 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61   when.      ** a
33920 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65   codec is in use
33930 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
33940 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20    ** There is a 
33950 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
33960 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20  l chance that a 
33970 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20  change will not 
33980 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74  be .      ** det
33990 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e  ected.  The chan
339a0 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63  ce of an undetec
339b0 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f  ted change is so
339c0 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20   small that.    
339d0 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e    ** it can be n
339e0 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20  eglected..      
339f0 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 64 62  */.      char db
33a00 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28  FileVers[sizeof(
33a10 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
33a20 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20 49 4f 54  rs)];..      IOT
33a30 52 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70  RACE(("CKVERS %p
33a40 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
33a50 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
33a60 73 29 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  s)));.      rc =
33a70 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
33a80 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69  Pager->fd, &dbFi
33a90 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
33aa0 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b  bFileVers), 24);
33ab0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
33ac0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33ad0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
33ae0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
33af0 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
33b00 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
33b10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33b20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72  memset(dbFileVer
33b30 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46  s, 0, sizeof(dbF
33b40 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
33b50 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65   }..      if( me
33b60 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46  mcmp(pPager->dbF
33b70 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
33b80 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
33b90 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20  leVers))!=0 ){. 
33ba0 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
33bb0 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20  et(pPager);..   
33bc0 20 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 74 68       /* Unmap th
33bd0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
33be0 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
33bf0 74 68 61 74 20 65 78 74 65 72 6e 61 6c 20 70 72  that external pr
33c00 6f 63 65 73 73 65 73 0a 20 20 20 20 20 20 20 20  ocesses.        
33c10 2a 2a 20 6d 61 79 20 68 61 76 65 20 74 72 75 6e  ** may have trun
33c20 63 61 74 65 64 20 74 68 65 20 64 61 74 61 62 61  cated the databa
33c30 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 6e  se file and then
33c40 20 65 78 74 65 6e 64 65 64 20 69 74 20 62 61 63   extended it bac
33c50 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  k.        ** to 
33c60 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
33c70 65 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f  e while this pro
33c80 63 65 73 73 20 77 61 73 20 6e 6f 74 20 68 6f 6c  cess was not hol
33c90 64 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20 20 20  ding a lock..   
33ca0 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20       ** In this 
33cb0 63 61 73 65 20 74 68 65 72 65 20 6d 61 79 20 65  case there may e
33cc0 78 69 73 74 20 61 20 50 61 67 65 72 2e 70 4d 61  xist a Pager.pMa
33cd0 70 20 6d 61 70 70 69 6e 67 20 74 68 61 74 20 61  p mapping that a
33ce0 70 70 65 61 72 73 0a 20 20 20 20 20 20 20 20 2a  ppears.        *
33cf0 2a 20 74 6f 20 62 65 20 74 68 65 20 72 69 67 68  * to be the righ
33d00 74 20 73 69 7a 65 20 62 75 74 20 69 73 20 6e 6f  t size but is no
33d10 74 20 61 63 74 75 61 6c 6c 79 20 76 61 6c 69 64  t actually valid
33d20 2e 20 41 76 6f 69 64 20 74 68 69 73 0a 20 20 20  . Avoid this.   
33d30 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c       ** possibil
33d40 69 74 79 20 62 79 20 75 6e 6d 61 70 70 69 6e 67  ity by unmapping
33d50 20 74 68 65 20 64 62 20 68 65 72 65 2e 20 2a 2f   the db here. */
33d60 0a 20 20 20 20 20 20 20 20 69 66 28 20 55 53 45  .        if( USE
33d70 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29 7b  FETCH(pPager) ){
33d80 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
33d90 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67  e3OsUnfetch(pPag
33da0 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20  er->fd, 0, 0);. 
33db0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
33dc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
33dd0 66 20 74 68 65 72 65 20 69 73 20 61 20 57 41 4c  f there is a WAL
33de0 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
33df0 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74  e-system, open t
33e00 68 69 73 20 64 61 74 61 62 61 73 65 20 69 6e 20  his database in 
33e10 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e  WAL.    ** mode.
33e20 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
33e30 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
33e40 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  on call is a no-
33e50 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  op..    */.    r
33e60 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57 61 6c  c = pagerOpenWal
33e70 49 66 50 72 65 73 65 6e 74 28 70 50 61 67 65 72  IfPresent(pPager
33e80 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
33e90 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61  E_OMIT_WAL.    a
33ea0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
33eb0 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  Wal==0 || rc==SQ
33ec0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69  LITE_OK );.#endi
33ed0 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67  f.  }..  if( pag
33ee0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
33ef0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
33f00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
33f10 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 42  .    rc = pagerB
33f20 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
33f30 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ion(pPager);.  }
33f40 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
33f50 74 65 6d 70 46 69 6c 65 3d 3d 30 20 26 26 20 70  tempFile==0 && p
33f60 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
33f70 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d  AGER_OPEN && rc=
33f80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33f90 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65    rc = pagerPage
33fa0 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 70  count(pPager, &p
33fb0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
33fc0 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20    }.. failed:.  
33fd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
33fe0 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
33ff0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70   !MEMDB );.    p
34000 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
34010 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
34020 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
34030 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20  =PAGER_OPEN );. 
34040 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
34050 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
34060 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 20 20 70  ER_READER;.    p
34070 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68  Pager->hasHeldSh
34080 61 72 65 64 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20  aredLock = 1;.  
34090 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
340a0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ../*.** If the r
340b0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68  eference count h
340c0 61 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c  as reached zero,
340d0 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   rollback any ac
340e0 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
340f0 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ion and unlock t
34100 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  he pager..**.** 
34110 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69  Except, in locki
34120 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56  ng_mode=EXCLUSIV
34130 45 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  E when there is 
34140 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a  nothing to in.**
34150 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
34160 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63  urnal, the unloc
34170 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d  k is not perform
34180 65 64 20 61 6e 64 20 74 68 65 72 65 20 69 73 0a  ed and there is.
34190 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f  ** nothing to ro
341a0 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73 20  llback, so this 
341b0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
341c0 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76  op..*/ .static v
341d0 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  oid pagerUnlockI
341e0 66 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70  fUnused(Pager *p
341f0 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 73 71  Pager){.  if( sq
34200 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
34210 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
34220 63 68 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  che)==0 ){.    a
34230 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
34240 4d 6d 61 70 4f 75 74 3d 3d 30 20 29 3b 20 2f 2a  MmapOut==0 ); /*
34250 20 62 65 63 61 75 73 65 20 70 61 67 65 31 20 69   because page1 i
34260 73 20 6e 65 76 65 72 20 6d 65 6d 6f 72 79 20 6d  s never memory m
34270 61 70 70 65 64 20 2a 2f 0a 20 20 20 20 70 61 67  apped */.    pag
34280 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
34290 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
342a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  .}../*.** The pa
342b0 67 65 20 67 65 74 74 65 72 20 6d 65 74 68 6f 64  ge getter method
342c0 73 20 65 61 63 68 20 74 72 79 20 74 6f 20 61 63  s each try to ac
342d0 71 75 69 72 65 20 61 20 72 65 66 65 72 65 6e 63  quire a referenc
342e0 65 20 74 6f 20 61 0a 2a 2a 20 70 61 67 65 20 77  e to a.** page w
342f0 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ith page number 
34300 70 67 6e 6f 2e 20 49 66 20 74 68 65 20 72 65 71  pgno. If the req
34310 75 65 73 74 65 64 20 72 65 66 65 72 65 6e 63 65  uested reference
34320 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66   is .** successf
34330 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69  ully obtained, i
34340 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a  t is copied to *
34350 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54  ppPage and SQLIT
34360 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
34370 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 64  *.** There are d
34380 69 66 66 65 72 65 6e 74 20 69 6d 70 6c 65 6d 65  ifferent impleme
34390 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  ntations of the 
343a0 67 65 74 74 65 72 20 6d 65 74 68 6f 64 20 64 65  getter method de
343b0 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68  pending.** on th
343c0 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
343d0 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a  of the pager..**
343e0 0a 2a 2a 20 20 20 20 20 67 65 74 50 61 67 65 4e  .**     getPageN
343f0 6f 72 6d 61 6c 28 29 20 20 20 20 20 20 20 20 20  ormal()         
34400 2d 2d 20 20 54 68 65 20 6e 6f 72 6d 61 6c 20 67  --  The normal g
34410 65 74 74 65 72 0a 2a 2a 20 20 20 20 20 67 65 74  etter.**     get
34420 50 61 67 65 45 72 72 6f 72 28 29 20 20 20 20 20  PageError()     
34430 20 20 20 20 20 2d 2d 20 20 55 73 65 64 20 69 66       --  Used if
34440 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
34450 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 0a   an error state.
34460 2a 2a 20 20 20 20 20 67 65 74 50 61 67 65 4d 6d  **     getPageMm
34470 61 70 28 29 20 20 20 20 20 20 20 20 20 20 20 2d  ap()           -
34480 2d 20 20 55 73 65 64 20 69 66 20 6d 65 6d 6f 72  -  Used if memor
34490 79 2d 6d 61 70 70 65 64 20 49 2f 4f 20 69 73 20  y-mapped I/O is 
344a0 65 6e 61 62 6c 65 64 0a 2a 2a 0a 2a 2a 20 49 66  enabled.**.** If
344b0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
344c0 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
344d0 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69 74 20  n the cache, it 
344e0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
344f0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65   Otherwise, a ne
34500 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73  w page object is
34510 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70   allocated and p
34520 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 64 61  opulated with da
34530 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20  ta.** read from 
34540 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
34550 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73  e. In some cases
34560 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  , the pcache mod
34570 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73  ule may.** choos
34580 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74  e not to allocat
34590 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a  e a new page obj
345a0 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73  ect and may reus
345b0 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a  e an existing.**
345c0 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20   object with no 
345d0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
345e0 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rences..**.** Th
345f0 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70  e extra data app
34600 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20  ended to a page 
34610 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
34620 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74  lized to zeros t
34630 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d  he .** first tim
34640 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64  e a page is load
34650 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20  ed into memory. 
34660 49 66 20 74 68 65 20 70 61 67 65 20 72 65 71 75  If the page requ
34670 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72  ested is .** alr
34680 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68  eady in the cach
34690 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
346a0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
346b0 74 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a  then the extra.*
346c0 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74 20 61  * data is left a
346d0 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 74 68  s it was when th
346e0 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61  e page object wa
346f0 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a  s last used..**.
34700 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
34710 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c  se image is smal
34720 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ler than the req
34730 75 65 73 74 65 64 20 70 61 67 65 20 6f 72 20 69  uested page or i
34740 66 20 0a 2a 2a 20 74 68 65 20 66 6c 61 67 73 20  f .** the flags 
34750 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61 69  parameter contai
34760 6e 73 20 74 68 65 20 50 41 47 45 52 5f 47 45 54  ns the PAGER_GET
34770 5f 4e 4f 43 4f 4e 54 45 4e 54 20 62 69 74 20 61  _NOCONTENT bit a
34780 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65  nd the .** reque
34790 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
347a0 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20   already stored 
347b0 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74 68  in the cache, th
347c0 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c  en no .** actual
347d0 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72   disk read occur
347e0 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
347f0 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
34800 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65   of the .** page
34810 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
34820 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a  to all zeros. .*
34830 2a 0a 2a 2a 20 49 66 20 50 41 47 45 52 5f 47 45  *.** If PAGER_GE
34840 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69 73 20 74  T_NOCONTENT is t
34850 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  rue, it means th
34860 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
34870 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63  e about.** the c
34880 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
34890 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72 73  age. This occurs
348a0 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f   in two scenario
348b0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68  s:.**.**   a) Wh
348c0 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72 65  en reading a fre
348d0 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
348e0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
348f0 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  se, and.**.**   
34900 62 29 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f  b) When a savepo
34910 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  int is being rol
34920 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20  led back and we 
34930 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20  need to load.** 
34940 20 20 20 20 20 61 20 6e 65 77 20 70 61 67 65 20       a new page 
34950 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20 74  into the cache t
34960 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68  o be filled with
34970 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a   the data read.*
34980 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20  *      from the 
34990 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  savepoint journa
349a0 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 41 47 45  l..**.** If PAGE
349b0 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
349c0 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
349d0 65 20 64 61 74 61 20 72 65 74 75 72 6e 65 64 20  e data returned 
349e0 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65 61  is zeroed instea
349f0 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20 72 65  d.** of being re
34a00 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
34a10 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c  base. Additional
34a20 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f 72  ly, the bits cor
34a30 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
34a40 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e 70   pgno in Pager.p
34a50 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76 65  InJournal (bitve
34a60 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61  c of pages alrea
34a70 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  dy written to th
34a80 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
34a90 65 29 20 61 6e 64 20 74 68 65 20 50 61 67 65 72  e) and the Pager
34aa0 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
34ab0 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20 6f  epoint bitvecs o
34ac0 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73 61  f any open.** sa
34ad0 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65 74  vepoints are set
34ae0 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20  . This means if 
34af0 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 64 65  the page is made
34b00 20 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e 79   writable at any
34b10 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  .** point in the
34b20 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20 61   future, using a
34b30 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
34b40 50 61 67 65 72 57 72 69 74 65 28 29 2c 20 69 74  PagerWrite(), it
34b50 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77 69  s contents.** wi
34b60 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e 61  ll not be journa
34b70 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65 73 20  led. This saves 
34b80 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63  IO..**.** The ac
34b90 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20  quisition might 
34ba0 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c  fail for several
34bb0 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c   reasons.  In al
34bc0 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61  l cases,.** an a
34bd0 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
34be0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
34bf0 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73  d and *ppPage is
34c00 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
34c10 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
34c20 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
34c30 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f  ).  Both this ro
34c40 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70  utine and Lookup
34c50 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  () attempt.** to
34c60 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   find a page in 
34c70 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
34c80 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74  che first.  If t
34c90 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
34ca0 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d  lready.** in mem
34cb0 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ory, this routin
34cc0 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74  e goes to disk t
34cd0 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65  o read it in whe
34ce0 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a  reas Lookup().**
34cf0 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e   just returns 0.
34d00 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
34d10 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c  cquires a read-l
34d20 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ock the first ti
34d30 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20  me it.** has to 
34d40 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20  go to disk, and 
34d50 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62  could also playb
34d60 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  ack an old journ
34d70 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
34d80 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70  .** Since Lookup
34d90 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f  () never goes to
34da0 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20   disk, it never 
34db0 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68  has to deal with
34dc0 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75   locks.** or jou
34dd0 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73  rnal files..*/.s
34de0 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 67  tatic int getPag
34df0 65 4e 6f 72 6d 61 6c 28 0a 20 20 50 61 67 65 72  eNormal(.  Pager
34e00 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f   *pPager,      /
34e10 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e  * The pager open
34e20 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
34e30 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
34e40 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  pgno,          /
34e50 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
34e60 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61   fetch */.  DbPa
34e70 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
34e80 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74  /* Write a point
34e90 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  er to the page h
34ea0 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
34eb0 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  gs           /* 
34ec0 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c  PAGER_GET_XXX fl
34ed0 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ags */.){.  int 
34ee0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
34ef0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
34f00 75 38 20 6e 6f 43 6f 6e 74 65 6e 74 3b 20 20 20  u8 noContent;   
34f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34f20 2f 2a 20 54 72 75 65 20 69 66 20 50 41 47 45 52  /* True if PAGER
34f30 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69  _GET_NOCONTENT i
34f40 73 20 73 65 74 20 2a 2f 0a 20 20 73 71 6c 69 74  s set */.  sqlit
34f50 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20 2a  e3_pcache_page *
34f60 70 42 61 73 65 3b 0a 0a 20 20 61 73 73 65 72 74  pBase;..  assert
34f70 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
34f80 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
34f90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
34fa0 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
34fb0 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65  READER );.  asse
34fc0 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
34fd0 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
34fe0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
34ff0 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65  er->hasHeldShare
35000 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 0a 20 20 69  dLock==1 );..  i
35010 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74  f( pgno==0 ) ret
35020 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
35030 50 54 5f 42 4b 50 54 3b 0a 20 20 70 42 61 73 65  PT_BKPT;.  pBase
35040 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
35050 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
35060 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 33 29 3b  Cache, pgno, 3);
35070 0a 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30 20  .  if( pBase==0 
35080 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a  ){.    pPg = 0;.
35090 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
350a0 50 63 61 63 68 65 46 65 74 63 68 53 74 72 65 73  PcacheFetchStres
350b0 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  s(pPager->pPCach
350c0 65 2c 20 70 67 6e 6f 2c 20 26 70 42 61 73 65 29  e, pgno, &pBase)
350d0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
350e0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70  LITE_OK ) goto p
350f0 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
35100 3b 0a 20 20 20 20 69 66 28 20 70 42 61 73 65 3d  ;.    if( pBase=
35110 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
35120 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
35130 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  PT;.      goto p
35140 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
35150 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50  ;.    }.  }.  pP
35160 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20 73 71  g = *ppPage = sq
35170 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
35180 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70  Finish(pPager->p
35190 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 42  PCache, pgno, pB
351a0 61 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ase);.  assert( 
351b0 70 50 67 3d 3d 28 2a 70 70 50 61 67 65 29 20 29  pPg==(*ppPage) )
351c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
351d0 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20  >pgno==pgno );. 
351e0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
351f0 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20  ager==pPager || 
35200 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29  pPg->pPager==0 )
35210 3b 0a 0a 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d  ;..  noContent =
35220 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
35230 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 21 3d  GET_NOCONTENT)!=
35240 30 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50  0;.  if( pPg->pP
35250 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65  ager && !noConte
35260 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  nt ){.    /* In 
35270 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70 63  this case the pc
35280 61 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e  ache already con
35290 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c  tains an initial
352a0 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20  ized copy of.   
352b0 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65   ** the page. Re
352c0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72  turn without fur
352d0 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20  ther ado.  */.  
352e0 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
352f0 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26  PAGER_MAX_PGNO &
35300 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  & pgno!=PAGER_MJ
35310 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
35320 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74  .    pPager->aSt
35330 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 48 49  at[PAGER_STAT_HI
35340 54 5d 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  T]++;.    return
35350 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d   SQLITE_OK;..  }
35360 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
35370 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73   pager cache has
35380 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70   created a new p
35390 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74  age. Its content
353a0 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a   needs to .    *
353b0 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  * be initialized
353c0 2e 20 42 75 74 20 66 69 72 73 74 20 73 6f 6d 65  . But first some
353d0 20 65 72 72 6f 72 20 63 68 65 63 6b 73 3a 0a 20   error checks:. 
353e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 28 31 29     **.    ** (1)
353f0 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   The maximum pag
35400 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31  e number is 2^31
35410 0a 20 20 20 20 2a 2a 20 28 32 29 20 4e 65 76 65  .    ** (2) Neve
35420 72 20 74 72 79 20 74 6f 20 66 65 74 63 68 20 74  r try to fetch t
35430 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 0a  he locking page.
35440 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
35450 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47  gno>PAGER_MAX_PG
35460 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  NO || pgno==PAGE
35470 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
35480 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
35490 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
354a0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
354b0 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
354c0 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  r;.    }..    pP
354d0 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  g->pPager = pPag
354e0 65 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  er;..    assert(
354f0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
35500 3e 66 64 29 20 7c 7c 20 21 4d 45 4d 44 42 20 29  >fd) || !MEMDB )
35510 3b 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70 65  ;.    if( !isOpe
35520 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
35530 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
35540 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e  pgno || noConten
35550 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t ){.      if( p
35560 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  gno>pPager->mxPg
35570 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  no ){.        rc
35580 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
35590 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
355a0 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
355b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
355c0 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  ( noContent ){. 
355d0 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72         /* Failur
355e0 65 20 74 6f 20 73 65 74 20 74 68 65 20 62 69 74  e to set the bit
355f0 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e  s in the InJourn
35600 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69  al bit-vectors i
35610 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20  s benign..      
35620 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d    ** It merely m
35630 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67  eans that we mig
35640 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61  ht do some extra
35650 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c   work to journal
35660 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70   a .        ** p
35670 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
35680 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  t need to be jou
35690 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68  rnaled.  Neverth
356a0 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a  eless, be sure .
356b0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65          ** to te
356c0 73 74 20 74 68 65 20 63 61 73 65 20 77 68 65 72  st the case wher
356d0 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  e a malloc error
356e0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
356f0 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20  ying to set .   
35700 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e       ** a bit in
35710 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20   a bit vector.. 
35720 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
35730 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
35740 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
35750 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d        if( pgno<=
35760 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
35770 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
35780 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29  TESTONLY( rc = )
35790 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
357a0 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
357b0 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  rnal, pgno);.   
357c0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
357d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
357e0 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  M );.        }. 
357f0 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28         TESTONLY(
35800 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76   rc = ) addToSav
35810 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
35820 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  ager, pgno);.   
35830 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
35840 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
35850 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
35860 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
35870 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  c();.      }.   
35880 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70     memset(pPg->p
35890 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d  Data, 0, pPager-
358a0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
358b0 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f    IOTRACE(("ZERO
358c0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
358d0 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  r, pgno));.    }
358e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
358f0 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d  rt( pPg->pPager=
35900 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20 20  =pPager );.     
35910 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50   pPager->aStat[P
35920 41 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 5d 2b  AGER_STAT_MISS]+
35930 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  +;.      rc = re
35940 61 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a 20  adDbPage(pPg);. 
35950 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
35960 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
35970 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
35980 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
35990 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  }.    }.    page
359a0 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70  r_set_pagehash(p
359b0 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Pg);.  }.  retur
359c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
359d0 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a  ger_acquire_err:
359e0 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
359f0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
35a00 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c  ( pPg ){.    sql
35a10 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70  ite3PcacheDrop(p
35a20 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  Pg);.  }.  pager
35a30 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70  UnlockIfUnused(p
35a40 50 61 67 65 72 29 3b 0a 20 20 2a 70 70 50 61 67  Pager);.  *ppPag
35a50 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  e = 0;.  return 
35a60 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  rc;.}..#if SQLIT
35a70 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
35a80 30 0a 2f 2a 20 54 68 65 20 70 61 67 65 20 67 65  0./* The page ge
35a90 74 74 65 72 20 66 6f 72 20 77 68 65 6e 20 6d 65  tter for when me
35aa0 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f 20  mory-mapped I/O 
35ab0 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 73 74  is enabled */.st
35ac0 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 67 65  atic int getPage
35ad0 4d 4d 61 70 28 0a 20 20 50 61 67 65 72 20 2a 70  MMap(.  Pager *p
35ae0 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54  Pager,      /* T
35af0 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e  he pager open on
35b00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
35b10 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
35b20 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  o,          /* P
35b30 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65  age number to fe
35b40 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  tch */.  DbPage 
35b50 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
35b60 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20  Write a pointer 
35b70 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65  to the page here
35b80 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
35b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
35ba0 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73  ER_GET_XXX flags
35bb0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
35bc0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
35bd0 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20  gHdr *pPg = 0;. 
35be0 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b   u32 iFrame = 0;
35bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c00 20 2f 2a 20 46 72 61 6d 65 20 74 6f 20 72 65 61   /* Frame to rea
35c10 64 20 66 72 6f 6d 20 57 41 4c 20 66 69 6c 65 20  d from WAL file 
35c20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 61  */..  /* It is a
35c30 63 63 65 70 74 61 62 6c 65 20 74 6f 20 75 73 65  cceptable to use
35c40 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d   a read-only (mm
35c50 61 70 29 20 70 61 67 65 20 66 6f 72 20 61 6e 79  ap) page for any
35c60 20 70 61 67 65 20 65 78 63 65 70 74 0a 20 20 2a   page except.  *
35c70 2a 20 70 61 67 65 20 31 20 69 66 20 74 68 65 72  * page 1 if ther
35c80 65 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72  e is no write-tr
35c90 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f  ansaction open o
35ca0 72 20 74 68 65 20 41 43 51 55 49 52 45 5f 52 45  r the ACQUIRE_RE
35cb0 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61 67  ADONLY.  ** flag
35cc0 20 77 61 73 20 73 70 65 63 69 66 69 65 64 20 62   was specified b
35cd0 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 41 6e  y the caller. An
35ce0 64 20 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68 65  d so long as the
35cf0 20 64 62 20 69 73 20 6e 6f 74 20 61 20 0a 20 20   db is not a .  
35d00 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20  ** temporary or 
35d10 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
35d20 73 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  se.  */.  const 
35d30 69 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28 70  int bMmapOk = (p
35d40 67 6e 6f 3e 31 0a 20 20 20 26 26 20 28 70 50 61  gno>1.   && (pPa
35d50 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
35d60 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 28 66 6c  ER_READER || (fl
35d70 61 67 73 20 26 20 50 41 47 45 52 5f 47 45 54 5f  ags & PAGER_GET_
35d80 52 45 41 44 4f 4e 4c 59 29 29 0a 20 20 29 3b 0a  READONLY)).  );.
35d90 0a 20 20 61 73 73 65 72 74 28 20 55 53 45 46 45  .  assert( USEFE
35da0 54 43 48 28 70 50 61 67 65 72 29 20 29 3b 0a 23  TCH(pPager) );.#
35db0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
35dc0 5f 43 4f 44 45 43 0a 20 20 61 73 73 65 72 74 28  _CODEC.  assert(
35dd0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d   pPager->xCodec=
35de0 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  =0 );.#endif..  
35df0 2f 2a 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  /* Optimization 
35e00 6e 6f 74 65 3a 20 20 41 64 64 69 6e 67 20 74 68  note:  Adding th
35e10 65 20 22 70 67 6e 6f 3c 3d 31 22 20 74 65 72 6d  e "pgno<=1" term
35e20 20 62 65 66 6f 72 65 20 22 70 67 6e 6f 3d 3d 30   before "pgno==0
35e30 22 20 68 65 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f  " here.  ** allo
35e40 77 73 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  ws the compiler 
35e50 6f 70 74 69 6d 69 7a 65 72 20 74 6f 20 72 65 75  optimizer to reu
35e60 73 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  se the results o
35e70 66 20 74 68 65 20 22 70 67 6e 6f 3e 31 22 0a 20  f the "pgno>1". 
35e80 20 2a 2a 20 74 65 73 74 20 69 6e 20 74 68 65 20   ** test in the 
35e90 70 72 65 76 69 6f 75 73 20 73 74 61 74 65 6d 65  previous stateme
35ea0 6e 74 2c 20 61 6e 64 20 61 76 6f 69 64 20 74 65  nt, and avoid te
35eb0 73 74 69 6e 67 20 70 67 6e 6f 3d 3d 30 20 69 6e  sting pgno==0 in
35ec0 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6d 6d 6f 6e   the.  ** common
35ed0 20 63 61 73 65 20 77 68 65 72 65 20 70 67 6e 6f   case where pgno
35ee0 20 69 73 20 6c 61 72 67 65 2e 20 2a 2f 0a 20 20   is large. */.  
35ef0 69 66 28 20 70 67 6e 6f 3c 3d 31 20 26 26 20 70  if( pgno<=1 && p
35f00 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  gno==0 ){.    re
35f10 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
35f20 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
35f30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
35f40 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  eState>=PAGER_RE
35f50 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74  ADER );.  assert
35f60 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
35f70 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
35f80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
35f90 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c  ->hasHeldSharedL
35fa0 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  ock==1 );.  asse
35fb0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
35fc0 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
35fd0 3b 0a 0a 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b  ;..  if( bMmapOk
35fe0 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28   && pagerUseWal(
35ff0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
36000 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69  c = sqlite3WalFi
36010 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e  ndFrame(pPager->
36020 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72  pWal, pgno, &iFr
36030 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
36040 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
36050 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
36060 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
36070 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  c;.    }.  }.  i
36080 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 69 46  f( bMmapOk && iF
36090 72 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 76  rame==0 ){.    v
360a0 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a  oid *pData = 0;.
360b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
360c0 4f 73 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  OsFetch(pPager->
360d0 66 64 2c 20 0a 20 20 20 20 20 20 20 20 28 69 36  fd, .        (i6
360e0 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61  4)(pgno-1) * pPa
360f0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
36100 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
36110 20 26 70 44 61 74 61 0a 20 20 20 20 29 3b 0a 20   &pData.    );. 
36120 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
36130 45 5f 4f 4b 20 26 26 20 70 44 61 74 61 20 29 7b  E_OK && pData ){
36140 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
36150 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f  r->eState>PAGER_
36160 52 45 41 44 45 52 20 7c 7c 20 70 50 61 67 65 72  READER || pPager
36170 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
36180 20 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69        pPg = sqli
36190 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
361a0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
361b0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
361c0 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pPg==0 ){.      
361d0 20 20 72 63 20 3d 20 70 61 67 65 72 41 63 71 75    rc = pagerAcqu
361e0 69 72 65 4d 61 70 50 61 67 65 28 70 50 61 67 65  ireMapPage(pPage
361f0 72 2c 20 70 67 6e 6f 2c 20 70 44 61 74 61 2c 20  r, pgno, pData, 
36200 26 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  &pPg);.      }el
36210 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
36220 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
36230 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70  ger->fd, (i64)(p
36240 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70  gno-1)*pPager->p
36250 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b  ageSize, pData);
36260 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
36270 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20  f( pPg ){.      
36280 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
36290 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
362a0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67     *ppPage = pPg
362b0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
362c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
362d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
362e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
362f0 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65  ){.      *ppPage
36300 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
36310 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
36320 0a 20 20 72 65 74 75 72 6e 20 67 65 74 50 61 67  .  return getPag
36330 65 4e 6f 72 6d 61 6c 28 70 50 61 67 65 72 2c 20  eNormal(pPager, 
36340 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c  pgno, ppPage, fl
36350 61 67 73 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ags);.}.#endif /
36360 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  * SQLITE_MAX_MMA
36370 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 20  P_SIZE>0 */../* 
36380 54 68 65 20 70 61 67 65 20 67 65 74 74 65 72 20  The page getter 
36390 6d 65 74 68 6f 64 20 66 6f 72 20 77 68 65 6e 20  method for when 
363a0 74 68 65 20 70 61 67 65 72 20 69 73 20 61 6e 20  the pager is an 
363b0 65 72 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a 73  error state */.s
363c0 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 67  tatic int getPag
363d0 65 45 72 72 6f 72 28 0a 20 20 50 61 67 65 72 20  eError(.  Pager 
363e0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a  *pPager,      /*
363f0 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20   The pager open 
36400 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
36410 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
36420 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  gno,          /*
36430 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
36440 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67  fetch */.  DbPag
36450 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
36460 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65  * Write a pointe
36470 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  r to the page he
36480 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
36490 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  s           /* P
364a0 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61  AGER_GET_XXX fla
364b0 67 73 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45  gs */.){.  UNUSE
364c0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 67 6e 6f  D_PARAMETER(pgno
364d0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
364e0 4d 45 54 45 52 28 66 6c 61 67 73 29 3b 0a 20 20  METER(flags);.  
364f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
36500 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
36510 4f 4b 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20  OK );.  *ppPage 
36520 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  = 0;.  return pP
36530 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d  ager->errCode;.}
36540 0a 0a 0a 2f 2a 20 44 69 73 70 61 74 63 68 20 61  .../* Dispatch a
36550 6c 6c 20 70 61 67 65 20 66 65 74 63 68 20 72 65  ll page fetch re
36560 71 75 65 73 74 73 20 74 6f 20 74 68 65 20 61 70  quests to the ap
36570 70 72 6f 70 72 69 61 74 65 20 67 65 74 74 65 72  propriate getter
36580 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 69 6e 74 20   method..*/.int 
36590 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
365a0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
365b0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
365c0 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ger open on the 
365d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
365e0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
365f0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
36600 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a  umber to fetch *
36610 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50  /.  DbPage **ppP
36620 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
36630 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
36640 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  e page here */. 
36650 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
36660 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45       /* PAGER_GE
36670 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29  T_XXX flags */.)
36680 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
36690 72 2d 3e 78 47 65 74 28 70 50 61 67 65 72 2c 20  r->xGet(pPager, 
366a0 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c  pgno, ppPage, fl
366b0 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ags);.}../*.** A
366c0 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
366d0 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
366e0 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
366f0 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
36700 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
36710 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
36720 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
36730 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
36740 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
36750 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 0a   not in cache. .
36760 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
36770 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
36780 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  .  The differenc
36790 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
367a0 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71  outine.** and sq
367b0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
367c0 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77  is that _get() w
367d0 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69  ill go to the di
367e0 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69  sk and read.** i
367f0 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68  n the page if th
36800 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
36810 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20  ready in cache. 
36820 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
36830 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
36840 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
36850 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20   in cache or if 
36860 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72  a disk I/O error
36870 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61   .** has ever ha
36880 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67  ppened..*/.DbPag
36890 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c  e *sqlite3PagerL
368a0 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
368b0 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
368c0 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68  .  sqlite3_pcach
368d0 65 5f 70 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  e_page *pPage;. 
368e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
368f0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
36900 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73  pgno!=0 );.  ass
36910 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50 43  ert( pPager->pPC
36920 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 70 50 61  ache!=0 );.  pPa
36930 67 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  ge = sqlite3Pcac
36940 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
36950 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30  pPCache, pgno, 0
36960 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
36970 67 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  ge==0 || pPager-
36980 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f  >hasHeldSharedLo
36990 63 6b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ck );.  if( pPag
369a0 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
369b0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
369c0 33 50 63 61 63 68 65 46 65 74 63 68 46 69 6e 69  3PcacheFetchFini
369d0 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  sh(pPager->pPCac
369e0 68 65 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 29  he, pgno, pPage)
369f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
36a00 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72 65  se a page refere
36a10 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  nce..**.** The s
36a20 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
36a30 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61  () and sqlite3Pa
36a40 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
36a50 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 0a 2a 2a  ) may only be.**
36a60 20 75 73 65 64 20 69 66 20 77 65 20 6b 6e 6f 77   used if we know
36a70 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 62   that the page b
36a80 65 69 6e 67 20 72 65 6c 65 61 73 65 64 20 69 73  eing released is
36a90 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 20 70 61   not the last pa
36aa0 67 65 2e 0a 2a 2a 20 54 68 65 20 62 74 72 65 65  ge..** The btree
36ab0 20 6c 61 79 65 72 20 61 6c 77 61 79 73 20 68 6f   layer always ho
36ac0 6c 64 73 20 70 61 67 65 31 20 6f 70 65 6e 20 75  lds page1 open u
36ad0 6e 74 69 6c 20 74 68 65 20 65 6e 64 2c 20 73 6f  ntil the end, so
36ae0 20 74 68 65 73 65 20 66 69 72 73 74 0a 2a 2a 20   these first.** 
36af0 74 6f 20 72 6f 75 74 69 6e 65 73 20 63 61 6e 20  to routines can 
36b00 62 65 20 75 73 65 64 20 74 6f 20 72 65 6c 65 61  be used to relea
36b10 73 65 20 61 6e 79 20 70 61 67 65 20 6f 74 68 65  se any page othe
36b20 72 20 74 68 61 6e 20 42 74 53 68 61 72 65 64 2e  r than BtShared.
36b30 70 50 61 67 65 31 2e 0a 2a 2a 0a 2a 2a 20 55 73  pPage1..**.** Us
36b40 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  e sqlite3PagerUn
36b50 72 65 66 50 61 67 65 4f 6e 65 28 29 20 74 6f 20  refPageOne() to 
36b60 72 65 6c 65 61 73 65 20 70 61 67 65 31 2e 20 20  release page1.  
36b70 54 68 69 73 20 6c 61 74 74 65 72 20 72 6f 75 74  This latter rout
36b80 69 6e 65 0a 2a 2a 20 63 68 65 63 6b 73 20 74 68  ine.** checks th
36b90 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
36ba0 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  f outstanding pa
36bb0 67 65 73 20 61 6e 64 20 69 66 20 74 68 65 20 6e  ges and if the n
36bc0 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
36bd0 73 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 69  s reaches zero i
36be0 74 20 64 72 6f 70 73 20 74 68 65 20 64 61 74 61  t drops the data
36bf0 62 61 73 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f  base lock..*/.vo
36c00 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  id sqlite3PagerU
36c10 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 44 62 50 61  nrefNotNull(DbPa
36c20 67 65 20 2a 70 50 67 29 7b 0a 20 20 54 45 53 54  ge *pPg){.  TEST
36c30 4f 4e 4c 59 28 20 50 61 67 65 72 20 2a 70 50 61  ONLY( Pager *pPa
36c40 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
36c50 72 3b 20 29 0a 20 20 61 73 73 65 72 74 28 20 70  r; ).  assert( p
36c60 50 67 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  Pg!=0 );.  if( p
36c70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
36c80 52 5f 4d 4d 41 50 20 29 7b 0a 20 20 20 20 61 73  R_MMAP ){.    as
36c90 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21  sert( pPg->pgno!
36ca0 3d 31 20 29 3b 20 20 2f 2a 20 50 61 67 65 31 20  =1 );  /* Page1 
36cb0 69 73 20 6e 65 76 65 72 20 6d 65 6d 6f 72 79 20  is never memory 
36cc0 6d 61 70 70 65 64 20 2a 2f 0a 20 20 20 20 70 61  mapped */.    pa
36cd0 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67  gerReleaseMapPag
36ce0 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b  e(pPg);.  }else{
36cf0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
36d00 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
36d10 20 20 7d 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20    }.  /* Do not 
36d20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  use this routine
36d30 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20   to release the 
36d40 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65 20 74  last reference t
36d50 6f 20 70 61 67 65 31 20 2a 2f 0a 20 20 61 73 73  o page1 */.  ass
36d60 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
36d70 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
36d80 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b  r->pPCache)>0 );
36d90 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  .}.void sqlite3P
36da0 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67 65  agerUnref(DbPage
36db0 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
36dc0 67 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72  g ) sqlite3Pager
36dd0 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67  UnrefNotNull(pPg
36de0 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  );.}.void sqlite
36df0 33 50 61 67 65 72 55 6e 72 65 66 50 61 67 65 4f  3PagerUnrefPageO
36e00 6e 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ne(DbPage *pPg){
36e10 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
36e20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 21  ;.  assert( pPg!
36e30 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
36e40 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a  pPg->pgno==1 );.
36e50 20 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e    assert( (pPg->
36e60 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4d 4d  flags & PGHDR_MM
36e70 41 50 29 3d 3d 30 20 29 3b 20 2f 2a 20 50 61 67  AP)==0 ); /* Pag
36e80 65 31 20 69 73 20 6e 65 76 65 72 20 6d 65 6d 6f  e1 is never memo
36e90 72 79 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20 70  ry mapped */.  p
36ea0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
36eb0 67 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ger;.  sqlite3Pa
36ec0 67 65 72 52 65 73 65 74 4c 6f 63 6b 54 69 6d 65  gerResetLockTime
36ed0 6f 75 74 28 70 50 61 67 65 72 29 3b 0a 20 20 73  out(pPager);.  s
36ee0 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65  qlite3PcacheRele
36ef0 61 73 65 28 70 50 67 29 3b 0a 20 20 70 61 67 65  ase(pPg);.  page
36f00 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
36f10 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
36f20 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
36f30 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65  is called at the
36f40 20 73 74 61 72 74 20 6f 66 20 65 76 65 72 79 20   start of every 
36f50 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
36f60 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  n..** There must
36f70 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45   already be a RE
36f80 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
36f90 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
36fa0 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c  database .** fil
36fb0 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  e when this rout
36fc0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
36fd0 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f  *.** Open the jo
36fe0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
36ff0 61 67 65 72 20 70 50 61 67 65 72 20 61 6e 64 20  ager pPager and 
37000 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20  write a journal 
37010 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65  header.** to the
37020 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66   start of it. If
37030 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
37040 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70  e savepoints, op
37050 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  en the sub-journ
37060 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54  al.** as well. T
37070 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
37080 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74  only used when t
37090 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
370a0 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65  is being .** ope
370b0 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61 20 72  ned to write a r
370c0 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20  ollback log for 
370d0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  a transaction. I
370e0 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a  t is not used .*
370f0 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * when opening a
37100 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot journal fil
37110 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
37120 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
37130 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
37140 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73  already open (as
37150 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78   it may be in ex
37160 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a  clusive mode),.*
37170 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * then this func
37180 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73  tion just writes
37190 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
371a0 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
371b0 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79  f the.** already
371c0 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a   open file. .**.
371d0 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** Whether or no
371e0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
371f0 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20  le is opened by 
37200 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74  this function, t
37210 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a  he.** Pager.pInJ
37220 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74  ournal bitvec st
37230 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
37240 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ated..**.** Retu
37250 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
37260 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
37270 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77  ccessful. Otherw
37280 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  ise, return .** 
37290 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
372a0 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61  the attempt to a
372b0 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49  llocate Pager.pI
372c0 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20  nJournal fails, 
372d0 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72  or .** an IO err
372e0 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69  or code if openi
372f0 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
37300 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
37310 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
37320 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  int pager_open_j
37330 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
37340 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
37350 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
37360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37370 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
37380 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
37390 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
373a0 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
373b0 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
373c0 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72  e of vfs pointer
373d0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
373e0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
373f0 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
37400 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
37410 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
37420 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
37430 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
37440 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
37450 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65  .  .  /* If alre
37460 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72  ady in the error
37470 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e   state, this fun
37480 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
37490 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74  .  But on.  ** t
374a0 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74  he other hand, t
374b0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
374c0 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77  ever called if w
374d0 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  e are already in
374e0 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73  .  ** an error s
374f0 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e  tate. */.  if( N
37500 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72  EVER(pPager->err
37510 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 70  Code) ) return p
37520 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
37530 0a 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65  .  if( !pagerUse
37540 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70  Wal(pPager) && p
37550 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
37560 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
37570 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20  LMODE_OFF ){.   
37580 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
37590 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74  nal = sqlite3Bit
375a0 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72  vecCreate(pPager
375b0 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 69  ->dbSize);.    i
375c0 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  f( pPager->pInJo
375d0 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  urnal==0 ){.    
375e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
375f0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
37600 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  }.  .    /* Open
37610 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
37620 65 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  e if it is not a
37630 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a  lready open. */.
37640 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
37650 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
37660 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
37670 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
37680 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
37690 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
376a0 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75     sqlite3MemJou
376b0 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
376c0 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >jfd);.      }el
376d0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
376e0 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  flags = SQLITE_O
376f0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
37700 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
37710 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53  ;.        int nS
37720 70 69 6c 6c 3b 0a 0a 23 69 66 20 53 51 4c 49 54  pill;..#if SQLIT
37730 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52  E_ENABLE_DATA_PR
37740 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20 20 20 20  OTECTION.       
37750 20 66 6c 61 67 73 20 7c 3d 20 28 70 50 61 67 65   flags |= (pPage
37760 72 2d 3e 76 66 73 46 6c 61 67 73 26 53 51 4c 49  r->vfsFlags&SQLI
37770 54 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54  TE_OPEN_FILEPROT
37780 45 43 54 49 4f 4e 5f 4d 41 53 4b 29 3b 0a 23 65  ECTION_MASK);.#e
37790 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66 28  ndif.        if(
377a0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
377b0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  e ){.          f
377c0 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f  lags |= (SQLITE_
377d0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
377e0 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  SE|SQLITE_OPEN_T
377f0 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  EMP_JOURNAL);.  
37800 20 20 20 20 20 20 20 20 6e 53 70 69 6c 6c 20 3d          nSpill =
37810 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6e   sqlite3Config.n
37820 53 74 6d 74 53 70 69 6c 6c 3b 0a 20 20 20 20 20  StmtSpill;.     
37830 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
37840 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
37850 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
37860 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  URNAL;.         
37870 20 6e 53 70 69 6c 6c 20 3d 20 6a 72 6e 6c 42 75   nSpill = jrnlBu
37880 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29  fferSize(pPager)
37890 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
378a0 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 2f        .        /
378b0 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
378c0 65 20 64 61 74 61 62 61 73 65 20 73 74 69 6c 6c  e database still
378d0 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61   has the same na
378e0 6d 65 20 61 73 20 69 74 20 64 69 64 20 77 68 65  me as it did whe
378f0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  n.        ** it 
37900 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f  was originally o
37910 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  pened. */.      
37920 20 20 72 63 20 3d 20 64 61 74 61 62 61 73 65 49    rc = databaseI
37930 73 55 6e 6d 6f 76 65 64 28 70 50 61 67 65 72 29  sUnmoved(pPager)
37940 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
37950 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
37960 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
37970 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e  lite3JournalOpen
37980 20 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   (.             
37990 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a   pVfs, pPager->z
379a0 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
379b0 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6e 53 70  >jfd, flags, nSp
379c0 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 29 3b  ill.          );
379d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
379e0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
379f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
37a00 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
37a10 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a 20  >jfd) );.    }. 
37a20 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69 74   .  .    /* Writ
37a30 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  e the first jour
37a40 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68  nal header to th
37a50 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
37a60 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a 20  nd open .    ** 
37a70 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
37a80 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  if necessary..  
37a90 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
37aa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
37ab0 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65      /* TODO: Che
37ac0 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ck if all of the
37ad0 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65  se are really re
37ae0 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20  quired. */.     
37af0 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
37b00 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
37b10 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
37b20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
37b30 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
37b40 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
37b50 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20  nalHdr = 0;.    
37b60 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
37b70 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
37b80 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
37b90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
37ba0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  {.    sqlite3Bit
37bb0 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
37bc0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
37bd0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a      pPager->pInJ
37be0 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 65  ournal = 0;.  }e
37bf0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
37c00 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
37c10 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
37c20 43 4b 45 44 20 29 3b 0a 20 20 20 20 70 50 61 67  CKED );.    pPag
37c30 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
37c40 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
37c50 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  OD;.  }..  retur
37c60 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  n rc;.}../*.** B
37c70 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61  egin a write-tra
37c80 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
37c90 73 70 65 63 69 66 69 65 64 20 70 61 67 65 72 20  specified pager 
37ca0 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a  object. If a .**
37cb0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
37cc0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
37cd0 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73  een opened, this
37ce0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
37cf0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  o-op..**.** If t
37d00 68 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65  he exFlag argume
37d10 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  nt is false, the
37d20 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61  n acquire at lea
37d30 73 74 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a  st a RESERVED.**
37d40 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
37d50 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65  abase file. If e
37d60 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74  xFlag is true, t
37d70 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c  hen acquire at l
37d80 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55  east.** an EXCLU
37d90 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75  SIVE lock. If su
37da0 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72  ch a lock is alr
37db0 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f  eady held, no lo
37dc0 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69  cking .** functi
37dd0 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c  ons need be call
37de0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
37df0 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61 72   subjInMemory ar
37e00 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65  gument is non-ze
37e10 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73 75 62  ro, then any sub
37e20 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64 0a  -journal opened.
37e30 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  ** within this t
37e40 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
37e50 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61 6e 20  be opened as an 
37e60 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e 20  in-memory file. 
37e70 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20 65  This.** has no e
37e80 66 66 65 63 74 20 69 66 20 74 68 65 20 73 75 62  ffect if the sub
37e90 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72 65  -journal is alre
37ea0 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73 20 69  ady opened (as i
37eb0 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a 2a  t may be when.**
37ec0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
37ed0 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72 20 69  usive mode) or i
37ee0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
37ef0 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69  n does not requi
37f00 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72  re a.** sub-jour
37f10 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75 62 6a  nal. If the subj
37f20 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e  InMemory argumen
37f30 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  t is zero, then 
37f40 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a 2a 20  any required.** 
37f50 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 69  sub-journal is i
37f60 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d 65  mplemented in-me
37f70 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72 20 69  mory if pPager i
37f80 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
37f90 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72 20  atabase, .** or 
37fa0 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61 72  using a temporar
37fb0 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69 73 65  y file otherwise
37fc0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
37fd0 50 61 67 65 72 42 65 67 69 6e 28 50 61 67 65 72  PagerBegin(Pager
37fe0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 78   *pPager, int ex
37ff0 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a 49 6e  Flag, int subjIn
38000 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20 72  Memory){.  int r
38010 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
38020 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
38030 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 20 70  rCode ) return p
38040 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
38050 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
38060 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
38070 52 45 41 44 45 52 20 26 26 20 70 50 61 67 65 72  READER && pPager
38080 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 45  ->eState<PAGER_E
38090 52 52 4f 52 20 29 3b 0a 20 20 70 50 61 67 65 72  RROR );.  pPager
380a0 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d  ->subjInMemory =
380b0 20 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f 72   (u8)subjInMemor
380c0 79 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41 59 53  y;..  if( ALWAYS
380d0 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d  (pPager->eState=
380e0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 29 20 29  =PAGER_READER) )
380f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
38100 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
38110 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  ==0 );..    if( 
38120 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
38130 65 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  er) ){.      /* 
38140 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
38150 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73  configured to us
38160 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  e locking_mode=e
38170 78 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 61 6e  xclusive, and an
38180 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73  .      ** exclus
38190 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
381a0 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
381b0 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 62  already held, ob
381c0 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20 20  tain it now..   
381d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
381e0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
381f0 65 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65 33  eMode && sqlite3
38200 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65  WalExclusiveMode
38210 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 2d  (pPager->pWal, -
38220 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
38230 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70   = pagerLockDb(p
38240 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
38250 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
38260 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
38270 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
38280 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
38290 20 20 7d 0a 20 20 20 20 20 20 20 20 28 76 6f 69    }.        (voi
382a0 64 29 73 71 6c 69 74 65 33 57 61 6c 45 78 63 6c  d)sqlite3WalExcl
382b0 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65 72  usiveMode(pPager
382c0 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a 20 20 20 20  ->pWal, 1);.    
382d0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 72    }..      /* Gr
382e0 61 62 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ab the write loc
382f0 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c  k on the log fil
38300 65 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  e. If successful
38310 2c 20 75 70 67 72 61 64 65 20 74 6f 0a 20 20 20  , upgrade to.   
38320 20 20 20 2a 2a 20 50 41 47 45 52 5f 52 45 53 45     ** PAGER_RESE
38330 52 56 45 44 20 73 74 61 74 65 2e 20 4f 74 68 65  RVED state. Othe
38340 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e  rwise, return an
38350 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
38360 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20  he caller..     
38370 20 2a 2a 20 54 68 65 20 62 75 73 79 2d 68 61 6e   ** The busy-han
38380 64 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e 76 6f  dler is not invo
38390 6b 65 64 20 69 66 20 61 6e 6f 74 68 65 72 20 63  ked if another c
383a0 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65 61 64  onnection alread
383b0 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c 64 73  y.      ** holds
383c0 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 2e   the write-lock.
383d0 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68   If possible, th
383e0 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69  e upper layer wi
383f0 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a 20 20 20 20  ll call it..    
38400 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
38410 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57  sqlite3WalBeginW
38420 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28  riteTransaction(
38430 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20  pPager->pWal);. 
38440 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
38450 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45  /* Obtain a RESE
38460 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
38470 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
38480 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 70 61  If the exFlag pa
38490 72 61 6d 65 74 65 72 0a 20 20 20 20 20 20 2a 2a  rameter.      **
384a0 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 69   is true, then i
384b0 6d 6d 65 64 69 61 74 65 6c 79 20 75 70 67 72 61  mmediately upgra
384c0 64 65 20 74 68 69 73 20 74 6f 20 61 6e 20 45 58  de this to an EX
384d0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68  CLUSIVE lock. Th
384e0 65 0a 20 20 20 20 20 20 2a 2a 20 62 75 73 79 2d  e.      ** busy-
384f0 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b  handler callback
38500 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68 65   can be used whe
38510 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f 20 74  n upgrading to t
38520 68 65 20 45 58 43 4c 55 53 49 56 45 0a 20 20 20  he EXCLUSIVE.   
38530 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20     ** lock, but 
38540 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e 69  not when obtaini
38550 6e 67 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ng the RESERVED 
38560 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lock..      */. 
38570 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c       rc = pagerL
38580 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52 45  ockDb(pPager, RE
38590 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SERVED_LOCK);.  
385a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
385b0 54 45 5f 4f 4b 20 26 26 20 65 78 46 6c 61 67 20  TE_OK && exFlag 
385c0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
385d0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
385e0 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  ck(pPager, EXCLU
385f0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
38600 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
38610 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
38620 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68 61   ){.      /* Cha
38630 6e 67 65 20 74 6f 20 57 52 49 54 45 52 5f 4c 4f  nge to WRITER_LO
38640 43 4b 45 44 20 73 74 61 74 65 2e 0a 20 20 20 20  CKED state..    
38650 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 41    **.      ** WA
38660 4c 20 6d 6f 64 65 20 73 65 74 73 20 50 61 67 65  L mode sets Page
38670 72 2e 65 53 74 61 74 65 20 74 6f 20 50 41 47 45  r.eState to PAGE
38680 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
38690 6f 72 20 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  or CACHEMOD.    
386a0 20 20 2a 2a 20 77 68 65 6e 20 69 74 20 68 61 73    ** when it has
386b0 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61 63   an open transac
386c0 74 69 6f 6e 2c 20 62 75 74 20 6e 65 76 65 72 20  tion, but