/ Hex Artifact Content
Login

Artifact 8b45b866507f6ead21ffc3907d8474b9157be46f853dae534bd86b3bd186cd6c:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 28 69 6e 74  PAGERID(p) ((int
15a0: 29 28 70 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e  )(p->fd)).#defin
15b0: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
15c0: 64 29 20 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a  d) ((int)fd)../*
15d0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 65 53  .** The Pager.eS
15e0: 74 61 74 65 20 76 61 72 69 61 62 6c 65 20 73 74  tate variable st
15f0: 6f 72 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  ores the current
1600: 20 27 73 74 61 74 65 27 20 6f 66 20 61 20 70 61   'state' of a pa
1610: 67 65 72 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20  ger. A.** pager 
1620: 6d 61 79 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e  may be in any on
1630: 65 20 6f 66 20 74 68 65 20 73 65 76 65 6e 20 73  e of the seven s
1640: 74 61 74 65 73 20 73 68 6f 77 6e 20 69 6e 20 74  tates shown in t
1650: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1660: 73 74 61 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a  state diagram..*
1670: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 4f 50 45 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d  OPEN <------+---
16a0: 2d 2d 2d 2b 0a 2a 2a 20 20 20 20 20 20 20 20 20  ---+.**         
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
16d0: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1700: 20 20 7c 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20    |      |.**   
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d              +---
1720: 2d 2d 2d 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d  ------> READER--
1730: 2d 2d 2d 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a  -----+      |.**
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1770: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1780: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1790: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
17a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
17b0: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
17c0: 49 54 45 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d  ITER_LOCKED-----
17d0: 2d 3e 20 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20  -> ERROR.**     
17e0: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
17f0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1800: 20 20 20 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a            ^  .**
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1840: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1850: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52    |<------WRITER
1860: 5f 43 41 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d  _CACHEMOD-------
1870: 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ->|.**          
1880: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
1890: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
18a0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18b0: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
18c0: 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20 20         V        
18d0: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
18e0: 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d             |<---
18f0: 2d 2d 2d 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44  ----WRITER_DBMOD
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20  ---------->|.** 
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1940: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1950: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
1960: 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  V               
1970: 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
1980: 20 20 20 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54      +<------WRIT
1990: 45 52 5f 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d  ER_FINISHED-----
19a0: 2d 2d 2d 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c  --->+.**.**.** L
19b0: 69 73 74 20 6f 66 20 73 74 61 74 65 20 74 72 61  ist of state tra
19c0: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
19d0: 20 43 20 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68   C [function] th
19e0: 61 74 20 70 65 72 66 6f 72 6d 73 20 65 61 63 68  at performs each
19f0: 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20  :.** .**   OPEN 
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1a10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1a20: 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67 65      [sqlite3Page
1a30: 72 53 68 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20  rSharedLock].** 
1a40: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a50: 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20      -> OPEN     
1a60: 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65             [page
1a70: 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20  r_unlock].**.** 
1a80: 20 20 52 45 41 44 45 52 20 20 20 20 20 20 20 20    READER        
1a90: 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f      -> WRITER_LO
1aa0: 43 4b 45 44 20 20 20 20 20 20 20 5b 73 71 6c 69  CKED       [sqli
1ab0: 74 65 33 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a  te3PagerBegin].*
1ac0: 2a 20 20 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  *   WRITER_LOCKE
1ad0: 44 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  D     -> WRITER_
1ae0: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 5b 70 61  CACHEMOD     [pa
1af0: 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b00: 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 43 41  ].**   WRITER_CA
1b10: 43 48 45 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54  CHEMOD   -> WRIT
1b20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 20 20  ER_DBMOD        
1b30: 5b 73 79 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a  [syncJournal].**
1b40: 20 20 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20     WRITER_DBMOD 
1b50: 20 20 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 46       -> WRITER_F
1b60: 49 4e 49 53 48 45 44 20 20 20 20 20 5b 73 71 6c  INISHED     [sql
1b70: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1b80: 68 61 73 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52  haseOne].**   WR
1b90: 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20  ITER_***        
1ba0: 2d 3e 20 52 45 41 44 45 52 20 20 20 20 20 20 20  -> READER       
1bb0: 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 65 6e         [pager_en
1bc0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a  d_transaction].*
1bd0: 2a 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a  *.**   WRITER_**
1be0: 2a 20 20 20 20 20 20 20 20 2d 3e 20 45 52 52 4f  *        -> ERRO
1bf0: 52 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R               
1c00: 5b 70 61 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a  [pager_error].**
1c10: 20 20 20 45 52 52 4f 52 20 20 20 20 20 20 20 20     ERROR        
1c20: 20 20 20 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20       -> OPEN    
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61 67              [pag
1c40: 65 72 5f 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a  er_unlock].** .*
1c50: 2a 0a 2a 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a  *.**  OPEN:.**.*
1c60: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 73  *    The pager s
1c70: 74 61 72 74 73 20 75 70 20 69 6e 20 74 68 69 73  tarts up in this
1c80: 20 73 74 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20   state. Nothing 
1c90: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 69 6e  is guaranteed in
1ca0: 20 74 68 69 73 0a 2a 2a 20 20 20 20 73 74 61 74   this.**    stat
1cb0: 65 20 2d 20 74 68 65 20 66 69 6c 65 20 6d 61 79  e - the file may
1cc0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c   or may not be l
1cd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 64 61  ocked and the da
1ce0: 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 0a 2a  tabase size is.*
1cf0: 2a 20 20 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68  *    unknown. Th
1d00: 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 6e  e database may n
1d10: 6f 74 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ot be read or wr
1d20: 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  itten..**.**    
1d30: 2a 20 4e 6f 20 72 65 61 64 20 6f 72 20 77 72 69  * No read or wri
1d40: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1d50: 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20  s active..**    
1d60: 2a 20 41 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e  * Any lock, or n
1d70: 6f 20 6c 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d  o lock at all, m
1d80: 61 79 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68  ay be held on th
1d90: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1da0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53  .**    * The dbS
1db0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 20  ize, dbOrigSize 
1dc0: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76  and dbFileSize v
1dd0: 61 72 69 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  ariables may not
1de0: 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a   be trusted..**.
1df0: 2a 2a 20 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a  **  READER:.**.*
1e00: 2a 20 20 20 20 49 6e 20 74 68 69 73 20 73 74 61  *    In this sta
1e10: 74 65 20 61 6c 6c 20 74 68 65 20 72 65 71 75 69  te all the requi
1e20: 72 65 6d 65 6e 74 73 20 66 6f 72 20 72 65 61 64  rements for read
1e30: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1e40: 20 69 6e 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62   in .**    rollb
1e50: 61 63 6b 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f  ack (non-WAL) mo
1e60: 64 65 20 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65  de are met. Unle
1e70: 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
1e80: 28 6f 72 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20  (or recently.** 
1e90: 20 20 20 77 61 73 29 20 69 6e 20 65 78 63 6c 75     was) in exclu
1ea0: 73 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64  sive-locking mod
1eb0: 65 2c 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  e, a user-level 
1ec0: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
1ed0: 20 69 73 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e   is .**    open.
1ee0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69   The database si
1ef0: 7a 65 20 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74  ze is known in t
1f00: 68 69 73 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  his state..**.**
1f10: 20 20 20 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e      A connection
1f20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f   running with lo
1f30: 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
1f40: 6c 20 65 6e 74 65 72 73 20 74 68 69 73 20 73 74  l enters this st
1f50: 61 74 65 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69  ate when.**    i
1f60: 74 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2d 74  t opens a read-t
1f70: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
1f80: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
1f90: 65 74 75 72 6e 73 20 74 6f 20 73 74 61 74 65 0a  eturns to state.
1fa0: 2a 2a 20 20 20 20 4f 50 45 4e 20 61 66 74 65 72  **    OPEN after
1fb0: 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61   the read-transa
1fc0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74  ction is complet
1fd0: 65 64 2e 20 48 6f 77 65 76 65 72 20 61 20 63 6f  ed. However a co
1fe0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72  nnection.**    r
1ff0: 75 6e 6e 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e  unning in lockin
2000: 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
2010: 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70   (including temp
2020: 20 64 61 74 61 62 61 73 65 73 29 20 72 65 6d 61   databases) rema
2030: 69 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69  ins in.**    thi
2040: 73 20 73 74 61 74 65 20 65 76 65 6e 20 61 66 74  s state even aft
2050: 65 72 20 74 68 65 20 72 65 61 64 2d 74 72 61 6e  er the read-tran
2060: 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65  saction is close
2070: 64 2e 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a  d. The only way.
2080: 2a 2a 20 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f  **    a locking_
2090: 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 63  mode=exclusive c
20a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 74 72  onnection can tr
20b0: 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45  ansition from RE
20c0: 41 44 45 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20  ADER to OPEN.** 
20d0: 20 20 20 69 73 20 76 69 61 20 74 68 65 20 45 52     is via the ER
20e0: 52 4f 52 20 73 74 61 74 65 20 28 73 65 65 20 62  ROR state (see b
20f0: 65 6c 6f 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  elow)..** .**   
2100: 20 2a 20 41 20 72 65 61 64 20 74 72 61 6e 73 61   * A read transa
2110: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74  ction may be act
2120: 69 76 65 20 28 62 75 74 20 61 20 77 72 69 74 65  ive (but a write
2130: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  -transaction can
2140: 6e 6f 74 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  not)..**    * A 
2150: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
2160: 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  r lock is held o
2170: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2180: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ile..**    * The
2190: 20 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65   dbSize variable
21a0: 20 6d 61 79 20 62 65 20 74 72 75 73 74 65 64 20   may be trusted 
21b0: 28 65 76 65 6e 20 69 66 20 61 20 75 73 65 72 2d  (even if a user-
21c0: 6c 65 76 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20  level read .**  
21d0: 20 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20      transaction 
21e0: 69 73 20 6e 6f 74 20 61 63 74 69 76 65 29 2e 20  is not active). 
21f0: 54 68 65 20 64 62 4f 72 69 67 53 69 7a 65 20 61  The dbOrigSize a
2200: 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61  nd dbFileSize va
2210: 72 69 61 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20  riables.**      
2220: 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73 74  may not be trust
2230: 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
2240: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2250: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 20 57   database is a W
2260: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  AL database, the
2270: 6e 20 74 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63  n the WAL connec
2280: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a  tion is open..**
2290: 20 20 20 20 2a 20 45 76 65 6e 20 69 66 20 61 20      * Even if a 
22a0: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
22b0: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74   is not open, it
22c0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22d0: 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 74 68 65  hat .**      the
22e0: 72 65 20 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75  re is no hot-jou
22f0: 72 6e 61 6c 20 69 6e 20 74 68 65 20 66 69 6c 65  rnal in the file
2300: 2d 73 79 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20  -system..**.**  
2310: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a  WRITER_LOCKED:.*
2320: 2a 0a 2a 2a 20 20 20 20 54 68 65 20 70 61 67 65  *.**    The page
2330: 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20  r moves to this 
2340: 73 74 61 74 65 20 66 72 6f 6d 20 52 45 41 44 45  state from READE
2350: 52 20 77 68 65 6e 20 61 20 77 72 69 74 65 2d 74  R when a write-t
2360: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2370: 20 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64   is first opened
2380: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2390: 2e 20 49 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  . In WRITER_LOCK
23a0: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f  ED state, all lo
23b0: 63 6b 73 20 0a 2a 2a 20 20 20 20 72 65 71 75 69  cks .**    requi
23c0: 72 65 64 20 74 6f 20 73 74 61 72 74 20 61 20 77  red to start a w
23d0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
23e0: 20 61 72 65 20 68 65 6c 64 2c 20 62 75 74 20 6e   are held, but n
23f0: 6f 20 61 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20  o actual .**    
2400: 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f  modifications to
2410: 20 74 68 65 20 63 61 63 68 65 20 6f 72 20 64 61   the cache or da
2420: 74 61 62 61 73 65 20 68 61 76 65 20 74 61 6b 65  tabase have take
2430: 6e 20 70 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20  n place..**.**  
2440: 20 20 49 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    In rollback mo
2450: 64 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f  de, a RESERVED o
2460: 72 20 28 69 66 20 74 68 65 20 74 72 61 6e 73 61  r (if the transa
2470: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
2480: 20 77 69 74 68 20 0a 2a 2a 20 20 20 20 42 45 47   with .**    BEG
2490: 49 4e 20 45 58 43 4c 55 53 49 56 45 29 20 45 58  IN EXCLUSIVE) EX
24a0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
24b0: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
24c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
24d0: 65 6e 0a 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20  en.**    moving 
24e0: 74 6f 20 74 68 69 73 20 73 74 61 74 65 2c 20 62  to this state, b
24f0: 75 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ut the journal f
2500: 69 6c 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  ile is not writt
2510: 65 6e 20 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20  en to or opened 
2520: 0a 2a 2a 20 20 20 20 74 6f 20 69 6e 20 74 68 69  .**    to in thi
2530: 73 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 20  s state. If the 
2540: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2550: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
2560: 65 64 20 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a  ed back while .*
2570: 2a 20 20 20 20 69 6e 20 57 52 49 54 45 52 5f 4c  *    in WRITER_L
2580: 4f 43 4b 45 44 20 73 74 61 74 65 2c 20 61 6c 6c  OCKED state, all
2590: 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65   that is require
25a0: 64 20 69 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  d is to unlock t
25b0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
25c0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
25d0: 20 20 49 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57    IN WAL mode, W
25e0: 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e  alBeginWriteTran
25f0: 73 61 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c  saction() is cal
2600: 6c 65 64 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  led to lock the 
2610: 6c 6f 67 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  log file..**    
2620: 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  If the connectio
2630: 6e 20 69 73 20 72 75 6e 6e 69 6e 67 20 77 69 74  n is running wit
2640: 68 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  h locking_mode=e
2650: 78 63 6c 75 73 69 76 65 2c 20 61 6e 20 61 74 74  xclusive, an att
2660: 65 6d 70 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61  empt.**    is ma
2670: 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  de to obtain an 
2680: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
2690: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26a0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ile..**.**    * 
26b0: 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  A write transact
26c0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
26d0: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
26e0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
26f0: 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64   in rollback-mod
2700: 65 2c 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  e, a RESERVED or
2710: 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 20 20 20   greater .**    
2720: 20 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f    lock is held o
2730: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2740: 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20  ile..**    * If 
2750: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2760: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f  s open in WAL-mo
2770: 64 65 2c 20 61 20 57 41 4c 20 77 72 69 74 65 20  de, a WAL write 
2780: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2790: 20 20 20 20 69 73 20 6f 70 65 6e 20 28 69 2e 65      is open (i.e
27a0: 2e 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69  . sqlite3WalBegi
27b0: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
27c0: 6e 28 29 20 68 61 73 20 62 65 65 6e 20 73 75 63  n() has been suc
27d0: 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20  cessfully.**    
27e0: 20 20 63 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20    called)..**   
27f0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
2800: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
2810: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
2820: 65 73 20 61 72 65 20 61 6c 6c 20 76 61 6c 69 64  es are all valid
2830: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2840: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2850: 67 65 72 20 63 61 63 68 65 20 68 61 76 65 20 6e  ger cache have n
2860: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
2870: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f  ..**    * The jo
2880: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f  urnal file may o
2890: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65  r may not be ope
28a0: 6e 2e 0a 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69  n..**    * Nothi
28b0: 6e 67 20 28 6e 6f 74 20 65 76 65 6e 20 74 68 65  ng (not even the
28c0: 20 66 69 72 73 74 20 68 65 61 64 65 72 29 20 68   first header) h
28d0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
28e0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
28f0: 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 43 41  **.**  WRITER_CA
2900: 43 48 45 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20  CHEMOD:.**.**   
2910: 20 41 20 70 61 67 65 72 20 6d 6f 76 65 73 20 66   A pager moves f
2920: 72 6f 6d 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45  rom WRITER_LOCKE
2930: 44 20 73 74 61 74 65 20 74 6f 20 74 68 69 73 20  D state to this 
2940: 73 74 61 74 65 20 77 68 65 6e 20 61 20 70 61 67  state when a pag
2950: 65 20 69 73 0a 2a 2a 20 20 20 20 66 69 72 73 74  e is.**    first
2960: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
2970: 20 75 70 70 65 72 20 6c 61 79 65 72 2e 20 49 6e   upper layer. In
2980: 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74   rollback mode t
2990: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
29a0: 2a 2a 20 20 20 20 69 73 20 6f 70 65 6e 65 64 20  **    is opened 
29b0: 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
29c0: 72 65 61 64 79 20 6f 70 65 6e 29 20 61 6e 64 20  ready open) and 
29d0: 61 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  a header written
29e0: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 73 74   to the.**    st
29f0: 61 72 74 20 6f 66 20 69 74 2e 20 54 68 65 20 64  art of it. The d
2a00: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
2a10: 64 69 73 6b 20 68 61 73 20 6e 6f 74 20 62 65 65  disk has not bee
2a20: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  n modified..**.*
2a30: 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65 20 74  *    * A write t
2a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
2a50: 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20  tive..**    * A 
2a60: 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
2a70: 74 65 72 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ter lock is held
2a80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2a90: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54   file..**    * T
2aa0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ab0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
2ac0: 66 69 72 73 74 20 68 65 61 64 65 72 20 68 61 73  first header has
2ad0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a   been written .*
2ae0: 2a 20 20 20 20 20 20 74 6f 20 69 74 2c 20 62 75  *      to it, bu
2af0: 74 20 74 68 65 20 68 65 61 64 65 72 20 68 61 73  t the header has
2b00: 20 6e 6f 74 20 62 65 65 6e 20 73 79 6e 63 65 64   not been synced
2b10: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20   to disk..**    
2b20: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
2b30: 66 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  f the page cache
2b40: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
2b50: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54  ied..**.**  WRIT
2b60: 45 52 5f 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20  ER_DBMOD:.**.** 
2b70: 20 20 20 54 68 65 20 70 61 67 65 72 20 74 72 61     The pager tra
2b80: 6e 73 69 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52  nsitions from WR
2b90: 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e  ITER_CACHEMOD in
2ba0: 74 6f 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  to WRITER_DBMOD 
2bb0: 73 74 61 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e  state.**    when
2bc0: 20 69 74 20 6d 6f 64 69 66 69 65 73 20 74 68 65   it modifies the
2bd0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2be0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2bf0: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  WAL connections.
2c00: 2a 2a 20 20 20 20 6e 65 76 65 72 20 65 6e 74 65  **    never ente
2c10: 72 20 74 68 69 73 20 73 74 61 74 65 20 28 73 69  r this state (si
2c20: 6e 63 65 20 74 68 65 79 20 64 6f 20 6e 6f 74 20  nce they do not 
2c30: 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
2c40: 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20  ase file,.**    
2c50: 6a 75 73 74 20 74 68 65 20 6c 6f 67 20 66 69 6c  just the log fil
2c60: 65 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  e)..**.**    * A
2c70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2c80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2c90: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ca0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
2cb0: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2cc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2cd0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ce0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2cf0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2d00: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2d10: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2d20: 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
2d30: 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  isk..**    * The
2d40: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d50: 20 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65   page cache have
2d60: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 28   been modified (
2d70: 61 6e 64 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20  and possibly.** 
2d80: 20 20 20 20 20 77 72 69 74 74 65 6e 20 74 6f 20       written to 
2d90: 64 69 73 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52  disk)..**.**  WR
2da0: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a  ITER_FINISHED:.*
2db0: 2a 0a 2a 2a 20 20 20 20 49 74 20 69 73 20 6e 6f  *.**    It is no
2dc0: 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  t possible for a
2dd0: 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   WAL connection 
2de0: 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 73 74  to enter this st
2df0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
2e00: 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61  rollback-mode pa
2e10: 67 65 72 20 63 68 61 6e 67 65 73 20 74 6f 20 57  ger changes to W
2e20: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73  RITER_FINISHED s
2e30: 74 61 74 65 20 66 72 6f 6d 20 57 52 49 54 45 52  tate from WRITER
2e40: 5f 44 42 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61  _DBMOD.**    sta
2e50: 74 65 20 61 66 74 65 72 20 74 68 65 20 65 6e 74  te after the ent
2e60: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
2e70: 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
2e80: 66 75 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  fully written in
2e90: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 64 61 74  to the.**    dat
2ea0: 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 74  abase file. In t
2eb0: 68 69 73 20 73 74 61 74 65 20 74 68 65 20 74 72  his state the tr
2ec0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65  ansaction may be
2ed0: 20 63 6f 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c   committed simpl
2ee0: 79 0a 2a 2a 20 20 20 20 62 79 20 66 69 6e 61 6c  y.**    by final
2ef0: 69 7a 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  izing the journa
2f00: 6c 20 66 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20  l file. Once in 
2f10: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
2f20: 73 74 61 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a  state, it is .**
2f30: 20 20 20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65      not possible
2f40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 64   to modify the d
2f50: 61 74 61 62 61 73 65 20 66 75 72 74 68 65 72 2e  atabase further.
2f60: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2f70: 74 68 65 20 75 70 70 65 72 20 0a 2a 2a 20 20 20  the upper .**   
2f80: 20 6c 61 79 65 72 20 6d 75 73 74 20 65 69 74 68   layer must eith
2f90: 65 72 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  er commit or rol
2fa0: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
2fb0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ction..**.**    
2fc0: 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61  * A write transa
2fd0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
2fe0: 0a 2a 2a 20 20 20 20 2a 20 41 6e 20 45 58 43 4c  .**    * An EXCL
2ff0: 55 53 49 56 45 20 6f 72 20 67 72 65 61 74 65 72  USIVE or greater
3000: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
3010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3020: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20  le..**    * All 
3030: 77 72 69 74 69 6e 67 20 61 6e 64 20 73 79 6e 63  writing and sync
3040: 69 6e 67 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ing of journal a
3050: 6e 64 20 64 61 74 61 62 61 73 65 20 64 61 74 61  nd database data
3060: 20 68 61 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a   has finished..*
3070: 2a 20 20 20 20 20 20 49 66 20 6e 6f 20 65 72 72  *      If no err
3080: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c  or occurred, all
3090: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 69 73   that remains is
30a0: 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
30b0: 20 6a 6f 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20   journal to.**  
30c0: 20 20 20 20 63 6f 6d 6d 69 74 20 74 68 65 20 74      commit the t
30d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 61  ransaction. If a
30e0: 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
30f0: 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  r, the caller wi
3100: 6c 6c 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20  ll need.**      
3110: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
3120: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a  transaction. .**
3130: 0a 2a 2a 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a  .**  ERROR:.**.*
3140: 2a 20 20 20 20 54 68 65 20 45 52 52 4f 52 20 73  *    The ERROR s
3150: 74 61 74 65 20 69 73 20 65 6e 74 65 72 65 64 20  tate is entered 
3160: 77 68 65 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69  when an IO or di
3170: 73 6b 2d 66 75 6c 6c 20 65 72 72 6f 72 20 28 69  sk-full error (i
3180: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53  ncluding.**    S
3190: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
31a0: 4d 29 20 6f 63 63 75 72 73 20 61 74 20 61 20 70  M) occurs at a p
31b0: 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
31c0: 20 74 68 61 74 20 6d 61 6b 65 73 20 69 74 20 0a   that makes it .
31d0: 2a 2a 20 20 20 20 64 69 66 66 69 63 75 6c 74 20  **    difficult 
31e0: 74 6f 20 62 65 20 73 75 72 65 20 74 68 61 74 20  to be sure that 
31f0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
3200: 67 65 72 20 73 74 61 74 65 20 28 63 61 63 68 65  ger state (cache
3210: 20 63 6f 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20   contents, .**  
3220: 20 20 64 62 20 73 69 7a 65 20 65 74 63 2e 29 20    db size etc.) 
3230: 61 72 65 20 63 6f 6e 73 69 73 74 65 6e 74 20 77  are consistent w
3240: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
3250: 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
3260: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65  tem..**.**    Te
3270: 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20 66 69  mporary pager fi
3280: 6c 65 73 20 6d 61 79 20 65 6e 74 65 72 20 74 68  les may enter th
3290: 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 62  e ERROR state, b
32a0: 75 74 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ut in-memory pag
32b0: 65 72 73 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74  ers.**    cannot
32c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65  ..**.**    For e
32d0: 78 61 6d 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f  xample, if an IO
32e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
32f0: 69 6c 65 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ile performing a
3300: 20 72 6f 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20   rollback, .**  
3310: 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f    the contents o
3320: 66 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  f the page-cache
3330: 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
3340: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
3350: 73 74 61 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20  state..**    At 
3360: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f  this point it wo
3370: 75 6c 64 20 62 65 20 64 61 6e 67 65 72 6f 75 73  uld be dangerous
3380: 20 74 6f 20 63 68 61 6e 67 65 20 62 61 63 6b 20   to change back 
3390: 74 6f 20 52 45 41 44 45 52 20 73 74 61 74 65 0a  to READER state.
33a0: 2a 2a 20 20 20 20 28 61 73 20 75 73 75 61 6c 6c  **    (as usuall
33b0: 79 20 68 61 70 70 65 6e 73 20 61 66 74 65 72 20  y happens after 
33c0: 61 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79  a rollback). Any
33d0: 20 73 75 62 73 65 71 75 65 6e 74 20 72 65 61 64   subsequent read
33e0: 65 72 73 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20  ers might.**    
33f0: 72 65 70 6f 72 74 20 64 61 74 61 62 61 73 65 20  report database 
3400: 63 6f 72 72 75 70 74 69 6f 6e 20 28 64 75 65 20  corruption (due 
3410: 74 6f 20 74 68 65 20 69 6e 63 6f 6e 73 69 73 74  to the inconsist
3420: 65 6e 74 20 63 61 63 68 65 29 2c 20 61 6e 64 20  ent cache), and 
3430: 69 66 0a 2a 2a 20 20 20 20 74 68 65 79 20 75 70  if.**    they up
3440: 67 72 61 64 65 20 74 6f 20 77 72 69 74 65 72 73  grade to writers
3450: 2c 20 74 68 65 79 20 6d 61 79 20 69 6e 61 64 76  , they may inadv
3460: 65 72 74 65 6e 74 6c 79 20 63 6f 72 72 75 70 74  ertently corrupt
3470: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
3480: 20 20 20 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f      file. To avo
3490: 69 64 20 74 68 69 73 20 68 61 7a 61 72 64 2c 20  id this hazard, 
34a0: 74 68 65 20 70 61 67 65 72 20 73 77 69 74 63 68  the pager switch
34b0: 65 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  es into the ERRO
34c0: 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e  R state.**    in
34d0: 73 74 65 61 64 20 6f 66 20 52 45 41 44 45 52 20  stead of READER 
34e0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 75 63 68 20 61  following such a
34f0: 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  n error..**.**  
3500: 20 20 4f 6e 63 65 20 69 74 20 68 61 73 20 65 6e    Once it has en
3510: 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
3520: 73 74 61 74 65 2c 20 61 6e 79 20 61 74 74 65 6d  state, any attem
3530: 70 74 20 74 6f 20 75 73 65 20 74 68 65 20 70 61  pt to use the pa
3540: 67 65 72 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61  ger.**    to rea
3550: 64 20 6f 72 20 77 72 69 74 65 20 64 61 74 61 20  d or write data 
3560: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
3570: 2e 20 45 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e  . Eventually, on
3580: 63 65 20 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75  ce all .**    ou
3590: 74 73 74 61 6e 64 69 6e 67 20 74 72 61 6e 73 61  tstanding transa
35a0: 63 74 69 6f 6e 73 20 68 61 76 65 20 62 65 65 6e  ctions have been
35b0: 20 61 62 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20   abandoned, the 
35c0: 70 61 67 65 72 20 69 73 20 61 62 6c 65 20 74 6f  pager is able to
35d0: 0a 2a 2a 20 20 20 20 74 72 61 6e 73 69 74 69 6f  .**    transitio
35e0: 6e 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  n back to OPEN s
35f0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 69 6e 67  tate, discarding
3600: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3610: 20 74 68 65 20 0a 2a 2a 20 20 20 20 70 61 67 65   the .**    page
3620: 2d 63 61 63 68 65 20 61 6e 64 20 61 6e 79 20 6f  -cache and any o
3630: 74 68 65 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  ther in-memory s
3640: 74 61 74 65 20 61 74 20 74 68 65 20 73 61 6d 65  tate at the same
3650: 20 74 69 6d 65 2e 20 45 76 65 72 79 74 68 69 6e   time. Everythin
3660: 67 0a 2a 2a 20 20 20 20 69 73 20 72 65 6c 6f 61  g.**    is reloa
3670: 64 65 64 20 66 72 6f 6d 20 64 69 73 6b 20 28 61  ded from disk (a
3680: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
3690: 2c 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  , hot-journal ro
36a0: 6c 6c 62 61 63 6b 20 70 65 66 6f 72 6d 65 64 29  llback peformed)
36b0: 0a 2a 2a 20 20 20 20 77 68 65 6e 20 61 20 72 65  .**    when a re
36c0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ad-transaction i
36d0: 73 20 6e 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e  s next opened on
36e0: 20 74 68 65 20 70 61 67 65 72 20 28 74 72 61 6e   the pager (tran
36f0: 73 69 74 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20  sitioning.**    
3700: 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 52  the pager into R
3710: 45 41 44 45 52 20 73 74 61 74 65 29 2e 20 41 74  EADER state). At
3720: 20 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20   that point the 
3730: 73 79 73 74 65 6d 20 68 61 73 20 72 65 63 6f 76  system has recov
3740: 65 72 65 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d  ered .**    from
3750: 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a   the error..**.*
3760: 2a 20 20 20 20 53 70 65 63 69 66 69 63 61 6c 6c  *    Specificall
3770: 79 2c 20 74 68 65 20 70 61 67 65 72 20 6a 75 6d  y, the pager jum
3780: 70 73 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f  ps into the ERRO
3790: 52 20 73 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a  R state if:.**.*
37a0: 2a 20 20 20 20 20 20 31 2e 20 41 6e 20 65 72 72  *      1. An err
37b0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
37c0: 61 74 74 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c  attempting a rol
37d0: 6c 62 61 63 6b 2e 20 54 68 69 73 20 68 61 70 70  lback. This happ
37e0: 65 6e 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20  ens in.**       
37f0: 20 20 66 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74    function sqlit
3800: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
3810: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e  )..**.**      2.
3820: 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   An error occurs
3830: 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e   while attemptin
3840: 67 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20  g to finalize a 
3850: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
3860: 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e          followin
3870: 67 20 61 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75  g a commit in fu
3880: 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61  nction sqlite3Pa
3890: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
38a0: 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  o()..**.**      
38b0: 33 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75  3. An error occu
38c0: 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70 74  rs while attempt
38d0: 69 6e 67 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ing to write to 
38e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a  the journal or.*
38f0: 2a 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61  *         databa
3900: 73 65 20 66 69 6c 65 20 69 6e 20 66 75 6e 63 74  se file in funct
3910: 69 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28  ion pagerStress(
3920: 29 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  ) in order to fr
3930: 65 65 20 75 70 0a 2a 2a 20 20 20 20 20 20 20 20  ee up.**        
3940: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
3950: 20 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73    In other cases
3960: 2c 20 74 68 65 20 65 72 72 6f 72 20 69 73 20 72  , the error is r
3970: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 62  eturned to the b
3980: 2d 74 72 65 65 20 6c 61 79 65 72 2e 20 54 68 65  -tree layer. The
3990: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61   b-tree.**    la
39a0: 79 65 72 20 74 68 65 6e 20 61 74 74 65 6d 70 74  yer then attempt
39b0: 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  s a rollback ope
39c0: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
39d0: 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a  rror condition .
39e0: 2a 2a 20 20 20 20 70 65 72 73 69 73 74 73 2c 20  **    persists, 
39f0: 74 68 65 20 70 61 67 65 72 20 65 6e 74 65 72 73  the pager enters
3a00: 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65   the ERROR state
3a10: 20 76 69 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28   via condition (
3a20: 31 29 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  1) above..**.** 
3a30: 20 20 20 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29     Condition (3)
3a40: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 62 65   is necessary be
3a50: 63 61 75 73 65 20 69 74 20 63 61 6e 20 62 65 20  cause it can be 
3a60: 74 72 69 67 67 65 72 65 64 20 62 79 20 61 20 72  triggered by a r
3a70: 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73  ead-only.**    s
3a80: 74 61 74 65 6d 65 6e 74 20 65 78 65 63 75 74 65  tatement execute
3a90: 64 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  d within a trans
3aa0: 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
3ab0: 63 61 73 65 2c 20 69 66 20 74 68 65 20 65 72 72  case, if the err
3ac0: 6f 72 0a 2a 2a 20 20 20 20 63 6f 64 65 20 77 65  or.**    code we
3ad0: 72 65 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  re simply return
3ae0: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2c 20  ed to the user, 
3af0: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
3b00: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
3b10: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
3b20: 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
3b30: 6b 2c 20 61 73 20 69 74 20 61 73 73 75 6d 65 73  k, as it assumes
3b40: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
3b50: 6e 20 61 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f  n a.**    read-o
3b60: 6e 6c 79 20 73 74 61 74 65 6d 65 6e 74 20 63 61  nly statement ca
3b70: 6e 6e 6f 74 20 6c 65 61 76 65 20 74 68 65 20 70  nnot leave the p
3b80: 61 67 65 72 20 69 6e 20 61 6e 20 69 6e 74 65 72  ager in an inter
3b90: 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65  nally inconsiste
3ba0: 6e 74 20 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e  nt .**    state.
3bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  .**.**    * The 
3bc0: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
3bd0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
3be0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3bf0: 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e   than SQLITE_OK.
3c00: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 72 65 20 61  .**    * There a
3c10: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  re one or more o
3c20: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
3c30: 65 6e 63 65 73 20 74 6f 20 70 61 67 65 73 20 28  ences to pages (
3c40: 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 20 20 20  after the.**    
3c50: 20 20 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65    last reference
3c60: 20 69 73 20 64 72 6f 70 70 65 64 20 74 68 65 20   is dropped the 
3c70: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76  pager should mov
3c80: 65 20 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73  e back to OPEN s
3c90: 74 61 74 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54  tate)..**    * T
3ca0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
3cb0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  an in-memory pag
3cc0: 65 72 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a  er..**    .**.**
3cd0: 20 4e 6f 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Notes:.**.**   
3ce0: 2a 20 41 20 70 61 67 65 72 20 69 73 20 6e 65 76  * A pager is nev
3cf0: 65 72 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d  er in WRITER_DBM
3d00: 4f 44 20 6f 72 20 57 52 49 54 45 52 5f 46 49 4e  OD or WRITER_FIN
3d10: 49 53 48 45 44 20 73 74 61 74 65 20 69 66 20 74  ISHED state if t
3d20: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63  he.**     connec
3d30: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20  tion is open in 
3d40: 57 41 4c 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20  WAL mode. A WAL 
3d50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c  connection is al
3d60: 77 61 79 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20  ways in one.**  
3d70: 20 20 20 6f 66 20 74 68 65 20 66 69 72 73 74 20     of the first 
3d80: 66 6f 75 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a  four states..**.
3d90: 2a 2a 20 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  **   * Normally,
3da0: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70   a connection op
3db0: 65 6e 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  en in exclusive 
3dc0: 6d 6f 64 65 20 69 73 20 6e 65 76 65 72 20 69 6e  mode is never in
3dd0: 20 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20   PAGER_OPEN.**  
3de0: 20 20 20 73 74 61 74 65 2e 20 54 68 65 72 65 20     state. There 
3df0: 61 72 65 20 74 77 6f 20 65 78 63 65 70 74 69 6f  are two exceptio
3e00: 6e 73 3a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ns: immediately 
3e10: 61 66 74 65 72 20 65 78 63 6c 75 73 69 76 65 2d  after exclusive-
3e20: 6d 6f 64 65 20 68 61 73 0a 2a 2a 20 20 20 20 20  mode has.**     
3e30: 62 65 65 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28  been turned on (
3e40: 61 6e 64 20 62 65 66 6f 72 65 20 61 6e 79 20 72  and before any r
3e50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
3e60: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a  nsactions are .*
3e70: 2a 20 20 20 20 20 65 78 65 63 75 74 65 64 29 2c  *     executed),
3e80: 20 61 6e 64 20 77 68 65 6e 20 74 68 65 20 70 61   and when the pa
3e90: 67 65 72 20 69 73 20 6c 65 61 76 69 6e 67 20 74  ger is leaving t
3ea0: 68 65 20 22 65 72 72 6f 72 20 73 74 61 74 65 22  he "error state"
3eb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20  ..**.**   * See 
3ec0: 61 6c 73 6f 3a 20 61 73 73 65 72 74 5f 70 61 67  also: assert_pag
3ed0: 65 72 5f 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23  er_state()..*/.#
3ee0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4f 50 45  define PAGER_OPE
3ef0: 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
3f00: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
3f10: 45 52 5f 52 45 41 44 45 52 20 20 20 20 20 20 20  ER_READER       
3f20: 20 20 20 20 20 20 20 20 20 31 0a 23 64 65 66 69           1.#defi
3f30: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f40: 4c 4f 43 4b 45 44 20 20 20 20 20 20 20 20 20 32  LOCKED         2
3f50: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3f60: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 20  RITER_CACHEMOD  
3f70: 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 50       3.#define P
3f80: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
3f90: 44 20 20 20 20 20 20 20 20 20 20 34 0a 23 64 65  D          4.#de
3fa0: 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45  fine PAGER_WRITE
3fb0: 52 5f 46 49 4e 49 53 48 45 44 20 20 20 20 20 20  R_FINISHED      
3fc0: 20 35 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52   5.#define PAGER
3fd0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20  _ERROR          
3fe0: 20 20 20 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20         6../*.** 
3ff0: 54 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  The Pager.eLock 
4000: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f  variable is almo
4010: 73 74 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f  st always set to
4020: 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20   one of the .** 
4030: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e  following lockin
4040: 67 2d 73 74 61 74 65 73 2c 20 61 63 63 6f 72 64  g-states, accord
4050: 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20  ing to the lock 
4060: 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f  currently held o
4070: 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  n.** the databas
4080: 65 20 66 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c  e file: NO_LOCK,
4090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
40a0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45  SERVED_LOCK or E
40b0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
40c0: 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20  * This variable 
40d0: 69 73 20 6b 65 70 74 20 75 70 20 74 6f 20 64 61  is kept up to da
40e0: 74 65 20 61 73 20 6c 6f 63 6b 73 20 61 72 65 20  te as locks are 
40f0: 74 61 6b 65 6e 20 61 6e 64 20 72 65 6c 65 61 73  taken and releas
4100: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 70 61 67  ed by.** the pag
4110: 65 72 4c 6f 63 6b 44 62 28 29 20 61 6e 64 20 70  erLockDb() and p
4120: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77  agerUnlockDb() w
4130: 72 61 70 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49  rappers..**.** I
4140: 66 20 74 68 65 20 56 46 53 20 78 4c 6f 63 6b 28  f the VFS xLock(
4150: 29 20 6f 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72  ) or xUnlock() r
4160: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
4170: 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
4180: 45 5f 42 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20  E_BUSY.** (i.e. 
4190: 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54  one of the SQLIT
41a0: 45 5f 49 4f 45 52 52 20 73 75 62 74 79 70 65 73  E_IOERR subtypes
41b0: 29 2c 20 69 74 20 69 73 20 6e 6f 74 20 63 6c 65  ), it is not cle
41c0: 61 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ar whether or no
41d0: 74 0a 2a 2a 20 74 68 65 20 6f 70 65 72 61 74 69  t.** the operati
41e0: 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
41f0: 6c 2e 20 49 6e 20 74 68 65 73 65 20 63 69 72 63  l. In these circ
4200: 75 6d 73 74 61 6e 63 65 73 20 70 61 67 65 72 4c  umstances pagerL
4210: 6f 63 6b 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70  ockDb() and.** p
4220: 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74  agerUnlockDb() t
4230: 61 6b 65 20 61 20 63 6f 6e 73 65 72 76 61 74 69  ake a conservati
4240: 76 65 20 61 70 70 72 6f 61 63 68 20 2d 20 65 4c  ve approach - eL
4250: 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 75 70  ock is always up
4260: 64 61 74 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e  dated.** when un
4270: 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69 6c 65  locking the file
4280: 2c 20 61 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74  , and only updat
4290: 65 64 20 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20  ed when locking 
42a0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 0a  the file if the.
42b0: 2a 2a 20 56 46 53 20 63 61 6c 6c 20 69 73 20 73  ** VFS call is s
42c0: 75 63 63 65 73 73 66 75 6c 2e 20 54 68 69 73 20  uccessful. This 
42d0: 77 61 79 2c 20 74 68 65 20 50 61 67 65 72 2e 65  way, the Pager.e
42e0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 6d 61  Lock variable ma
42f0: 79 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61  y be set.** to a
4300: 20 6c 65 73 73 20 65 78 63 6c 75 73 69 76 65 20   less exclusive 
4310: 28 6c 6f 77 65 72 29 20 76 61 6c 75 65 20 74 68  (lower) value th
4320: 61 6e 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74  an the lock that
4330: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 68 65 6c   is actually hel
4340: 64 0a 2a 2a 20 61 74 20 74 68 65 20 73 79 73 74  d.** at the syst
4350: 65 6d 20 6c 65 76 65 6c 2c 20 62 75 74 20 69 74  em level, but it
4360: 20 69 73 20 6e 65 76 65 72 20 73 65 74 20 74 6f   is never set to
4370: 20 61 20 6d 6f 72 65 20 65 78 63 6c 75 73 69 76   a more exclusiv
4380: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  e value..**.** T
4390: 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 73  his is usually s
43a0: 61 66 65 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f  afe. If an xUnlo
43b0: 63 6b 20 66 61 69 6c 73 20 6f 72 20 61 70 70 65  ck fails or appe
43c0: 61 72 73 20 74 6f 20 66 61 69 6c 2c 20 74 68 65  ars to fail, the
43d0: 72 65 20 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20  re may .** be a 
43e0: 66 65 77 20 72 65 64 75 6e 64 61 6e 74 20 78 4c  few redundant xL
43f0: 6f 63 6b 28 29 20 63 61 6c 6c 73 20 6f 72 20 61  ock() calls or a
4400: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 68 65 6c   lock may be hel
4410: 64 20 66 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61  d for longer tha
4420: 6e 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 62  n.** required, b
4430: 75 74 20 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c  ut nothing reall
4440: 79 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  y goes wrong..**
4450: 0a 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f  .** The exceptio
4460: 6e 20 69 73 20 77 68 65 6e 20 74 68 65 20 64 61  n is when the da
4470: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75  tabase file is u
4480: 6e 6c 6f 63 6b 65 64 20 61 73 20 74 68 65 20 70  nlocked as the p
4490: 61 67 65 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72  ager moves.** fr
44a0: 6f 6d 20 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e  om ERROR to OPEN
44b0: 20 73 74 61 74 65 2e 20 41 74 20 74 68 69 73 20   state. At this 
44c0: 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
44d0: 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  be a hot-journal
44e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65   file .** in the
44f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 74 68 61   file-system tha
4500: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
4510: 6c 6c 65 64 20 62 61 63 6b 20 28 61 73 20 70 61  lled back (as pa
4520: 72 74 20 6f 66 20 61 6e 20 4f 50 45 4e 2d 3e 53  rt of an OPEN->S
4530: 48 41 52 45 44 0a 2a 2a 20 74 72 61 6e 73 69 74  HARED.** transit
4540: 69 6f 6e 2c 20 62 79 20 74 68 65 20 73 61 6d 65  ion, by the same
4550: 20 70 61 67 65 72 20 6f 72 20 61 6e 79 20 6f 74   pager or any ot
4560: 68 65 72 29 2e 20 49 66 20 74 68 65 20 63 61 6c  her). If the cal
4570: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
4580: 2a 20 66 61 69 6c 73 20 61 74 20 74 68 69 73 20  * fails at this 
4590: 70 6f 69 6e 74 20 61 6e 64 20 74 68 65 20 70 61  point and the pa
45a0: 67 65 72 20 69 73 20 6c 65 66 74 20 68 6f 6c 64  ger is left hold
45b0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
45c0: 20 6c 6f 63 6b 2c 20 74 68 69 73 0a 2a 2a 20 63   lock, this.** c
45d0: 61 6e 20 63 6f 6e 66 75 73 65 20 74 68 65 20 63  an confuse the c
45e0: 61 6c 6c 20 74 6f 20 78 43 68 65 63 6b 52 65 73  all to xCheckRes
45f0: 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
4600: 20 6d 61 64 65 20 6c 61 74 65 72 20 61 73 20 70   made later as p
4610: 61 72 74 0a 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f  art.** of hot-jo
4620: 75 72 6e 61 6c 20 64 65 74 65 63 74 69 6f 6e 2e  urnal detection.
4630: 0a 2a 2a 0a 2a 2a 20 78 43 68 65 63 6b 52 65 73  .**.** xCheckRes
4640: 65 72 76 65 64 4c 6f 63 6b 28 29 20 69 73 20 64  ervedLock() is d
4650: 65 66 69 6e 65 64 20 61 73 20 72 65 74 75 72 6e  efined as return
4660: 69 6e 67 20 74 72 75 65 20 22 69 66 20 74 68 65  ing true "if the
4670: 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
4680: 20 0a 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64 20 62   .** lock held b
4690: 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  y this process o
46a0: 72 20 61 6e 79 20 6f 74 68 65 72 73 22 2e 20 53  r any others". S
46b0: 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  o xCheckReserved
46c0: 4c 6f 63 6b 20 6d 61 79 20 0a 2a 2a 20 72 65 74  Lock may .** ret
46d0: 75 72 6e 20 74 72 75 65 20 62 65 63 61 75 73 65  urn true because
46e0: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 74 73 65   the caller itse
46f0: 6c 66 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e  lf is holding an
4700: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
4710: 28 62 75 74 0a 2a 2a 20 64 6f 65 73 6e 27 74 20  (but.** doesn't 
4720: 6b 6e 6f 77 20 69 74 20 62 65 63 61 75 73 65 20  know it because 
4730: 6f 66 20 61 20 70 72 65 76 69 6f 75 73 20 65 72  of a previous er
4740: 72 6f 72 20 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e  ror in xUnlock).
4750: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
4760: 0a 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  .** a hot-journa
4770: 6c 20 6d 61 79 20 62 65 20 6d 69 73 74 61 6b 65  l may be mistake
4780: 6e 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  n for a journal 
4790: 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 62 79  being created by
47a0: 20 61 6e 20 61 63 74 69 76 65 0a 2a 2a 20 74 72   an active.** tr
47b0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 61 6e 6f  ansaction in ano
47c0: 74 68 65 72 20 70 72 6f 63 65 73 73 2c 20 63 61  ther process, ca
47d0: 75 73 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  using SQLite to 
47e0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
47f0: 74 61 62 61 73 65 0a 2a 2a 20 77 69 74 68 6f 75  tabase.** withou
4800: 74 20 72 6f 6c 6c 69 6e 67 20 69 74 20 62 61 63  t rolling it bac
4810: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b  k..**.** To work
4820: 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66   around this, if
4830: 20 61 20 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f   a call to xUnlo
4840: 63 6b 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20  ck() fails when 
4850: 75 6e 6c 6f 63 6b 69 6e 67 20 74 68 65 0a 2a 2a  unlocking the.**
4860: 20 64 61 74 61 62 61 73 65 20 69 6e 20 74 68 65   database in the
4870: 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20 50 61   ERROR state, Pa
4880: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4890: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
48a0: 2e 20 49 74 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  . It.** is only 
48b0: 63 68 61 6e 67 65 64 20 62 61 63 6b 20 74 6f 20  changed back to 
48c0: 61 20 72 65 61 6c 20 6c 6f 63 6b 69 6e 67 20 73  a real locking s
48d0: 74 61 74 65 20 61 66 74 65 72 20 61 20 73 75 63  tate after a suc
48e0: 63 65 73 73 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20  cessful call.** 
48f0: 74 6f 20 78 4c 6f 63 6b 28 45 58 43 4c 55 53 49  to xLock(EXCLUSI
4900: 56 45 29 2e 20 41 6c 73 6f 2c 20 74 68 65 20 63  VE). Also, the c
4910: 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 4f 50  ode to do the OP
4920: 45 4e 2d 3e 53 48 41 52 45 44 20 73 74 61 74 65  EN->SHARED state
4930: 20 74 72 61 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f   transition.** o
4940: 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 20 66  mits the check f
4950: 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
4960: 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20   if Pager.eLock 
4970: 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57  is set to UNKNOW
4980: 4e 5f 4c 4f 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e  N_LOCK .** lock.
4990: 20 49 6e 73 74 65 61 64 2c 20 69 74 20 61 73 73   Instead, it ass
49a0: 75 6d 65 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  umes a hot-journ
49b0: 61 6c 20 65 78 69 73 74 73 20 61 6e 64 20 6f 62  al exists and ob
49c0: 74 61 69 6e 73 20 61 6e 20 45 58 43 4c 55 53 49  tains an EXCLUSI
49d0: 56 45 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68  VE.** lock on th
49e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
49f0: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
4a00: 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
4a10: 6b 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a  k. See function.
4a20: 2a 2a 20 50 61 67 65 72 53 68 61 72 65 64 4c 6f  ** PagerSharedLo
4a30: 63 6b 28 29 20 66 6f 72 20 6d 6f 72 65 20 64 65  ck() for more de
4a40: 74 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  tail..**.** Page
4a50: 72 2e 65 4c 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79  r.eLock may only
4a60: 20 62 65 20 73 65 74 20 74 6f 20 55 4e 4b 4e 4f   be set to UNKNO
4a70: 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  WN_LOCK when the
4a80: 20 70 61 67 65 72 20 69 73 20 69 6e 20 0a 2a 2a   pager is in .**
4a90: 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
4aa0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  e..*/.#define UN
4ab0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 20 20  KNOWN_LOCK      
4ac0: 20 20 20 20 20 20 20 20 20 20 28 45 58 43 4c 55            (EXCLU
4ad0: 53 49 56 45 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a  SIVE_LOCK+1)../*
4ae0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
4af0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
4b00: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
4b10: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
4b20: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4b30: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
4b40: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a  C1(P,D,N,X,E) \.
4b50: 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64 65      if( P->xCode
4b60: 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28 50  c && P->xCodec(P
4b70: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d  ->pCodec,D,N,X)=
4b80: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65 66  =0 ){ E; }.# def
4b90: 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e  ine CODEC2(P,D,N
4ba0: 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69 66  ,X,E,O) \.    if
4bb0: 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20 29  ( P->xCodec==0 )
4bc0: 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d 65  { O=(char*)D; }e
4bd0: 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28 4f  lse \.    if( (O
4be0: 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  =(char*)(P->xCod
4bf0: 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e  ec(P->pCodec,D,N
4c00: 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20 7d  ,X)))==0 ){ E; }
4c10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4c20: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC1(P,D,N,X,E
4c30: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
4c40: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
4c50: 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28  P,D,N,X,E,O) O=(
4c60: 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a 0a  char*)D.#endif..
4c70: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
4c80: 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f 72  m allowed sector
4c90: 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49 66   size. 64KiB. If
4ca0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
4cb0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
4cc0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
4cd0: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
4ce0: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
4cf0: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
4d00: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
4d10: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
4d20: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
4d30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
4d40: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
4d50: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
4d60: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
4d70: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
4d80: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
4d90: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
4da0: 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 0a 2f 2a  IZE 0x10000.../*
4db0: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
4dc0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
4dd0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
4de0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
4df0: 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70   active.** savep
4e00: 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65  oint and stateme
4e10: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
4e20: 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c  n the system. Al
4e30: 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65  l such structure
4e40: 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
4e50: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
4e60: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c  vepoint[] array,
4e70: 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61   which is alloca
4e80: 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a  ted and.** resiz
4e90: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
4ea0: 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  Realloc()..**.**
4eb0: 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
4ec0: 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68  t is created, th
4ed0: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
4ee0: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
4ef0: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  d is.** set to 0
4f00: 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  . If a journal-h
4f10: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
4f20: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
4f30: 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20  ournal while.** 
4f40: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
4f50: 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48   active, then iH
4f60: 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
4f70: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
4f80: 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  et .** immediate
4f90: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
4fa0: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
4fb0: 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74  cord written int
4fc0: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  o the main.** jo
4fd0: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65  urnal before the
4fe0: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e   journal-header.
4ff0: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
5000: 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69  d during savepoi
5010: 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28  nt.** rollback (
5020: 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63  see pagerPlaybac
5030: 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a  kSavepoint())..*
5040: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
5050: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
5060: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a  PagerSavepoint;.
5070: 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65  struct PagerSave
5080: 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f  point {.  i64 iO
5090: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
50a0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69         /* Starti
50b0: 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69  ng offset in mai
50c0: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
50d0: 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20  64 iHdrOffset;  
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
50f0: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69  ee above */.  Bi
5100: 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69  tvec *pInSavepoi
5110: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  nt;        /* Se
5120: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
5130: 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  is savepoint */.
5140: 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5160: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65  * Original numbe
5170: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69  r of pages in fi
5180: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75  le */.  Pgno iSu
5190: 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  bRec;           
51a0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
51b0: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
51c0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
51d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
51e0: 4d 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 61 57  MIT_WAL.  u32 aW
51f0: 61 6c 44 61 74 61 5b 57 41 4c 5f 53 41 56 45 50  alData[WAL_SAVEP
5200: 4f 49 4e 54 5f 4e 44 41 54 41 5d 3b 20 20 20 20  OINT_NDATA];    
5210: 20 20 20 20 2f 2a 20 57 41 4c 20 73 61 76 65 70      /* WAL savep
5220: 6f 69 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  oint context */.
5230: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
5240: 20 42 69 74 73 20 6f 66 20 74 68 65 20 50 61 67   Bits of the Pag
5250: 65 72 2e 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c  er.doNotSpill fl
5260: 61 67 2e 20 20 53 65 65 20 66 75 72 74 68 65 72  ag.  See further
5270: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 62 65 6c   description bel
5280: 6f 77 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ow..*/.#define S
5290: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 20 20 20  PILLFLAG_OFF    
52a0: 20 20 20 20 20 30 78 30 31 20 2f 2a 20 4e 65 76       0x01 /* Nev
52b0: 65 72 20 73 70 69 6c 6c 20 63 61 63 68 65 2e 20  er spill cache. 
52c0: 20 53 65 74 20 76 69 61 20 70 72 61 67 6d 61 20   Set via pragma 
52d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c  */.#define SPILL
52e0: 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 20 20  FLAG_ROLLBACK   
52f0: 20 30 78 30 32 20 2f 2a 20 43 75 72 72 65 6e 74   0x02 /* Current
5300: 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 2c 20 73   rolling back, s
5310: 6f 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 2a  o do not spill *
5320: 2f 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46  /.#define SPILLF
5330: 4c 41 47 5f 4e 4f 53 59 4e 43 20 20 20 20 20 20  LAG_NOSYNC      
5340: 30 78 30 34 20 2f 2a 20 53 70 69 6c 6c 20 69 73  0x04 /* Spill is
5350: 20 6f 6b 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20   ok, but do not 
5360: 73 79 6e 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  sync */../*.** A
5370: 6e 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68  n open page cach
5380: 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  e is an instance
5390: 20 6f 66 20 73 74 72 75 63 74 20 50 61 67 65 72   of struct Pager
53a0: 2e 20 41 20 64 65 73 63 72 69 70 74 69 6f 6e 20  . A description 
53b0: 6f 66 0a 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68  of.** some of th
53c0: 65 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  e more important
53d0: 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65   member variable
53e0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
53f0: 20 65 53 74 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20   eState.**.**   
5400: 54 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61  The current 'sta
5410: 74 65 27 20 6f 66 20 74 68 65 20 70 61 67 65 72  te' of the pager
5420: 20 6f 62 6a 65 63 74 2e 20 53 65 65 20 74 68 65   object. See the
5430: 20 63 6f 6d 6d 65 6e 74 20 61 6e 64 20 73 74 61   comment and sta
5440: 74 65 0a 2a 2a 20 20 20 64 69 61 67 72 61 6d 20  te.**   diagram 
5450: 61 62 6f 76 65 20 66 6f 72 20 61 20 64 65 73 63  above for a desc
5460: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ription of the p
5470: 61 67 65 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  ager state..**.*
5480: 2a 20 65 4c 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20  * eLock.**.**   
5490: 46 6f 72 20 61 20 72 65 61 6c 20 6f 6e 2d 64 69  For a real on-di
54a0: 73 6b 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  sk database, the
54b0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65   current lock he
54c0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
54d0: 73 65 20 66 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e  se file -.**   N
54e0: 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c  O_LOCK, SHARED_L
54f0: 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
5500: 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  CK or EXCLUSIVE_
5510: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f  LOCK..**.**   Fo
5520: 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  r a temporary or
5530: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
5540: 61 73 65 20 28 6e 65 69 74 68 65 72 20 6f 66 20  ase (neither of 
5550: 77 68 69 63 68 20 72 65 71 75 69 72 65 20 61 6e  which require an
5560: 79 0a 2a 2a 20 20 20 6c 6f 63 6b 73 29 2c 20 74  y.**   locks), t
5570: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
5580: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 45 58  always set to EX
5590: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20 53 69  CLUSIVE_LOCK. Si
55a0: 6e 63 65 20 73 75 63 68 0a 2a 2a 20 20 20 64 61  nce such.**   da
55b0: 74 61 62 61 73 65 73 20 61 6c 77 61 79 73 20 68  tabases always h
55c0: 61 76 65 20 50 61 67 65 72 2e 65 78 63 6c 75 73  ave Pager.exclus
55d0: 69 76 65 4d 6f 64 65 3d 3d 31 2c 20 74 68 69 73  iveMode==1, this
55e0: 20 74 72 69 63 6b 73 20 74 68 65 20 70 61 67 65   tricks the page
55f0: 72 0a 2a 2a 20 20 20 6c 6f 67 69 63 20 69 6e 74  r.**   logic int
5600: 6f 20 74 68 69 6e 6b 69 6e 67 20 74 68 61 74 20  o thinking that 
5610: 69 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  it already has a
5620: 6c 6c 20 74 68 65 20 6c 6f 63 6b 73 20 69 74 20  ll the locks it 
5630: 77 69 6c 6c 20 65 76 65 72 0a 2a 2a 20 20 20 6e  will ever.**   n
5640: 65 65 64 20 28 61 6e 64 20 6e 6f 20 72 65 61 73  eed (and no reas
5650: 6f 6e 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68  on to release th
5660: 65 6d 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20  em)..**.**   In 
5670: 73 6f 6d 65 20 28 6f 62 73 63 75 72 65 29 20 63  some (obscure) c
5680: 69 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 74 68  ircumstances, th
5690: 69 73 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20  is variable may 
56a0: 61 6c 73 6f 20 62 65 20 73 65 74 20 74 6f 0a 2a  also be set to.*
56b0: 2a 20 20 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  *   UNKNOWN_LOCK
56c0: 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e  . See the commen
56d0: 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  t above the #def
56e0: 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c  ine of UNKNOWN_L
56f0: 4f 43 4b 20 66 6f 72 0a 2a 2a 20 20 20 64 65 74  OCK for.**   det
5700: 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e  ails..**.** chan
5710: 67 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a  geCountDone.**.*
5720: 2a 20 20 20 54 68 69 73 20 62 6f 6f 6c 65 61 6e  *   This boolean
5730: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
5740: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
5750: 68 61 74 20 74 68 65 20 63 68 61 6e 67 65 2d 63  hat the change-c
5760: 6f 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28 74 68  ounter .**   (th
5770: 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  e 4-byte header 
5780: 66 69 65 6c 64 20 61 74 20 62 79 74 65 20 6f 66  field at byte of
5790: 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 64  fset 24 of the d
57a0: 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 69 73  atabase file) is
57b0: 20 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64 61 74   .**   not updat
57c0: 65 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20 74 68  ed more often th
57d0: 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20 0a 2a  an necessary. .*
57e0: 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 73 65 74  *.**   It is set
57f0: 20 74 6f 20 74 72 75 65 20 77 68 65 6e 20 74 68   to true when th
5800: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5810: 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
5820: 64 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20 20 63  d, which .**   c
5830: 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
5840: 66 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  f an exclusive l
5850: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
5860: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
5870: 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 63 6c 65  ..**   It is cle
5880: 61 72 65 64 20 28 73 65 74 20 74 6f 20 66 61 6c  ared (set to fal
5890: 73 65 29 20 77 68 65 6e 65 76 65 72 20 61 6e 20  se) whenever an 
58a0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
58b0: 73 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71 75 69  s .**   relinqui
58c0: 73 68 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  shed on the data
58d0: 62 61 73 65 20 66 69 6c 65 2e 20 45 61 63 68 20  base file. Each 
58e0: 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
58f0: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2c  on is committed,
5900: 0a 2a 2a 20 20 20 54 68 65 20 63 68 61 6e 67 65  .**   The change
5910: 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69  CountDone flag i
5920: 73 20 69 6e 73 70 65 63 74 65 64 2e 20 49 66 20  s inspected. If 
5930: 69 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 20  it is true, the 
5940: 77 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75 70 64  work of.**   upd
5950: 61 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  ating the change
5960: 2d 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d 69 74  -counter is omit
5970: 74 65 64 20 66 6f 72 20 74 68 65 20 63 75 72 72  ted for the curr
5980: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
5990: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 6d 65  .**.**   This me
59a0: 63 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20 74 68  chanism means th
59b0: 61 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20  at when running 
59c0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
59d0: 65 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  e, a connection 
59e0: 0a 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c 79 20  .**   need only 
59f0: 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
5a00: 65 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65 2c 20  e-counter once, 
5a10: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 72  for the first tr
5a20: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 63  ansaction.**   c
5a30: 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
5a40: 73 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20  setMaster.**.** 
5a50: 20 20 57 68 65 6e 20 50 61 67 65 72 43 6f 6d 6d    When PagerComm
5a60: 69 74 50 68 61 73 65 4f 6e 65 28 29 20 69 73 20  itPhaseOne() is 
5a70: 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 6d 69 74  called to commit
5a80: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
5a90: 69 74 20 6d 61 79 0a 2a 2a 20 20 20 28 6f 72 20  it may.**   (or 
5aa0: 6d 61 79 20 6e 6f 74 29 20 73 70 65 63 69 66 79  may not) specify
5ab0: 20 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61   a master-journa
5ac0: 6c 20 6e 61 6d 65 20 74 6f 20 62 65 20 77 72 69  l name to be wri
5ad0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a  tten into the .*
5ae0: 2a 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  *   journal file
5af0: 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 73 79   before it is sy
5b00: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
5b10: 0a 2a 2a 20 20 20 57 68 65 74 68 65 72 20 6f 72  .**   Whether or
5b20: 20 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   not a journal f
5b30: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 6d  ile contains a m
5b40: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f  aster-journal po
5b50: 69 6e 74 65 72 20 61 66 66 65 63 74 73 20 0a 2a  inter affects .*
5b60: 2a 20 20 20 74 68 65 20 77 61 79 20 69 6e 20 77  *   the way in w
5b70: 68 69 63 68 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hich the journal
5b80: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5b90: 65 64 20 61 66 74 65 72 20 74 68 65 20 74 72 61  ed after the tra
5ba0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20  nsaction is .** 
5bb0: 20 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72    committed or r
5bc0: 6f 6c 6c 65 64 20 62 61 63 6b 20 77 68 65 6e 20  olled back when 
5bd0: 72 75 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72  running in "jour
5be0: 6e 61 6c 5f 6d 6f 64 65 3d 50 45 52 53 49 53 54  nal_mode=PERSIST
5bf0: 22 20 6d 6f 64 65 2e 0a 2a 2a 20 20 20 49 66 20  " mode..**   If 
5c00: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  a journal file d
5c10: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
5c20: 61 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  a master-journal
5c30: 20 70 6f 69 6e 74 65 72 2c 20 69 74 20 69 73 0a   pointer, it is.
5c40: 2a 2a 20 20 20 66 69 6e 61 6c 69 7a 65 64 20 62  **   finalized b
5c50: 79 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68  y overwriting th
5c60: 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
5c70: 68 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f  header with zero
5c80: 65 73 2e 20 49 66 0a 2a 2a 20 20 20 69 74 20 64  es. If.**   it d
5c90: 6f 65 73 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61  oes contain a ma
5ca0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5cb0: 6e 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  nter the journal
5cc0: 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a   file is finaliz
5cd0: 65 64 20 0a 2a 2a 20 20 20 62 79 20 74 72 75 6e  ed .**   by trun
5ce0: 63 61 74 69 6e 67 20 69 74 20 74 6f 20 7a 65 72  cating it to zer
5cf0: 6f 20 62 79 74 65 73 2c 20 6a 75 73 74 20 61 73  o bytes, just as
5d00: 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   if the connecti
5d10: 6f 6e 20 77 65 72 65 20 0a 2a 2a 20 20 20 72 75  on were .**   ru
5d20: 6e 6e 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61  nning in "journa
5d30: 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63 61 74 65 22  l_mode=truncate"
5d40: 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a   mode..**.**   J
5d50: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 74 68 61  ournal files tha
5d60: 74 20 63 6f 6e 74 61 69 6e 20 6d 61 73 74 65 72  t contain master
5d70: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
5d80: 73 20 63 61 6e 6e 6f 74 20 62 65 20 66 69 6e 61  s cannot be fina
5d90: 6c 69 7a 65 64 0a 2a 2a 20 20 20 73 69 6d 70 6c  lized.**   simpl
5da0: 79 20 62 79 20 6f 76 65 72 77 72 69 74 69 6e 67  y by overwriting
5db0: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
5dc0: 61 6c 2d 68 65 61 64 65 72 20 77 69 74 68 20 7a  al-header with z
5dd0: 65 72 6f 65 73 2c 20 61 73 20 74 68 65 0a 2a 2a  eroes, as the.**
5de0: 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61     master journa
5df0: 6c 20 70 6f 69 6e 74 65 72 20 63 6f 75 6c 64 20  l pointer could 
5e00: 69 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 68  interfere with h
5e10: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
5e20: 61 63 6b 20 6f 66 20 61 6e 79 0a 2a 2a 20 20 20  ack of any.**   
5e30: 73 75 62 73 65 71 75 65 6e 74 6c 79 20 69 6e 74  subsequently int
5e40: 65 72 72 75 70 74 65 64 20 74 72 61 6e 73 61 63  errupted transac
5e50: 74 69 6f 6e 20 74 68 61 74 20 72 65 75 73 65 73  tion that reuses
5e60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5e70: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 66  e..**.**   The f
5e80: 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 20 61  lag is cleared a
5e90: 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 6a 6f  s soon as the jo
5ea0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 69  urnal file is fi
5eb0: 6e 61 6c 69 7a 65 64 20 28 65 69 74 68 65 72 0a  nalized (either.
5ec0: 2a 2a 20 20 20 62 79 20 50 61 67 65 72 43 6f 6d  **   by PagerCom
5ed0: 6d 69 74 50 68 61 73 65 54 77 6f 20 6f 72 20 50  mitPhaseTwo or P
5ee0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 29 2e 20 49  agerRollback). I
5ef0: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 70 72  f an IO error pr
5f00: 65 76 65 6e 74 73 20 74 68 65 0a 2a 2a 20 20 20  events the.**   
5f10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  journal file fro
5f20: 6d 20 62 65 69 6e 67 20 73 75 63 63 65 73 73 66  m being successf
5f30: 75 6c 6c 79 20 66 69 6e 61 6c 69 7a 65 64 2c 20  ully finalized, 
5f40: 74 68 65 20 73 65 74 4d 61 73 74 65 72 20 66 6c  the setMaster fl
5f50: 61 67 0a 2a 2a 20 20 20 69 73 20 63 6c 65 61 72  ag.**   is clear
5f60: 65 64 20 61 6e 79 77 61 79 20 28 61 6e 64 20 74  ed anyway (and t
5f70: 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6d 6f  he pager will mo
5f80: 76 65 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74  ve to ERROR stat
5f90: 65 29 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53  e)..**.** doNotS
5fa0: 70 69 6c 6c 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  pill.**.**   Thi
5fb0: 73 20 76 61 72 69 61 62 6c 65 73 20 63 6f 6e 74  s variables cont
5fc0: 72 6f 6c 20 74 68 65 20 62 65 68 61 76 69 6f 72  rol the behavior
5fd0: 20 6f 66 20 63 61 63 68 65 2d 73 70 69 6c 6c 73   of cache-spills
5fe0: 20 20 28 63 61 6c 6c 73 20 6d 61 64 65 20 62 79    (calls made by
5ff0: 0a 2a 2a 20 20 20 74 68 65 20 70 63 61 63 68 65  .**   the pcache
6000: 20 6d 6f 64 75 6c 65 20 74 6f 20 74 68 65 20 70   module to the p
6010: 61 67 65 72 53 74 72 65 73 73 28 29 20 72 6f 75  agerStress() rou
6020: 74 69 6e 65 20 74 6f 20 77 72 69 74 65 20 63 61  tine to write ca
6030: 63 68 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 74  ched data.**   t
6040: 6f 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  o the file-syste
6050: 6d 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72  m in order to fr
6060: 65 65 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 2a  ee up memory)..*
6070: 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 62 69 74 73  *.**   When bits
6080: 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 6f   SPILLFLAG_OFF o
6090: 72 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c  r SPILLFLAG_ROLL
60a0: 42 41 43 4b 20 6f 66 20 64 6f 4e 6f 74 53 70 69  BACK of doNotSpi
60b0: 6c 6c 20 61 72 65 20 73 65 74 2c 0a 2a 2a 20 20  ll are set,.**  
60c0: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
60d0: 64 61 74 61 62 61 73 65 20 66 72 6f 6d 20 70 61  database from pa
60e0: 67 65 72 53 74 72 65 73 73 28 29 20 69 73 20 64  gerStress() is d
60f0: 69 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68  isabled altogeth
6100: 65 72 2e 0a 2a 2a 20 20 20 54 68 65 20 53 50 49  er..**   The SPI
6110: 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20  LLFLAG_ROLLBACK 
6120: 63 61 73 65 20 69 73 20 64 6f 6e 65 20 69 6e 20  case is done in 
6130: 61 20 76 65 72 79 20 6f 62 73 63 75 72 65 20 63  a very obscure c
6140: 61 73 65 20 74 68 61 74 0a 2a 2a 20 20 20 63 6f  ase that.**   co
6150: 6d 65 73 20 75 70 20 64 75 72 69 6e 67 20 73 61  mes up during sa
6160: 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b  vepoint rollback
6170: 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 74   that requires t
6180: 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65  he pcache module
6190: 0a 2a 2a 20 20 20 74 6f 20 61 6c 6c 6f 63 61 74  .**   to allocat
61a0: 65 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  e a new page to 
61b0: 70 72 65 76 65 6e 74 20 74 68 65 20 6a 6f 75 72  prevent the jour
61c0: 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65  nal file from be
61d0: 69 6e 67 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20  ing written.**  
61e0: 20 77 68 69 6c 65 20 69 74 20 69 73 20 62 65 69   while it is bei
61f0: 6e 67 20 74 72 61 76 65 72 73 65 64 20 62 79 20  ng traversed by 
6200: 63 6f 64 65 20 69 6e 20 70 61 67 65 72 5f 70 6c  code in pager_pl
6210: 61 79 62 61 63 6b 28 29 2e 20 20 54 68 65 20 53  ayback().  The S
6220: 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 0a 2a 2a 20  PILLFLAG_OFF.** 
6230: 20 20 63 61 73 65 20 69 73 20 61 20 75 73 65 72    case is a user
6240: 20 70 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a 20   preference..** 
6250: 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 53 50 49  .**   If the SPI
6260: 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20 62 69  LLFLAG_NOSYNC bi
6270: 74 20 69 73 20 73 65 74 2c 20 77 72 69 74 69 6e  t is set, writin
6280: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
6290: 65 20 66 72 6f 6d 0a 2a 2a 20 20 20 70 61 67 65  e from.**   page
62a0: 72 53 74 72 65 73 73 28 29 20 69 73 20 70 65 72  rStress() is per
62b0: 6d 69 74 74 65 64 2c 20 62 75 74 20 73 79 6e 63  mitted, but sync
62c0: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
62d0: 66 69 6c 65 20 69 73 20 6e 6f 74 2e 0a 2a 2a 20  file is not..** 
62e0: 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73    This flag is s
62f0: 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67  et by sqlite3Pag
6300: 65 72 57 72 69 74 65 28 29 20 77 68 65 6e 20 74  erWrite() when t
6310: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
6320: 65 63 74 6f 72 2d 73 69 7a 65 0a 2a 2a 20 20 20  ector-size.**   
6330: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
6340: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
6350: 2d 73 69 7a 65 20 69 6e 20 6f 72 64 65 72 20 74  -size in order t
6360: 6f 20 70 72 65 76 65 6e 74 20 61 20 6a 6f 75 72  o prevent a jour
6370: 6e 61 6c 20 73 79 6e 63 0a 2a 2a 20 20 20 66 72  nal sync.**   fr
6380: 6f 6d 20 68 61 70 70 65 6e 69 6e 67 20 69 6e 20  om happening in 
6390: 62 65 74 77 65 65 6e 20 74 68 65 20 6a 6f 75 72  between the jour
63a0: 6e 61 6c 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70  nalling of two p
63b0: 61 67 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ages on the same
63c0: 20 73 65 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20   sector. .**.** 
63d0: 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a  subjInMemory.**.
63e0: 2a 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62  **   This is a b
63f0: 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e  oolean variable.
6400: 20 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61   If true, then a
6410: 6e 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d  ny required sub-
6420: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20  journal.**   is 
6430: 6f 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d  opened as an in-
6440: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
6450: 69 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74  ile. If false, t
6460: 68 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a  hen in-memory.**
6470: 20 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20     sub-journals 
6480: 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f  are only used fo
6490: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  r in-memory page
64a0: 72 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  r files..**.**  
64b0: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   This variable i
64c0: 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68 65  s updated by the
64d0: 20 75 70 70 65 72 20 6c 61 79 65 72 20 65 61 63   upper layer eac
64e0: 68 20 74 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a  h time a new .**
64f0: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
6500: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a  tion is opened..
6510: 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62  **.** dbSize, db
6520: 4f 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65  OrigSize, dbFile
6530: 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72  Size.**.**   Var
6540: 69 61 62 6c 65 20 64 62 53 69 7a 65 20 69 73 20  iable dbSize is 
6550: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
6560: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
6570: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
6580: 0a 2a 2a 20 20 20 49 74 20 69 73 20 76 61 6c 69  .**   It is vali
6590: 64 20 69 6e 20 50 41 47 45 52 5f 52 45 41 44 45  d in PAGER_READE
65a0: 52 20 61 6e 64 20 68 69 67 68 65 72 20 73 74 61  R and higher sta
65b0: 74 65 73 20 28 61 6c 6c 20 73 74 61 74 65 73 20  tes (all states 
65c0: 65 78 63 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20  except for.**   
65d0: 4f 50 45 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e  OPEN and ERROR).
65e0: 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65   .**.**   dbSize
65f0: 20 69 73 20 73 65 74 20 62 61 73 65 64 20 6f 6e   is set based on
6600: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
6610: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
6620: 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a  which may be .**
6630: 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74     larger than t
6640: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
6650: 61 74 61 62 61 73 65 20 28 74 68 65 20 76 61 6c  atabase (the val
6660: 75 65 20 73 74 6f 72 65 64 20 61 74 20 6f 66 66  ue stored at off
6670: 73 65 74 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74  set.**   28 of t
6680: 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64  he database head
6690: 65 72 20 62 79 20 74 68 65 20 62 74 72 65 65 29  er by the btree)
66a0: 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66  . If the size of
66b0: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69   the file.**   i
66c0: 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72  s not an integer
66d0: 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65   multiple of the
66e0: 20 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20   page-size, the 
66f0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
6700: 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 72  **   dbSize is r
6710: 6f 75 6e 64 65 64 20 64 6f 77 6e 20 28 69 2e 65  ounded down (i.e
6720: 2e 20 61 20 35 4b 42 20 66 69 6c 65 20 77 69 74  . a 5KB file wit
6730: 68 20 32 4b 20 70 61 67 65 2d 73 69 7a 65 20 68  h 2K page-size h
6740: 61 73 20 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a  as dbSize==2)..*
6750: 2a 20 20 20 45 78 63 65 70 74 2c 20 61 6e 79 20  *   Except, any 
6760: 66 69 6c 65 20 74 68 61 74 20 69 73 20 67 72 65  file that is gre
6770: 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65  ater than 0 byte
6780: 73 20 69 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e  s in size is con
6790: 73 69 64 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20  sidered.**   to 
67a0: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  have at least on
67b0: 65 20 70 61 67 65 2e 20 28 69 2e 65 2e 20 61 20  e page. (i.e. a 
67c0: 31 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b  1KB file with 2K
67d0: 20 70 61 67 65 2d 73 69 7a 65 20 6c 65 61 64 73   page-size leads
67e0: 0a 2a 2a 20 20 20 74 6f 20 64 62 53 69 7a 65 3d  .**   to dbSize=
67f0: 3d 31 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72  =1)..**.**   Dur
6800: 69 6e 67 20 61 20 77 72 69 74 65 2d 74 72 61 6e  ing a write-tran
6810: 73 61 63 74 69 6f 6e 2c 20 69 66 20 70 61 67 65  saction, if page
6820: 73 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62  s with page-numb
6830: 65 72 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ers greater than
6840: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 61 72 65  .**   dbSize are
6850: 20 6d 6f 64 69 66 69 65 64 20 69 6e 20 74 68 65   modified in the
6860: 20 63 61 63 68 65 2c 20 64 62 53 69 7a 65 20 69   cache, dbSize i
6870: 73 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64  s updated accord
6880: 69 6e 67 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69  ingly..**   Simi
6890: 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 64 61  larly, if the da
68a0: 74 61 62 61 73 65 20 69 73 20 74 72 75 6e 63 61  tabase is trunca
68b0: 74 65 64 20 75 73 69 6e 67 20 50 61 67 65 72 54  ted using PagerT
68c0: 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 2c 20  runcateImage(), 
68d0: 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20  .**   dbSize is 
68e0: 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  updated..**.**  
68f0: 20 56 61 72 69 61 62 6c 65 73 20 64 62 4f 72 69   Variables dbOri
6900: 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65  gSize and dbFile
6910: 53 69 7a 65 20 61 72 65 20 76 61 6c 69 64 20 69  Size are valid i
6920: 6e 20 73 74 61 74 65 73 20 0a 2a 2a 20 20 20 50  n states .**   P
6930: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
6940: 45 44 20 61 6e 64 20 68 69 67 68 65 72 2e 20 64  ED and higher. d
6950: 62 4f 72 69 67 53 69 7a 65 20 69 73 20 61 20 63  bOrigSize is a c
6960: 6f 70 79 20 6f 66 20 74 68 65 20 64 62 53 69 7a  opy of the dbSiz
6970: 65 0a 2a 2a 20 20 20 76 61 72 69 61 62 6c 65 20  e.**   variable 
6980: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
6990: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
69a0: 20 49 74 20 69 73 20 75 73 65 64 20 64 75 72 69   It is used duri
69b0: 6e 67 20 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20  ng rollback,.** 
69c0: 20 20 61 6e 64 20 74 6f 20 64 65 74 65 72 6d 69    and to determi
69d0: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
69e0: 74 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  t pages need to 
69f0: 62 65 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65  be journalled be
6a00: 66 6f 72 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20  fore.**   being 
6a10: 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  modified..**.** 
6a20: 20 20 54 68 72 6f 75 67 68 6f 75 74 20 61 20 77    Throughout a w
6a30: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6a40: 2c 20 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e  , dbFileSize con
6a50: 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 6f  tains the size o
6a60: 66 0a 2a 2a 20 20 20 74 68 65 20 66 69 6c 65 20  f.**   the file 
6a70: 6f 6e 20 64 69 73 6b 20 69 6e 20 70 61 67 65 73  on disk in pages
6a80: 2e 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 61  . It is set to a
6a90: 20 63 6f 70 79 20 6f 66 20 64 62 53 69 7a 65 20   copy of dbSize 
6aa0: 77 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72  when the.**   wr
6ab0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
6ac0: 69 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2c  is first opened,
6ad0: 20 61 6e 64 20 75 70 64 61 74 65 64 20 77 68 65   and updated whe
6ae0: 6e 20 56 46 53 20 63 61 6c 6c 73 20 61 72 65 20  n VFS calls are 
6af0: 6d 61 64 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69  made.**   to wri
6b00: 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 74  te or truncate t
6b10: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6b20: 20 6f 6e 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a   on disk. .**.**
6b30: 20 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73     The only reas
6b40: 6f 6e 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a  on the dbFileSiz
6b50: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 72 65  e variable is re
6b60: 71 75 69 72 65 64 20 69 73 20 74 6f 20 73 75 70  quired is to sup
6b70: 70 72 65 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65  press .**   unne
6b80: 63 65 73 73 61 72 79 20 63 61 6c 6c 73 20 74 6f  cessary calls to
6b90: 20 78 54 72 75 6e 63 61 74 65 28 29 20 61 66 74   xTruncate() aft
6ba0: 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  er committing a 
6bb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c  transaction. If,
6bc0: 20 0a 2a 2a 20 20 20 77 68 65 6e 20 61 20 74 72   .**   when a tr
6bd0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
6be0: 6d 69 74 74 65 64 2c 20 74 68 65 20 64 62 46 69  mitted, the dbFi
6bf0: 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  leSize variable 
6c00: 69 6e 64 69 63 61 74 65 73 20 0a 2a 2a 20 20 20  indicates .**   
6c10: 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
6c20: 65 20 66 69 6c 65 20 69 73 20 6c 61 72 67 65 72  e file is larger
6c30: 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61   than the databa
6c40: 73 65 20 69 6d 61 67 65 20 28 50 61 67 65 72 2e  se image (Pager.
6c50: 64 62 53 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70  dbSize), .**   p
6c60: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20  ager_truncate() 
6c70: 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 20 70  is called. The p
6c80: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20  ager_truncate() 
6c90: 63 61 6c 6c 20 75 73 65 73 20 78 46 69 6c 65 73  call uses xFiles
6ca0: 69 7a 65 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65  ize().**   to me
6cb0: 61 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61  asure the databa
6cc0: 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c  se file on disk,
6cd0: 20 61 6e 64 20 74 68 65 6e 20 74 72 75 6e 63 61   and then trunca
6ce0: 74 65 73 20 69 74 20 69 66 20 72 65 71 75 69 72  tes it if requir
6cf0: 65 64 2e 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53  ed..**   dbFileS
6d00: 69 7a 65 20 69 73 20 6e 6f 74 20 75 73 65 64 20  ize is not used 
6d10: 77 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  when rolling bac
6d20: 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  k a transaction.
6d30: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a   In this case.**
6d40: 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
6d50: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 75 6e  e() is called un
6d60: 63 6f 6e 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77  conditionally (w
6d70: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 65 72 65  hich means there
6d80: 20 6d 61 79 20 62 65 0a 2a 2a 20 20 20 61 20 63   may be.**   a c
6d90: 61 6c 6c 20 74 6f 20 78 46 69 6c 65 73 69 7a 65  all to xFilesize
6da0: 28 29 20 74 68 61 74 20 69 73 20 6e 6f 74 20 73  () that is not s
6db0: 74 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64  trictly required
6dc0: 29 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61 73  ). In either cas
6dd0: 65 2c 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74 72  e,.**   pager_tr
6de0: 75 6e 63 61 74 65 28 29 20 6d 61 79 20 63 61 75  uncate() may cau
6df0: 73 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  se the file to b
6e00: 65 63 6f 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72  ecome smaller or
6e10: 20 6c 61 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64   larger..**.** d
6e20: 62 48 69 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20  bHintSize.**.** 
6e30: 20 20 54 68 65 20 64 62 48 69 6e 74 53 69 7a 65    The dbHintSize
6e40: 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
6e50: 64 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e  d to limit the n
6e60: 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d  umber of calls m
6e70: 61 64 65 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20  ade to.**   the 
6e80: 56 46 53 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c  VFS xFileControl
6e90: 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  (FCNTL_SIZE_HINT
6ea0: 29 20 6d 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a  ) method. .**.**
6eb0: 20 20 20 64 62 48 69 6e 74 53 69 7a 65 20 69 73     dbHintSize is
6ec0: 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20 6f   set to a copy o
6ed0: 66 20 74 68 65 20 64 62 53 69 7a 65 20 76 61 72  f the dbSize var
6ee0: 69 61 62 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20  iable when a.** 
6ef0: 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74    write-transact
6f00: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 28 61  ion is opened (a
6f10: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20  t the same time 
6f20: 61 73 20 64 62 46 69 6c 65 53 69 7a 65 20 61 6e  as dbFileSize an
6f30: 64 0a 2a 2a 20 20 20 64 62 4f 72 69 67 53 69 7a  d.**   dbOrigSiz
6f40: 65 29 2e 20 49 66 20 74 68 65 20 78 46 69 6c 65  e). If the xFile
6f50: 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49  Control(FCNTL_SI
6f60: 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68 6f 64 20  ZE_HINT) method 
6f70: 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20  is called,.**   
6f80: 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 69 6e  dbHintSize is in
6f90: 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 6e  creased to the n
6fa0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
6fb0: 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  hat correspond t
6fc0: 6f 20 74 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d  o the.**   size-
6fd0: 68 69 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  hint passed to t
6fe0: 68 65 20 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20  he method call. 
6ff0: 53 65 65 20 70 61 67 65 72 5f 77 72 69 74 65 5f  See pager_write_
7000: 70 61 67 65 6c 69 73 74 28 29 20 66 6f 72 20 0a  pagelist() for .
7010: 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a  **   details..**
7020: 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a  .** errCode.**.*
7030: 2a 20 20 20 54 68 65 20 50 61 67 65 72 2e 65 72  *   The Pager.er
7040: 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 20 69  rCode variable i
7050: 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64  s only ever used
7060: 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20   in PAGER_ERROR 
7070: 73 74 61 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69  state. It.**   i
7080: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e  s set to zero in
7090: 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65   all other state
70a0: 73 2e 20 49 6e 20 50 41 47 45 52 5f 45 52 52 4f  s. In PAGER_ERRO
70b0: 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65  R state, Pager.e
70c0: 72 72 43 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20  rrCode .**   is 
70d0: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 53 51  always set to SQ
70e0: 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54  LITE_FULL, SQLIT
70f0: 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f  E_IOERR or one o
7100: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45  f the SQLITE_IOE
7110: 52 52 5f 58 58 58 20 0a 2a 2a 20 20 20 73 75 62  RR_XXX .**   sub
7120: 2d 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63  -codes..*/.struc
7130: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
7140: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
7150: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
7160: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
7170: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
7180: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
7190: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
71a0: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
71b0: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
71c0: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
71d0: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
71e0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
71f0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
7200: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
7210: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7230: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
7240: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
7250: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53  file */.  u8 noS
7260: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
7270: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7280: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
7290: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
72a0: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
72b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
72c0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
72d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
72e0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
72f0: 38 20 65 78 74 72 61 53 79 6e 63 3b 20 20 20 20  8 extraSync;    
7300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 79             /* sy
7310: 6e 63 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  nc directory aft
7320: 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 6c 65 74  er journal delet
7330: 65 20 2a 2f 0a 20 20 75 38 20 63 6b 70 74 53 79  e */.  u8 ckptSy
7340: 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  ncFlags;        
7350: 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41     /* SYNC_NORMA
7360: 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 66  L or SYNC_FULL f
7370: 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f  or checkpoint */
7380: 0a 20 20 75 38 20 77 61 6c 53 79 6e 63 46 6c 61  .  u8 walSyncFla
7390: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs;            /
73a0: 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  * SYNC_NORMAL or
73b0: 20 53 59 4e 43 5f 46 55 4c 4c 20 66 6f 72 20 77   SYNC_FULL for w
73c0: 61 6c 20 77 72 69 74 65 73 20 2a 2f 0a 20 20 75  al writes */.  u
73d0: 38 20 73 79 6e 63 46 6c 61 67 73 3b 20 20 20 20  8 syncFlags;    
73e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 59             /* SY
73f0: 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e  NC_NORMAL or SYN
7400: 43 5f 46 55 4c 4c 20 6f 74 68 65 72 77 69 73 65  C_FULL otherwise
7410: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
7420: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
7430: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
7440: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72  s a temporary or
7450: 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c 65 20   immutable file 
7460: 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b 3b 20  */.  u8 noLock; 
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7480: 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63 6b 20   /* Do not lock 
7490: 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c 20 6d  (except in WAL m
74a0: 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72 65 61  ode) */.  u8 rea
74b0: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
74c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
74d0: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
74e0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
74f0: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
7500: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7510: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
7520: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a  ile I/O */..  /*
7530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7540: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7560: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a 20 54  *********.  ** T
7580: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
7590: 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68 6f 73  ck contains thos
75a0: 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72 73 20  e class members 
75b0: 74 68 61 74 20 63 68 61 6e 67 65 20 64 75 72 69  that change duri
75c0: 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  ng.  ** routine 
75d0: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 43 6c 61 73  operation.  Clas
75e0: 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20 69 6e  s members not in
75f0: 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72 65 20   this block are 
7600: 65 69 74 68 65 72 20 66 69 78 65 64 0a 20 20 2a  either fixed.  *
7610: 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  * when the pager
7620: 20 69 73 20 66 69 72 73 74 20 63 72 65 61 74 65   is first create
7630: 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79 20 63  d or else only c
7640: 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65 72 65  hange when there
7650: 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67 6e 69   is a.  ** signi
7660: 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68 61 6e  ficant mode chan
7670: 67 65 20 28 73 75 63 68 20 61 73 20 63 68 61 6e  ge (such as chan
7680: 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f 73 69  ging the page_si
7690: 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65  ze, locking_mode
76a0: 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20 6a 6f  ,.  ** or the jo
76b0: 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20 46 72  urnal_mode).  Fr
76c0: 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65 77 2c  om another view,
76d0: 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d 65 6d   these class mem
76e0: 62 65 72 73 20 64 65 73 63 72 69 62 65 0a 20 20  bers describe.  
76f0: 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22 20 6f  ** the "state" o
7700: 66 20 74 68 65 20 70 61 67 65 72 2c 20 77 68 69  f the pager, whi
7710: 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73 20 6d  le other class m
7720: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 20  embers describe 
7730: 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66 69 67  the.  ** "config
7740: 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68 65 20  uration" of the 
7750: 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 75 38  pager..  */.  u8
7760: 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20   eState;        
7770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7780: 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e 2c 20  er state (OPEN, 
7790: 52 45 41 44 45 52 2c 20 57 52 49 54 45 52 5f 4c  READER, WRITER_L
77a0: 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20 75 38  OCKED..) */.  u8
77b0: 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   eLock;         
77c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
77d0: 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  rent lock held o
77e0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
77f0: 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f  */.  u8 changeCo
7800: 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  untDone;        
7810: 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e   /* Set after in
7820: 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
7830: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f  hange-counter */
7840: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7860: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
7870: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
7880: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
7890: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69 6c 6c  .  u8 doNotSpill
78a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
78b0: 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74  * Do not spill t
78c0: 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 6e 6f  he cache when no
78d0: 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38 20 73  n-zero */.  u8 s
78e0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20  ubjInMemory;    
78f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7900: 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79  to use in-memory
7910: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
7920: 0a 20 20 75 38 20 62 55 73 65 46 65 74 63 68 3b  .  u8 bUseFetch;
7930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7940: 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 78 46  * True to use xF
7950: 65 74 63 68 28 29 20 2a 2f 0a 20 20 75 38 20 68  etch() */.  u8 h
7960: 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b  asHeldSharedLock
7970: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
7980: 69 66 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  if a shared lock
7990: 20 68 61 73 20 65 76 65 72 20 62 65 65 6e 20 68   has ever been h
79a0: 65 6c 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  eld */.  Pgno db
79b0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
79c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
79d0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
79e0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e  atabase */.  Pgn
79f0: 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20  o dbOrigSize;   
7a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
7a10: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
7a20: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
7a30: 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69  n */.  Pgno dbFi
7a40: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  leSize;         
7a50: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7a60: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
7a70: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
7a80: 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a 65 3b  Pgno dbHintSize;
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
7aa0: 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f 20 46  alue passed to F
7ab0: 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 63  CNTL_SIZE_HINT c
7ac0: 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  all */.  int err
7ad0: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
7ae0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
7af0: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
7b00: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
7b10: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
7b20: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73          /* Pages
7b30: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63   journalled sinc
7b40: 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20  e last j-header 
7b50: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32  written */.  u32
7b60: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
7b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
7b80: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
7b90: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
7ba0: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20  ecksum */.  u32 
7bb0: 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20  nSubRec;        
7bc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7bd0: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69  r of records wri
7be0: 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72  tten to sub-jour
7bf0: 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  nal */.  Bitvec 
7c00: 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *pInJournal;    
7c10: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
7c20: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
7c30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
7c40: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
7c50: 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20  file *fd;       
7c60: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7c70: 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62  riptor for datab
7c80: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
7c90: 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
7ca0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
7cb0: 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e  criptor for main
7cc0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71   journal */.  sq
7cd0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64  lite3_file *sjfd
7ce0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  ;         /* Fil
7cf0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
7d00: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
7d10: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
7d20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7d30: 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f   Current write o
7d40: 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75  ffset in the jou
7d50: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
7d60: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20  64 journalHdr;  
7d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
7d80: 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65  te offset to pre
7d90: 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65  vious journal he
7da0: 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ader */.  sqlite
7db0: 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
7dc0: 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  p;    /* Pointer
7dd0: 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67 6f   to list of ongo
7de0: 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63 65  ing backup proce
7df0: 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65 72 53  sses */.  PagerS
7e00: 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70  avepoint *aSavep
7e10: 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f  oint; /* Array o
7e20: 66 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  f active savepoi
7e30: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61  nts */.  int nSa
7e40: 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20  vepoint;        
7e50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7e60: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53  f elements in aS
7e70: 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20  avepoint[] */.  
7e80: 75 33 32 20 69 44 61 74 61 56 65 72 73 69 6f 6e  u32 iDataVersion
7e90: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
7ea0: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
7eb0: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74  database content
7ec0: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 63 68   changes */.  ch
7ed0: 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36  ar dbFileVers[16
7ee0: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ];        /* Cha
7ef0: 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61  nges whenever da
7f00: 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
7f10: 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 4d  ges */..  int nM
7f20: 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20 20 20  mapOut;         
7f30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7f40: 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20 63 75  of mmap pages cu
7f50: 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61 6e 64  rrently outstand
7f60: 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ing */.  sqlite3
7f70: 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b 20 20  _int64 szMmap;  
7f80: 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64 20       /* Desired 
7f90: 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73 69 7a  maximum mmap siz
7fa0: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4d  e */.  PgHdr *pM
7fb0: 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20 20 20  mapFreelist;    
7fc0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
7fd0: 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68 65 61  ee mmap page hea
7fe0: 64 65 72 73 20 28 70 44 69 72 74 79 29 20 2a 2f  ders (pDirty) */
7ff0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64 20 6f  .  /*.  ** End o
8000: 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c 79 2d  f the routinely-
8010: 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73 20 6d  changing class m
8020: 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a 2a 2a  embers.  *******
8030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8070: 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e 45 78  ****/..  u16 nEx
8080: 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
8090: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73       /* Add this
80a0: 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65   many bytes to e
80b0: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
80c0: 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52 65 73  ge */.  i16 nRes
80d0: 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
80e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
80f0: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 74   unused bytes at
8100: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
8110: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
8120: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
8130: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
8140: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
8150: 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73 65 63  n() */.  u32 sec
8160: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
8170: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
8180: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
8190: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ng rollback */. 
81a0: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
81c0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
81d0: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50  in a page */.  P
81e0: 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20  gno mxPgno;     
81f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
8200: 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69  ximum allowed si
8210: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
8220: 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  se */.  i64 jour
8230: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
8240: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69      /* Size limi
8250: 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  t for persistent
8260: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
8270: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
8280: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
8290: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
82a0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
82b0: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
82c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
82d0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
82e0: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
82f0: 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
8300: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75  r)(void*); /* Fu
8310: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77  nction to call w
8320: 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f  hen busy */.  vo
8330: 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
8340: 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  Arg;      /* Con
8350: 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f  text argument fo
8360: 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r xBusyHandler *
8370: 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b 33 5d  /.  int aStat[3]
8380: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8390: 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65 20 68  /* Total cache h
83a0: 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e 64 20  its, misses and 
83b0: 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64 65 66  writes */.#ifdef
83c0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
83d0: 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  nt nRead;       
83e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
83f0: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
8400: 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f  d */.#endif.  vo
8410: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
8420: 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c  DbPage*); /* Cal
8430: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
8440: 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61  hen reloading pa
8450: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ges */.  int (*x
8460: 47 65 74 29 28 50 61 67 65 72 2a 2c 50 67 6e 6f  Get)(Pager*,Pgno
8470: 2c 44 62 50 61 67 65 2a 2a 2c 69 6e 74 29 3b 20  ,DbPage**,int); 
8480: 2f 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 66 65  /* Routine to fe
8490: 74 63 68 20 61 20 70 61 74 63 68 20 2a 2f 0a 23  tch a patch */.#
84a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
84b0: 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28  _CODEC.  void *(
84c0: 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
84d0: 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20  oid*,Pgno,int); 
84e0: 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65  /* Routine for e
84f0: 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20  n/decoding data 
8500: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  */.  void (*xCod
8510: 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64  ecSizeChng)(void
8520: 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e  *,int,int); /* N
8530: 6f 74 69 66 79 20 6f 66 20 70 61 67 65 20 73 69  otify of page si
8540: 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  ze changes */.  
8550: 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65  void (*xCodecFre
8560: 65 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20 20  e)(void*);      
8570: 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75         /* Destru
8580: 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f 64  ctor for the cod
8590: 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  ec */.  void *pC
85a0: 6f 64 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  odec;           
85b0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
85c0: 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e  ument to xCodec.
85d0: 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65  .. methods */.#e
85e0: 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d  ndif.  char *pTm
85f0: 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  pSpace;         
8600: 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65     /* Pager.page
8610: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70  Size bytes of sp
8620: 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20  ace for tmp use 
8630: 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43  */.  PCache *pPC
8640: 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20  ache;           
8650: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
8660: 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74  age cache object
8670: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
8680: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61  TE_OMIT_WAL.  Wa
8690: 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20 20 20 20  l *pWal;        
86a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
86b0: 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 75 73 65  te-ahead log use
86c0: 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  d by "journal_mo
86d0: 64 65 3d 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61  de=wal" */.  cha
86e0: 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20 20 20  r *zWal;        
86f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
8700: 20 6e 61 6d 65 20 66 6f 72 20 77 72 69 74 65 2d   name for write-
8710: 61 68 65 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e  ahead log */.#en
8720: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e  dif.};../*.** In
8730: 64 65 78 65 73 20 66 6f 72 20 75 73 65 20 77 69  dexes for use wi
8740: 74 68 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d  th Pager.aStat[]
8750: 2e 20 54 68 65 20 50 61 67 65 72 2e 61 53 74 61  . The Pager.aSta
8760: 74 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61 69  t[] array contai
8770: 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 73  ns.** the values
8780: 20 61 63 63 65 73 73 65 64 20 62 79 20 70 61 73   accessed by pas
8790: 73 69 6e 67 20 53 51 4c 49 54 45 5f 44 42 53 54  sing SQLITE_DBST
87a0: 41 54 55 53 5f 43 41 43 48 45 5f 48 49 54 2c 20  ATUS_CACHE_HIT, 
87b0: 43 41 43 48 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f  CACHE_MISS .** o
87c0: 72 20 43 41 43 48 45 5f 57 52 49 54 45 20 74 6f  r CACHE_WRITE to
87d0: 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74   sqlite3_db_stat
87e0: 75 73 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  us()..*/.#define
87f0: 20 50 41 47 45 52 5f 53 54 41 54 5f 48 49 54 20   PAGER_STAT_HIT 
8800: 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45    0.#define PAGE
8810: 52 5f 53 54 41 54 5f 4d 49 53 53 20 20 31 0a 23  R_STAT_MISS  1.#
8820: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54 41  define PAGER_STA
8830: 54 5f 57 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a  T_WRITE 2../*.**
8840: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
8850: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20  lobal variables 
8860: 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73  hold counters us
8870: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
8880: 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e  g purposes only.
8890: 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65    These variable
88a0: 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69  s do not exist i
88b0: 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69  n.** a non-testi
88c0: 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65  ng build.  These
88d0: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e   variables are n
88e0: 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a  ot thread-safe..
88f0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
8900: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
8910: 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
8920: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
8930: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
8940: 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44  ages read from D
8950: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
8960: 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
8970: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  ount = 0;   /* N
8980: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61  umber of full pa
8990: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44  ges written to D
89a0: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
89b0: 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
89c0: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
89d0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
89e0: 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61  ritten to journa
89f0: 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41  l */.# define PA
8a00: 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b  GER_INCR(v)  v++
8a10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
8a20: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65  PAGER_INCR(v).#e
8a30: 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  ndif..../*.** Jo
8a40: 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69  urnal files begi
8a50: 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  n with the follo
8a60: 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e  wing magic strin
8a70: 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20  g.  The data.** 
8a80: 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  was obtained fro
8a90: 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20  m /dev/random.  
8aa0: 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  It is used only 
8ab0: 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  as a sanity chec
8ac0: 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76  k..**.** Since v
8ad0: 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68  ersion 2.8.0, th
8ae0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  e journal format
8af0: 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69   contains additi
8b00: 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63  onal sanity.** c
8b10: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
8b20: 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77  ion.  If the pow
8b30: 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74  er fails while t
8b40: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
8b50: 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20  ing.** written, 
8b60: 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62  semi-random garb
8b70: 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61  age data might a
8b80: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75  ppear in the jou
8b90: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74  rnal.** file aft
8ba0: 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  er power is rest
8bb0: 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74  ored.  If an att
8bc0: 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64  empt is then mad
8bd0: 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65  e.** to roll the
8be0: 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74   journal back, t
8bf0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c  he database coul
8c00: 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  d be corrupted. 
8c10: 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a   The additional.
8c20: 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  ** sanity checki
8c30: 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74  ng data is an at
8c40: 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65  tempt to discove
8c50: 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e  r the garbage in
8c60: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
8c70: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a  and ignore it..*
8c80: 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20  *.** The sanity 
8c90: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
8ca0: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77  tion for the new
8cb0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
8cc0: 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61  consists.** of a
8cd0: 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d   32-bit checksum
8ce0: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66   on each page of
8cf0: 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63   data.  The chec
8d00: 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68  ksum covers both
8d10: 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d  .** the page num
8d20: 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67  ber and the pPag
8d30: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
8d40: 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74  es of data for t
8d50: 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73  he page..** This
8d60: 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61   cksum is initia
8d70: 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69  lized to a 32-bi
8d80: 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74  t random value t
8d90: 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74  hat appears in t
8da0: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
8db0: 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74  le right after t
8dc0: 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20  he header.  The 
8dd0: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a  random initializ
8de0: 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c  er is important,
8df0: 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62  .** because garb
8e00: 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70  age data that ap
8e10: 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64  pears at the end
8e20: 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73   of a journal is
8e30: 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20   likely.** data 
8e40: 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e  that was once in
8e50: 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61   other files tha
8e60: 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  t have now been 
8e70: 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65  deleted.  If the
8e80: 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61  .** garbage data
8e90: 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62   came from an ob
8ea0: 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66  solete journal f
8eb0: 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75  ile, the checksu
8ec0: 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63  ms might.** be c
8ed0: 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20  orrect.  But by 
8ee0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
8ef0: 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e   checksum to ran
8f00: 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a  dom value which.
8f10: 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  ** is different 
8f20: 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61  for every journa
8f30: 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74  l, we minimize t
8f40: 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61  hat risk..*/.sta
8f50: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
8f60: 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c  ed char aJournal
8f70: 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78  Magic[] = {.  0x
8f80: 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20  d9, 0xd5, 0x05, 
8f90: 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31  0xf9, 0x20, 0xa1
8fa0: 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b  , 0x63, 0xd7,.};
8fb0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ../*.** The size
8fc0: 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68 20   of the of each 
8fd0: 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20 74  page record in t
8fe0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69  he journal is gi
8ff0: 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f  ven by.** the fo
9000: 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a  llowing macro..*
9010: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
9020: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20  L_PG_SZ(pPager) 
9030: 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53   ((pPager->pageS
9040: 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a  ize) + 8)../*.**
9050: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
9060: 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  der size for thi
9070: 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69 73  s pager. This is
9080: 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61 6d   usually the sam
9090: 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61 20  e .** size as a 
90a0: 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
90b0: 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65 74  or. See also set
90c0: 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f  SectorSize()..*/
90d0: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
90e0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
90f0: 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
9100: 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ize)../*.** The 
9110: 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74  macro MEMDB is t
9120: 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64 65  rue if we are de
9130: 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e  aling with an in
9140: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
9150: 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20  ..** We do this 
9160: 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68  as a macro so th
9170: 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54 45  at if the SQLITE
9180: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d  _OMIT_MEMORYDB m
9190: 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20  acro is set,.** 
91a0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d  the value of MEM
91b0: 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e  DB will be a con
91c0: 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f  stant and the co
91d0: 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69  mpiler will opti
91e0: 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65  mize.** out code
91f0: 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65   that would neve
9200: 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69  r execute..*/.#i
9210: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
9220: 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69  _MEMORYDB.# defi
9230: 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65  ne MEMDB 0.#else
9240: 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20  .# define MEMDB 
9250: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65  pPager->memDb.#e
9260: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
9270: 6d 61 63 72 6f 20 55 53 45 46 45 54 43 48 20 69  macro USEFETCH i
9280: 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65  s true if we are
9290: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73 65 20   allowed to use 
92a0: 74 68 65 20 78 46 65 74 63 68 20 61 6e 64 20 78  the xFetch and x
92b0: 55 6e 66 65 74 63 68 0a 2a 2a 20 69 6e 74 65 72  Unfetch.** inter
92c0: 66 61 63 65 73 20 74 6f 20 61 63 63 65 73 73 20  faces to access 
92d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73 69  the database usi
92e0: 6e 67 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64  ng memory-mapped
92f0: 20 49 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c   I/O..*/.#if SQL
9300: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
9310: 45 3e 30 0a 23 20 64 65 66 69 6e 65 20 55 53 45  E>0.# define USE
9320: 46 45 54 43 48 28 78 29 20 28 28 78 29 2d 3e 62  FETCH(x) ((x)->b
9330: 55 73 65 46 65 74 63 68 29 0a 23 65 6c 73 65 0a  UseFetch).#else.
9340: 23 20 64 65 66 69 6e 65 20 55 53 45 46 45 54 43  # define USEFETC
9350: 48 28 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  H(x) 0.#endif../
9360: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
9370: 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62   legal page numb
9380: 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29  er is (2^31 - 1)
9390: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
93a0: 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37  ER_MAX_PGNO 2147
93b0: 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54 68  483647../*.** Th
93c0: 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  e argument to th
93d0: 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66 69  is macro is a fi
93e0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 74  le descriptor (t
93f0: 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ype sqlite3_file
9400: 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  *)..** Return 0 
9410: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65  if it is not ope
9420: 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28  n, or non-zero (
9430: 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69 74  but not 1) if it
9440: 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   is..**.** This 
9450: 69 73 20 73 6f 20 74 68 61 74 20 65 78 70 72 65  is so that expre
9460: 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77 72  ssions can be wr
9470: 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20  itten as:.**.** 
9480: 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
9490: 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e  ger->jfd) ){ ...
94a0: 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f  .**.** instead o
94b0: 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50  f.**.**   if( pP
94c0: 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68  ager->jfd->pMeth
94d0: 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64  ods ){ ....*/.#d
94e0: 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46 64  efine isOpen(pFd
94f0: 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f  ) ((pFd)->pMetho
9500: 64 73 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 52 65  ds!=0)../*.** Re
9510: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 69  turn true if thi
9520: 73 20 70 61 67 65 72 20 75 73 65 73 20 61 20 77  s pager uses a w
9530: 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 74  rite-ahead log t
9540: 6f 20 72 65 61 64 20 70 61 67 65 20 70 67 6e 6f  o read page pgno
9550: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73  ..** Return fals
9560: 65 20 69 66 20 74 68 65 20 70 61 67 65 72 20 72  e if the pager r
9570: 65 61 64 73 20 70 67 6e 6f 20 64 69 72 65 63 74  eads pgno direct
9580: 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ly from the data
9590: 62 61 73 65 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  base..*/.#if !de
95a0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
95b0: 54 5f 57 41 4c 29 20 26 26 20 64 65 66 69 6e 65  T_WAL) && define
95c0: 64 28 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  d(SQLITE_DIRECT_
95d0: 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 29 0a 69  OVERFLOW_READ).i
95e0: 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  nt sqlite3PagerU
95f0: 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61  seWal(Pager *pPa
9600: 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
9610: 0a 20 20 75 33 32 20 69 52 65 61 64 20 3d 20 30  .  u32 iRead = 0
9620: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  ;.  int rc;.  if
9630: 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d 3d  ( pPager->pWal==
9640: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
9650: 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
9660: 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d  indFrame(pPager-
9670: 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 52  >pWal, pgno, &iR
9680: 65 61 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ead);.  return r
9690: 63 20 7c 7c 20 69 52 65 61 64 3b 0a 7d 0a 23 65  c || iRead;.}.#e
96a0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
96b0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23 20 64  ITE_OMIT_WAL.# d
96c0: 65 66 69 6e 65 20 70 61 67 65 72 55 73 65 57 61  efine pagerUseWa
96d0: 6c 28 78 29 20 28 28 78 29 2d 3e 70 57 61 6c 21  l(x) ((x)->pWal!
96e0: 3d 30 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  =0).#else.# defi
96f0: 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c 28 78  ne pagerUseWal(x
9700: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
9710: 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29  erRollbackWal(x)
9720: 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65   0.# define page
9730: 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78  rWalFrames(v,w,x
9740: 2c 79 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70  ,y) 0.# define p
9750: 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
9760: 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f  sent(z) SQLITE_O
9770: 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  K.# define pager
9780: 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
9790: 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f  tion(z) SQLITE_O
97a0: 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  K.#endif..#ifnde
97b0: 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20  f NDEBUG ./*.** 
97c0: 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  Usage:.**.**   a
97d0: 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
97e0: 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
97f0: 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ) );.**.** This 
9800: 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61  function runs ma
9810: 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20 74 72  ny asserts to tr
9820: 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73  y to find incons
9830: 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20  istencies in.** 
9840: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  the internal sta
9850: 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20  te of the Pager 
9860: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
9870: 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67  c int assert_pag
9880: 65 72 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a  er_state(Pager *
9890: 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  p){.  Pager *pPa
98a0: 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53  ger = p;..  /* S
98b0: 74 61 74 65 20 6d 75 73 74 20 62 65 20 76 61 6c  tate must be val
98c0: 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  id. */.  assert(
98d0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
98e0: 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c  R_OPEN.       ||
98f0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9900: 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20 20 20  R_READER.       
9910: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9920: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
9930: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
9940: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
9950: 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20  TER_CACHEMOD.   
9960: 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65      || p->eState
9970: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
9980: 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  BMOD.       || p
9990: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
99a0: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 0a  WRITER_FINISHED.
99b0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
99c0: 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
99d0: 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61  .  );..  /* Rega
99e0: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 63 75  rdless of the cu
99f0: 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61 20 74  rrent state, a t
9a00: 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74  emp-file connect
9a10: 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68 61 76  ion always behav
9a20: 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20 69 74  es.  ** as if it
9a30: 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76   has an exclusiv
9a40: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
9a50: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20  tabase file. It 
9a60: 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a 20 20  never updates.  
9a70: 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  ** the change-co
9a80: 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73 6f 20  unter field, so 
9a90: 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  the changeCountD
9aa0: 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61  one flag is alwa
9ab0: 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  ys set..  */.  a
9ac0: 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69  ssert( p->tempFi
9ad0: 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63  le==0 || p->eLoc
9ae0: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
9af0: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
9b00: 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
9b10: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
9b20: 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f  ountDone );..  /
9b30: 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f 75 72  * If the useJour
9b40: 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c 65 61  nal flag is clea
9b50: 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  r, the journal-m
9b60: 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f 46 46  ode must be "OFF
9b70: 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20  ". .  ** And if 
9b80: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
9b90: 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65 20 6a   is "OFF", the j
9ba0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
9bb0: 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20   not be open..  
9bc0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
9bd0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9be0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9bf0: 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72  FF || p->useJour
9c00: 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
9c10: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21   p->journalMode!
9c20: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9c30: 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65  DE_OFF || !isOpe
9c40: 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20  n(p->jfd) );..  
9c50: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 4d 45  /* Check that ME
9c60: 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79  MDB implies noSy
9c70: 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65  nc. And an in-me
9c80: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69  mory journal. Si
9c90: 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d  nce .  ** this m
9ca0: 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  eans an in-memor
9cb0: 79 20 70 61 67 65 72 20 70 65 72 66 6f 72 6d 73  y pager performs
9cc0: 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69   no IO at all, i
9cd0: 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74  t cannot encount
9ce0: 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20  er .  ** either 
9cf0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20  SQLITE_IOERR or 
9d00: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72 69  SQLITE_FULL duri
9d10: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77  ng rollback or w
9d20: 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20  hile finalizing 
9d30: 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20  .  ** a journal 
9d40: 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68 20  file. (although 
9d50: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f  the in-memory jo
9d60: 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61  urnal implementa
9d70: 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72  tion may .  ** r
9d80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
9d90: 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74  RR_NOMEM while t
9da0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
9db0: 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
9dc0: 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73 20 74  ). It .  ** is t
9dd0: 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73  herefore not pos
9de0: 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d  sible for an in-
9df0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74 6f 20  memory pager to 
9e00: 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52 20  enter the ERROR 
9e10: 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a  .  ** state..  *
9e20: 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  /.  if( MEMDB ){
9e30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73  .    assert( !is
9e40: 4f 70 65 6e 28 70 2d 3e 66 64 29 20 29 3b 0a 20  Open(p->fd) );. 
9e50: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f     assert( p->no
9e60: 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65  Sync );.    asse
9e70: 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  rt( p->journalMo
9e80: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9e90: 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20  LMODE_OFF .     
9ea0: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
9eb0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
9ec0: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
9ed0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65  .    );.    asse
9ee0: 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 50  rt( p->eState!=P
9ef0: 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70 2d  AGER_ERROR && p-
9f00: 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
9f10: 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72  PEN );.    asser
9f20: 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
9f30: 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  )==0 );.  }..  /
9f40: 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75 6e 74  * If changeCount
9f50: 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61 20 52  Done is set, a R
9f60: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20  ESERVED lock or 
9f70: 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20  greater must be 
9f80: 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  held.  ** on the
9f90: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   file..  */.  as
9fa0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 68  sert( pPager->ch
9fb0: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30  angeCountDone==0
9fc0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   || pPager->eLoc
9fd0: 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k>=RESERVED_LOCK
9fe0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
9ff0: 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f  >eLock!=PENDING_
a000: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63  LOCK );..  switc
a010: 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a  h( p->eState ){.
a020: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 4f      case PAGER_O
a030: 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72  PEN:.      asser
a040: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
a050: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a060: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a070: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
a080: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
a090: 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
a0a0: 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
a0b0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
a0c0: 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72  File );.      br
a0d0: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a0e0: 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20 20 20  AGER_READER:.   
a0f0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a100: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a110: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
a120: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21  ssert( p->eLock!
a130: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b  =UNKNOWN_LOCK );
a140: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a150: 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f  ->eLock>=SHARED_
a160: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 62 72  LOCK );.      br
a170: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a180: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
a190: 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  ED:.      assert
a1a0: 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e  ( p->eLock!=UNKN
a1b0: 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  OWN_LOCK );.    
a1c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a1d0: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
a1e0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66  E_OK );.      if
a1f0: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
a200: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
a210: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a220: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
a230: 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  K );.      }.   
a240: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a250: 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65  r->dbSize==pPage
a260: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b  r->dbOrigSize );
a270: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a280: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a290: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e==pPager->dbFil
a2a0: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  eSize );.      a
a2b0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a2c0: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a2d0: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
a2e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a2f0: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
a300: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ==0 );.      bre
a310: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41  ak;..    case PA
a320: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
a330: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
a340: 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b  t( p->eLock!=UNK
a350: 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  NOWN_LOCK );.   
a360: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a370: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a380: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
a390: 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
a3a0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
a3b0: 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73     /* It is poss
a3c0: 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75  ible that if jou
a3d0: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65  rnal_mode=wal he
a3e0: 72 65 20 74 68 61 74 20 6e 65 69 74 68 65 72 20  re that neither 
a3f0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a  the.        ** j
a400: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20  ournal file nor 
a410: 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65  the WAL file are
a420: 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70   open. This happ
a430: 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20  ens during.     
a440: 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b     ** a rollback
a450: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
a460: 74 20 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20  t switches from 
a470: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66  journal_mode=off
a480: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a  .        ** to j
a490: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e  ournal_mode=wal.
a4a0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
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 20 20 61  OCK );.        a
a4e0: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
a4f0: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
a500: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a510: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a520: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a530: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a540: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a550: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a560: 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  WAL .        );.
a570: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
a580: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a590: 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72  OrigSize==pPager
a5a0: 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a  ->dbFileSize );.
a5b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
a5c0: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
a5d0: 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  ==pPager->dbHint
a5e0: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72  Size );.      br
a5f0: 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50  eak;..    case P
a600: 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
a610: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
a620: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55   p->eLock==EXCLU
a630: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
a640: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
a650: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
a660: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
a670: 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
a680: 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
a690: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a6a0: 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45  eLock>=EXCLUSIVE
a6b0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61  _LOCK );.      a
a6c0: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d  ssert( isOpen(p-
a6d0: 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20 20  >jfd) .         
a6e0: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a6f0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a700: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
a710: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
a720: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
a730: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20  JOURNALMODE_WAL 
a740: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28  .           || (
a750: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
a760: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
a770: 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43  ->fd)&SQLITE_IOC
a780: 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 29  AP_BATCH_ATOMIC)
a790: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
a7a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a7b0: 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67  dbOrigSize<=pPag
a7c0: 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29  er->dbHintSize )
a7d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
a7e0: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57      case PAGER_W
a7f0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a  RITER_FINISHED:.
a800: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a810: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
a820: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  E_LOCK );.      
a830: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a840: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
a850: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
a860: 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
a870: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
a880: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
a890: 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20  (p->jfd) .      
a8a0: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a8b0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a8c0: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
a8d0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e            || p->
a8e0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
a8f0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
a900: 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  AL .           |
a910: 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69  | (sqlite3OsDevi
a920: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
a930: 73 28 70 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f  s(p->fd)&SQLITE_
a940: 49 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d  IOCAP_BATCH_ATOM
a950: 49 43 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  IC).      );.   
a960: 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
a970: 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a  ase PAGER_ERROR:
a980: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20  .      /* There 
a990: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
a9a0: 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
a9b0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
a9c0: 65 20 70 61 67 65 72 20 69 66 0a 20 20 20 20 20  e pager if.     
a9d0: 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61   ** in ERROR sta
a9e0: 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68  te. Otherwise th
a9f0: 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68  e pager should h
aa00: 61 76 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70  ave already drop
aa10: 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63  ped.      ** bac
aa20: 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e  k to OPEN state.
aa30: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
aa40: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
aa50: 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
aa60: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
aa70: 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
aa80: 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
aa90: 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 7c 7c 20  ->pPCache)>0 || 
aaa0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
aab0: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
aac0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31  .  }..  return 1
aad0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66  ;.}.#endif /* if
aae0: 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a  ndef NDEBUG */..
aaf0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
ab00: 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  BUG ./*.** Retur
ab10: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
ab20: 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20   human readable 
ab30: 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74  string in a stat
ab40: 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e  ic buffer.** con
ab50: 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74  taining the stat
ab60: 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f  e of the Pager o
ab70: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
ab80: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69  an argument. Thi
ab90: 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64  s.** is intended
aba0: 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68   to be used with
abb0: 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f  in debuggers. Fo
abc0: 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e  r example, as an
abd0: 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20   alternative.** 
abe0: 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65  to "print *pPage
abf0: 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a  r" in gdb:.**.**
ac00: 20 28 67 64 62 29 20 70 72 69 6e 74 66 20 22 25   (gdb) printf "%
ac10: 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f  s", print_pager_
ac20: 73 74 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2f  state(pPager).*/
ac30: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 70 72  .static char *pr
ac40: 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  int_pager_state(
ac50: 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 73 74 61  Pager *p){.  sta
ac60: 74 69 63 20 63 68 61 72 20 7a 52 65 74 5b 31 30  tic char zRet[10
ac70: 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  24];..  sqlite3_
ac80: 73 6e 70 72 69 6e 74 66 28 31 30 32 34 2c 20 7a  snprintf(1024, z
ac90: 52 65 74 2c 0a 20 20 20 20 20 20 22 46 69 6c 65  Ret,.      "File
aca0: 6e 61 6d 65 3a 20 20 20 20 20 20 25 73 5c 6e 22  name:      %s\n"
acb0: 0a 20 20 20 20 20 20 22 53 74 61 74 65 3a 20 20  .      "State:  
acc0: 20 20 20 20 20 20 20 25 73 20 65 72 72 43 6f 64         %s errCod
acd0: 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c  e=%d\n".      "L
ace0: 6f 63 6b 3a 20 20 20 20 20 20 20 20 20 20 25 73  ock:          %s
acf0: 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69  \n".      "Locki
ad00: 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e  ng mode:  lockin
ad10: 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20  g_mode=%s\n".   
ad20: 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65     "Journal mode
ad30: 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  :  journal_mode=
ad40: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 42 61 63  %s\n".      "Bac
ad50: 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74 65 6d 70  king store: temp
ad60: 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64  File=%d memDb=%d
ad70: 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e   useJournal=%d\n
ad80: 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c  ".      "Journal
ad90: 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f  :       journalO
ada0: 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48  ff=%lld journalH
adb0: 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20  dr=%lld\n".     
adc0: 20 22 53 69 7a 65 3a 20 20 20 20 20 20 20 20 20   "Size:         
add0: 20 64 62 73 69 7a 65 3d 25 64 20 64 62 4f 72 69   dbsize=%d dbOri
ade0: 67 53 69 7a 65 3d 25 64 20 64 62 46 69 6c 65 53  gSize=%d dbFileS
adf0: 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20  ize=%d\n".      
ae00: 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20  , p->zFilename. 
ae10: 20 20 20 20 20 2c 20 70 2d 3e 65 53 74 61 74 65       , p->eState
ae20: 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20  ==PAGER_OPEN    
ae30: 20 20 20 20 20 20 20 20 3f 20 22 4f 50 45 4e 22          ? "OPEN"
ae40: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
ae50: 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
ae60: 45 52 20 20 20 20 20 20 20 20 20 20 3f 20 22 52  ER          ? "R
ae70: 45 41 44 45 52 22 20 3a 0a 20 20 20 20 20 20 20  EADER" :.       
ae80: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
ae90: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
aea0: 20 20 3f 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b    ? "WRITER_LOCK
aeb0: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
aec0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
aed0: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f  RITER_CACHEMOD ?
aee0: 20 22 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f   "WRITER_CACHEMO
aef0: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
af00: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
af10: 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20  ITER_DBMOD    ? 
af20: 22 57 52 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a  "WRITER_DBMOD" :
af30: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
af40: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
af50: 5f 46 49 4e 49 53 48 45 44 20 3f 20 22 57 52 49  _FINISHED ? "WRI
af60: 54 45 52 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a  TER_FINISHED" :.
af70: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
af80: 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 20  e==PAGER_ERROR  
af90: 20 20 20 20 20 20 20 20 20 3f 20 22 45 52 52 4f           ? "ERRO
afa0: 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  R" : "?error?". 
afb0: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65       , (int)p->e
afc0: 72 72 43 6f 64 65 0a 20 20 20 20 20 20 2c 20 70  rrCode.      , p
afd0: 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ->eLock==NO_LOCK
afe0: 20 20 20 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c           ? "NO_L
aff0: 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20 20 20 70  OCK" :.        p
b000: 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ->eLock==RESERVE
b010: 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52 45 53 45  D_LOCK   ? "RESE
b020: 52 56 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20  RVED" :.        
b030: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
b040: 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43  IVE_LOCK  ? "EXC
b050: 4c 55 53 49 56 45 22 20 3a 0a 20 20 20 20 20 20  LUSIVE" :.      
b060: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52    p->eLock==SHAR
b070: 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53  ED_LOCK     ? "S
b080: 48 41 52 45 44 22 20 3a 0a 20 20 20 20 20 20 20  HARED" :.       
b090: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f   p->eLock==UNKNO
b0a0: 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e  WN_LOCK    ? "UN
b0b0: 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72  KNOWN" : "?error
b0c0: 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 78  ?".      , p->ex
b0d0: 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f 20 22 65  clusiveMode ? "e
b0e0: 78 63 6c 75 73 69 76 65 22 20 3a 20 22 6e 6f 72  xclusive" : "nor
b0f0: 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  mal".      , p->
b100: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b110: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
b120: 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72  EMORY   ? "memor
b130: 79 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  y" :.        p->
b140: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b150: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
b160: 46 46 20 20 20 20 20 20 3f 20 22 6f 66 66 22 20  FF      ? "off" 
b170: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
b180: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
b190: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
b1a0: 54 45 20 20 20 3f 20 22 64 65 6c 65 74 65 22 20  TE   ? "delete" 
b1b0: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75  :.        p->jou
b1c0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
b1d0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
b1e0: 49 53 54 20 20 3f 20 22 70 65 72 73 69 73 74 22  IST  ? "persist"
b1f0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
b200: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
b210: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
b220: 4e 43 41 54 45 20 3f 20 22 74 72 75 6e 63 61 74  NCATE ? "truncat
b230: 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  e" :.        p->
b240: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b250: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
b260: 41 4c 20 20 20 20 20 20 3f 20 22 77 61 6c 22 20  AL      ? "wal" 
b270: 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20  : "?error?".    
b280: 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70    , (int)p->temp
b290: 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65  File, (int)p->me
b2a0: 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65  mDb, (int)p->use
b2b0: 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20  Journal.      , 
b2c0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  p->journalOff, p
b2d0: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20  ->journalHdr.   
b2e0: 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53     , (int)p->dbS
b2f0: 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f  ize, (int)p->dbO
b300: 72 69 67 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d  rigSize, (int)p-
b310: 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b  >dbFileSize.  );
b320: 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b  ..  return zRet;
b330: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f  .}.#endif../* Fo
b340: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73  rward references
b350: 20 74 6f 20 74 68 65 20 76 61 72 69 6f 75 73 20   to the various 
b360: 70 61 67 65 20 67 65 74 74 65 72 73 20 2a 2f 0a  page getters */.
b370: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61  static int getPa
b380: 67 65 4e 6f 72 6d 61 6c 28 50 61 67 65 72 2a 2c  geNormal(Pager*,
b390: 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c 69 6e  Pgno,DbPage**,in
b3a0: 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 67  t);.static int g
b3b0: 65 74 50 61 67 65 45 72 72 6f 72 28 50 61 67 65  etPageError(Page
b3c0: 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a  r*,Pgno,DbPage**
b3d0: 2c 69 6e 74 29 3b 0a 23 69 66 20 53 51 4c 49 54  ,int);.#if SQLIT
b3e0: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
b3f0: 30 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  0.static int get
b400: 50 61 67 65 4d 4d 61 70 28 50 61 67 65 72 2a 2c  PageMMap(Pager*,
b410: 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c 69 6e  Pgno,DbPage**,in
b420: 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  t);.#endif../*.*
b430: 2a 20 53 65 74 20 74 68 65 20 50 61 67 65 72 2e  * Set the Pager.
b440: 78 47 65 74 20 6d 65 74 68 6f 64 20 66 6f 72 20  xGet method for 
b450: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
b460: 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20  routine used to 
b470: 66 65 74 63 68 0a 2a 2a 20 63 6f 6e 74 65 6e 74  fetch.** content
b480: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e   from the pager.
b490: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b4a0: 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64 28  setGetterMethod(
b4b0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
b4c0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
b4d0: 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 70 50 61  rCode ){.    pPa
b4e0: 67 65 72 2d 3e 78 47 65 74 20 3d 20 67 65 74 50  ger->xGet = getP
b4f0: 61 67 65 45 72 72 6f 72 3b 0a 23 69 66 20 53 51  ageError;.#if SQ
b500: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
b510: 5a 45 3e 30 0a 20 20 7d 65 6c 73 65 20 69 66 28  ZE>0.  }else if(
b520: 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72   USEFETCH(pPager
b530: 29 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ).#ifdef SQLITE_
b540: 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 26 26 20  HAS_CODEC.   && 
b550: 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 3d 3d  pPager->xCodec==
b560: 30 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20  0.#endif.  ){.  
b570: 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74 20 3d    pPager->xGet =
b580: 20 67 65 74 50 61 67 65 4d 4d 61 70 3b 0a 23 65   getPageMMap;.#e
b590: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
b5a0: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a  AX_MMAP_SIZE>0 *
b5b0: 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  /.  }else{.    p
b5c0: 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20 67 65  Pager->xGet = ge
b5d0: 74 50 61 67 65 4e 6f 72 6d 61 6c 3b 0a 20 20 7d  tPageNormal;.  }
b5e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
b5f0: 20 74 72 75 65 20 69 66 20 69 74 20 69 73 20 6e   true if it is n
b600: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
b610: 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74 6f  e page *pPg into
b620: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
b630: 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65 64  ..** A page need
b640: 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
b650: 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  into the sub-jou
b660: 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65 78  rnal if there ex
b670: 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d  ists one.** or m
b680: 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69  ore open savepoi
b690: 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a  nts for which:.*
b6a0: 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67  *.**   * The pag
b6b0: 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  e-number is less
b6c0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
b6d0: 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  o PagerSavepoint
b6e0: 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20  .nOrig, and.**  
b6f0: 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72 65   * The bit corre
b700: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
b710: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e  page-number is n
b720: 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20  ot set in.**    
b730: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
b740: 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f  pInSavepoint..*/
b750: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a  .static int subj
b760: 52 65 71 75 69 72 65 73 50 61 67 65 28 50 67 48  RequiresPage(PgH
b770: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
b780: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
b790: 3e 70 50 61 67 65 72 3b 0a 20 20 50 61 67 65 72  >pPager;.  Pager
b7a0: 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b 0a 20 20  Savepoint *p;.  
b7b0: 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d  Pgno pgno = pPg-
b7c0: 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 69 3b 0a  >pgno;.  int i;.
b7d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
b7e0: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
b7f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 26   i++){.    p = &
b800: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
b810: 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  nt[i];.    if( p
b820: 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26  ->nOrig>=pgno &&
b830: 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65   0==sqlite3Bitve
b840: 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28 70 2d 3e  cTestNotNull(p->
b850: 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67  pInSavepoint, pg
b860: 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  no) ){.      ret
b870: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
b880: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
b890: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
b8a0: 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  BUG./*.** Return
b8b0: 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67   true if the pag
b8c0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
b8d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
b8e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b8f0: 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 61  pageInJournal(Pa
b900: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
b910: 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  dr *pPg){.  retu
b920: 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  rn sqlite3Bitvec
b930: 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
b940: 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67  Journal, pPg->pg
b950: 6e 6f 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  no);.}.#endif../
b960: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62  *.** Read a 32-b
b970: 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20  it integer from 
b980: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
b990: 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72  escriptor.  Stor
b9a0: 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  e the integer.**
b9b0: 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e   that is read in
b9c0: 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20   *pRes.  Return 
b9d0: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
b9e0: 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20  rything worked, 
b9f0: 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63  or an.** error c
ba00: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
ba10: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a   goes wrong..**.
ba20: 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72  ** All values ar
ba30: 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b  e stored on disk
ba40: 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a   as big-endian..
ba50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
ba60: 61 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33  ad32bits(sqlite3
ba70: 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f  _file *fd, i64 o
ba80: 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73  ffset, u32 *pRes
ba90: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
baa0: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20  ar ac[4];.  int 
bab0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
bac0: 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f  ad(fd, ac, sizeo
bad0: 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a  f(ac), offset);.
bae0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
baf0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  _OK ){.    *pRes
bb00: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
bb10: 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65  te(ac);.  }.  re
bb20: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
bb30: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
bb40: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20   integer into a 
bb50: 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e  string buffer in
bb60: 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65   big-endian byte
bb70: 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69   order..*/.#defi
bb80: 6e 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42  ne put32bits(A,B
bb90: 29 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79  )  sqlite3Put4by
bba0: 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 0a 2f  te((u8*)A,B).../
bbb0: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
bbc0: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
bbd0: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
bbe0: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74  descriptor.  Ret
bbf0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
bc00: 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
bc10: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
bc20: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
bc30: 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
bc40: 69 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28  int write32bits(
bc50: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
bc60: 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33  , i64 offset, u3
bc70: 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61  2 val){.  char a
bc80: 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74  c[4];.  put32bit
bc90: 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65  s(ac, val);.  re
bca0: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72  turn sqlite3OsWr
bcb0: 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f  ite(fd, ac, 4, o
bcc0: 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ffset);.}../*.**
bcd0: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
bce0: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65 76  base file to lev
bcf0: 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68 20  el eLock, which 
bd00: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
bd10: 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53 48 41  O_LOCK.** or SHA
bd20: 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61 72 64  RED_LOCK. Regard
bd30: 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
bd40: 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c 6c 20  or not the call 
bd50: 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  to xUnlock().** 
bd60: 73 75 63 63 65 65 64 73 2c 20 73 65 74 20 74 68  succeeds, set th
bd70: 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61  e Pager.eLock va
bd80: 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63 68 20  riable to match 
bd90: 74 68 65 20 28 61 74 74 65 6d 70 74 65 64 29 20  the (attempted) 
bda0: 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  new lock..**.** 
bdb0: 45 78 63 65 70 74 2c 20 69 66 20 50 61 67 65 72  Except, if Pager
bdc0: 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f  .eLock is set to
bdd0: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68   UNKNOWN_LOCK wh
bde0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
bdf0: 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64   is.** called, d
be00: 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 2e  o not modify it.
be10: 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   See the comment
be20: 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69   above the #defi
be30: 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e 4f 57  ne of .** UNKNOW
be40: 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78  N_LOCK for an ex
be50: 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 69  planation of thi
be60: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
be70: 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 50   pagerUnlockDb(P
be80: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
be90: 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20  t eLock){.  int 
bea0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
beb0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
bec0: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
bed0: 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  e || pPager->eLo
bee0: 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 61  ck==eLock );.  a
bef0: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 4e 4f  ssert( eLock==NO
bf00: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
bf10: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
bf20: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 21 3d   assert( eLock!=
bf30: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67 65 72  NO_LOCK || pager
bf40: 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
bf50: 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  0 );.  if( isOpe
bf60: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
bf70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
bf80: 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63  ger->eLock>=eLoc
bf90: 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 50  k );.    rc = pP
bfa0: 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53  ager->noLock ? S
bfb0: 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74  QLITE_OK : sqlit
bfc0: 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  e3OsUnlock(pPage
bfd0: 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20  r->fd, eLock);. 
bfe0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
bff0: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
c000: 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  CK ){.      pPag
c010: 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29  er->eLock = (u8)
c020: 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  eLock;.    }.   
c030: 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   IOTRACE(("UNLOC
c040: 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  K %p %d\n", pPag
c050: 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 7d 0a  er, eLock)).  }.
c060: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c070: 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 64  /*.** Lock the d
c080: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
c090: 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69  level eLock, whi
c0a0: 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ch must be eithe
c0b0: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 0a 2a  r SHARED_LOCK,.*
c0c0: 2a 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  * RESERVED_LOCK 
c0d0: 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  or EXCLUSIVE_LOC
c0e0: 4b 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  K. If the caller
c0f0: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
c100: 73 65 74 20 74 68 65 0a 2a 2a 20 50 61 67 65 72  set the.** Pager
c110: 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20  .eLock variable 
c120: 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69  to the new locki
c130: 6e 67 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a  ng state. .**.**
c140: 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67 65   Except, if Page
c150: 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74  r.eLock is set t
c160: 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77  o UNKNOWN_LOCK w
c170: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
c180: 6e 20 69 73 20 0a 2a 2a 20 63 61 6c 6c 65 64 2c  n is .** called,
c190: 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69   do not modify i
c1a0: 74 20 75 6e 6c 65 73 73 20 74 68 65 20 6e 65 77  t unless the new
c1b0: 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 69   locking state i
c1c0: 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  s EXCLUSIVE_LOCK
c1d0: 2e 20 0a 2a 2a 20 53 65 65 20 74 68 65 20 63 6f  . .** See the co
c1e0: 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20  mment above the 
c1f0: 23 64 65 66 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f  #define of UNKNO
c200: 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65  WN_LOCK for an e
c210: 78 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a 2a 20 6f  xplanation .** o
c220: 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  f this..*/.stati
c230: 63 20 69 6e 74 20 70 61 67 65 72 4c 6f 63 6b 44  c int pagerLockD
c240: 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  b(Pager *pPager,
c250: 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69   int eLock){.  i
c260: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c270: 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 4c  K;..  assert( eL
c280: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
c290: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45 53 45 52   || eLock==RESER
c2a0: 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  VED_LOCK || eLoc
c2b0: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
c2c0: 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  K );.  if( pPage
c2d0: 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63 6b 20 7c  r->eLock<eLock |
c2e0: 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  | pPager->eLock=
c2f0: 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b  =UNKNOWN_LOCK ){
c300: 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
c310: 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c 49 54  ->noLock ? SQLIT
c320: 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33 4f 73  E_OK : sqlite3Os
c330: 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
c340: 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   eLock);.    if(
c350: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
c360: 26 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  & (pPager->eLock
c370: 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c 7c  !=UNKNOWN_LOCK||
c380: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
c390: 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20  _LOCK) ){.      
c3a0: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
c3b0: 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 20  (u8)eLock;.     
c3c0: 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   IOTRACE(("LOCK 
c3d0: 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
c3e0: 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20 20 7d 0a  , eLock)).    }.
c3f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
c400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
c410: 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e  unction determin
c420: 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  es whether or no
c430: 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  t the atomic-wri
c440: 74 65 20 6f 72 0a 2a 2a 20 61 74 6f 6d 69 63 2d  te or.** atomic-
c450: 62 61 74 63 68 2d 77 72 69 74 65 20 6f 70 74 69  batch-write opti
c460: 6d 69 7a 61 74 69 6f 6e 73 20 63 61 6e 20 62 65  mizations can be
c470: 20 75 73 65 64 20 77 69 74 68 20 74 68 69 73 20   used with this 
c480: 70 61 67 65 72 2e 20 54 68 65 0a 2a 2a 20 61 74  pager. The.** at
c490: 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
c4a0: 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75  ization can be u
c4b0: 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28  sed if:.**.**  (
c4c0: 61 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  a) the value ret
c4d0: 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63  urned by OsDevic
c4e0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
c4f0: 28 29 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  () indicates tha
c500: 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61  t.**      a data
c510: 62 61 73 65 20 70 61 67 65 20 6d 61 79 20 62 65  base page may be
c520: 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
c530: 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29  lly, and.**  (b)
c540: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
c550: 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53  ned by OsSectorS
c560: 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74 68  ize() is less th
c570: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20  an or equal.**  
c580: 20 20 20 20 74 6f 20 74 68 65 20 70 61 67 65 20      to the page 
c590: 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  size..**.** If i
c5a0: 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20 74  t can be used, t
c5b0: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  hen the value re
c5c0: 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 73 69  turned is the si
c5d0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
c5e0: 6c 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20  l .** file when 
c5f0: 69 74 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c  it contains roll
c600: 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78  back data for ex
c610: 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a  actly one page..
c620: 2a 2a 0a 2a 2a 20 54 68 65 20 61 74 6f 6d 69 63  **.** The atomic
c630: 2d 62 61 74 63 68 2d 77 72 69 74 65 20 6f 70 74  -batch-write opt
c640: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
c650: 20 75 73 65 64 20 69 66 20 4f 73 44 65 76 69 63   used if OsDevic
c660: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
c670: 28 29 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  ().** returns a 
c680: 76 61 6c 75 65 20 77 69 74 68 20 74 68 65 20 53  value with the S
c690: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41 54 43  QLITE_IOCAP_BATC
c6a0: 48 5f 41 54 4f 4d 49 43 20 62 69 74 20 73 65 74  H_ATOMIC bit set
c6b0: 2e 20 2d 31 20 69 73 0a 2a 2a 20 72 65 74 75 72  . -1 is.** retur
c6c0: 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  ned in this case
c6d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68  ..**.** If neith
c6e0: 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  er optimization 
c6f0: 63 61 6e 20 62 65 20 75 73 65 64 2c 20 30 20 69  can be used, 0 i
c700: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
c710: 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75  tatic int jrnlBu
c720: 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a  fferSize(Pager *
c730: 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
c740: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 0a 23 69  t( !MEMDB );..#i
c750: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
c760: 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
c770: 52 49 54 45 29 20 5c 0a 20 7c 7c 20 64 65 66 69  RITE) \. || defi
c780: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
c790: 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57  E_BATCH_ATOMIC_W
c7a0: 52 49 54 45 29 0a 20 20 69 6e 74 20 64 63 3b 20  RITE).  int dc; 
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76            /* Dev
c7d0: 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
c7e0: 69 63 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ics */..  assert
c7f0: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
c800: 3e 66 64 29 20 29 3b 0a 20 20 64 63 20 3d 20 73  >fd) );.  dc = s
c810: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
c820: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
c830: 61 67 65 72 2d 3e 66 64 29 3b 0a 23 65 6e 64 69  ager->fd);.#endi
c840: 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
c850: 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54  _ENABLE_BATCH_AT
c860: 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 69 66 28  OMIC_WRITE.  if(
c870: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
c880: 30 20 26 26 20 28 64 63 26 53 51 4c 49 54 45 5f  0 && (dc&SQLITE_
c890: 49 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d  IOCAP_BATCH_ATOM
c8a0: 49 43 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  IC) ){.    retur
c8b0: 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n -1;.  }.#endif
c8c0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
c8d0: 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
c8e0: 49 54 45 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ITE.  {.    int 
c8f0: 6e 53 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72  nSector = pPager
c900: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20  ->sectorSize;.  
c910: 20 20 69 6e 74 20 73 7a 50 61 67 65 20 3d 20 70    int szPage = p
c920: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
c930: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c  ..    assert(SQL
c940: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
c950: 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a  512==(512>>8));.
c960: 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
c970: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
c980: 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
c990: 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26 28      if( 0==(dc&(
c9a0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
c9b0: 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29  MIC|(szPage>>8))
c9c0: 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61   || nSector>szPa
c9d0: 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ge) ){.      ret
c9e0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
c9f0: 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e  ..  return JOURN
ca00: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
ca10: 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) + JOURNAL_PG_S
ca20: 5a 28 70 50 61 67 65 72 29 3b 0a 23 65 6e 64 69  Z(pPager);.#endi
ca30: 66 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  f..  return 0;.}
ca40: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ../*.** If SQLIT
ca50: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73  E_CHECK_PAGES is
ca60: 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65   defined then we
ca70: 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20   do some sanity 
ca80: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74  checking.** on t
ca90: 68 65 20 63 61 63 68 65 20 75 73 69 6e 67 20 61  he cache using a
caa0: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20   hash function. 
cab0: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
cac0: 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64  r testing.** and
cad0: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
cae0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
caf0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a  E_CHECK_PAGES./*
cb00: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d  .** Return a 32-
cb10: 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20  bit hash of the 
cb20: 70 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50  page data for pP
cb30: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  age..*/.static u
cb40: 33 32 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  32 pager_datahas
cb50: 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73  h(int nByte, uns
cb60: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74  igned char *pDat
cb70: 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d  a){.  u32 hash =
cb80: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   0;.  int i;.  f
cb90: 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b  or(i=0; i<nByte;
cba0: 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20   i++){.    hash 
cbb0: 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20  = (hash*1039) + 
cbc0: 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20  pData[i];.  }.  
cbd0: 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73  return hash;.}.s
cbe0: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
cbf0: 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a  pagehash(PgHdr *
cc00: 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e  pPage){.  return
cc10: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
cc20: 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70  pPage->pPager->p
cc30: 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e  ageSize, (unsign
cc40: 65 64 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d  ed char *)pPage-
cc50: 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69  >pData);.}.stati
cc60: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 73 65 74  c void pager_set
cc70: 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20  _pagehash(PgHdr 
cc80: 2a 70 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65  *pPage){.  pPage
cc90: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
cca0: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 61 67  er_pagehash(pPag
ccb0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  e);.}../*.** The
ccc0: 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72   CHECK_PAGE macr
ccd0: 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a  o takes a PgHdr*
cce0: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
ccf0: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
cd00: 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66  _PAGES.** is def
cd10: 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47  ined, and NDEBUG
cd20: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c   is not defined,
cd30: 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61   an assert() sta
cd40: 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a  tement checks.**
cd50: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
cd60: 73 20 65 69 74 68 65 72 20 64 69 72 74 79 20 6f  s either dirty o
cd70: 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20  r still matches 
cd80: 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70  the calculated p
cd90: 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65  age-hash..*/.#de
cda0: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
cdb0: 78 29 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a  x) checkPage(x).
cdc0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
cdd0: 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  kPage(PgHdr *pPg
cde0: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
cdf0: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
ce00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
ce10: 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
ce20: 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73  R_ERROR );.  ass
ce30: 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73  ert( (pPg->flags
ce40: 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c  &PGHDR_DIRTY) ||
ce50: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d   pPg->pageHash==
ce60: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
ce70: 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  Pg) );.}..#else.
ce80: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61  #define pager_da
ce90: 74 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23  tahash(X,Y)  0.#
cea0: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67  define pager_pag
ceb0: 65 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66  ehash(X)  0.#def
cec0: 69 6e 65 20 70 61 67 65 72 5f 73 65 74 5f 70 61  ine pager_set_pa
ced0: 67 65 68 61 73 68 28 58 29 0a 23 64 65 66 69 6e  gehash(X).#defin
cee0: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a  e CHECK_PAGE(x).
cef0: 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54  #endif  /* SQLIT
cf00: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f  E_CHECK_PAGES */
cf10: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
cf20: 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  s is called the 
cf30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
cf40: 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75   pager pPager mu
cf50: 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54  st be open..** T
cf60: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
cf70: 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20 61 20  empts to read a 
cf80: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
cf90: 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68  ile name from th
cfa0: 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  e .** end of the
cfb0: 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75   file and, if su
cfc0: 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73  ccessful, copies
cfd0: 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20   it into memory 
cfe0: 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20  supplied .** by 
cff0: 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20  the caller. See 
d000: 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77  comments above w
d010: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
d020: 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d  l() for the form
d030: 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74  at.** used to st
d040: 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ore a master jou
d050: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61  rnal file name a
d060: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
d070: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
d080: 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20  ** zMaster must 
d090: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
d0a0: 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d  r of at least nM
d0b0: 61 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f  aster bytes allo
d0c0: 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20  cated by.** the 
d0d0: 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f  caller. This sho
d0e0: 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76  uld be sqlite3_v
d0f0: 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20  fs.mxPathname+1 
d100: 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65  (to ensure there
d110: 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70   is.** enough sp
d120: 61 63 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ace to write the
d130: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
d140: 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61  name). If the ma
d150: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
d160: 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  name in the jour
d170: 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68  nal is longer th
d180: 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73  an nMaster bytes
d190: 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a   (including a.**
d1a0: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29   nul-terminator)
d1b0: 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 68  , then this is h
d1c0: 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20  andled as if no 
d1d0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
d1e0: 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73  ame.** were pres
d1f0: 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ent in the journ
d200: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  al..**.** If a m
d210: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
d220: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
d230: 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  nt at the end of
d240: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
d250: 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73  file, then it is
d260: 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
d270: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
d280: 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41  to by zMaster. A
d290: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
d2a0: 6f 72 20 62 79 74 65 20 69 73 20 61 70 70 65 6e  or byte is appen
d2b0: 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  ded to the buffe
d2c0: 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  r following the 
d2d0: 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
d2e0: 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a  l file name..**.
d2f0: 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65 74 65  ** If it is dete
d300: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d  rmined that no m
d310: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
d320: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
d330: 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30  nt .** zMaster[0
d340: 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  ] is set to 0 an
d350: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
d360: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  rned..**.** If a
d370: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
d380: 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f  hile reading fro
d390: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
d3a0: 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a  le, an SQLite.**
d3b0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
d3c0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
d3d0: 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65  ic int readMaste
d3e0: 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33  rJournal(sqlite3
d3f0: 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68  _file *pJrnl, ch
d400: 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32  ar *zMaster, u32
d410: 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74   nMaster){.  int
d420: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
d430: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
d440: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20  n code */.  u32 
d450: 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  len;            
d460: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
d470: 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73   in bytes of mas
d480: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
d490: 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20   */.  i64 szJ;  
d4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4b0: 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69   /* Total size i
d4c0: 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e  n bytes of journ
d4d0: 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f  al file pJrnl */
d4e0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
d4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d500: 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c   MJ checksum val
d510: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75  ue read from jou
d520: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b  rnal */.  u32 u;
d530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d540: 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
d550: 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
d560: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
d570: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a   aMagic[8];   /*
d580: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
d590: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
d5a0: 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b  er */.  zMaster[
d5b0: 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66  0] = '\0';..  if
d5c0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
d5d0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
d5e0: 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a  Size(pJrnl, &szJ
d5f0: 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a  )).   || szJ<16.
d600: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
d610: 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
d620: 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c  s(pJrnl, szJ-16,
d630: 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65   &len)).   || le
d640: 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c  n>=nMaster .   |
d650: 7c 20 6c 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20  | len==0 .   || 
d660: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
d670: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
d680: 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75  l, szJ-12, &cksu
d690: 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  m)).   || SQLITE
d6a0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
d6b0: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
d6c0: 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38  aMagic, 8, szJ-8
d6d0: 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28  )).   || memcmp(
d6e0: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
d6f0: 4d 61 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20  Magic, 8).   || 
d700: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
d710: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
d720: 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c  Jrnl, zMaster, l
d730: 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29  en, szJ-16-len))
d740: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
d750: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53   rc;.  }..  /* S
d760: 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73  ee if the checks
d770: 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d  um matches the m
d780: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
d790: 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b  me */.  for(u=0;
d7a0: 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20   u<len; u++){.  
d7b0: 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74    cksum -= zMast
d7c0: 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28  er[u];.  }.  if(
d7d0: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
d7e0: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
d7f0: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
d800: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
d810: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
d820: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
d830: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
d840: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
d850: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
d860: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
d870: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
d880: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
d890: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
d8a0: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
d8b0: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
d8c0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
d8d0: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
d8e0: 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   len = 0;.  }.  
d8f0: 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27  zMaster[len] = '
d900: 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72  \0';.   .  retur
d910: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d920: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
d930: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
d940: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61  ector boundary a
d950: 74 20 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  t or immediately
d960: 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   .** following t
d970: 68 65 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67  he value in pPag
d980: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
d990: 61 73 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f  assuming a secto
d9a0: 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50  r .** size of pP
d9b0: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
d9c0: 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e   bytes..**.** i.
d9d0: 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73  e for a sector s
d9e0: 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a  ize of 512:.**.*
d9f0: 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  *   Pager.journa
da00: 6c 4f 66 66 20 20 20 20 20 20 20 20 20 20 52 65  lOff          Re
da10: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20  turn value.**   
da20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
da30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
da40: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20  -------.**   0  
da50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da60: 20 20 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31         0.**   51
da70: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
da80: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20          512.**  
da90: 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20   100            
daa0: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
dab0: 2a 20 20 20 32 30 30 30 20 20 20 20 20 20 20 20  *   2000        
dac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30                20
dad0: 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63  48.** .*/.static
dae0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f   i64 journalHdrO
daf0: 66 66 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  ffset(Pager *pPa
db00: 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73  ger){.  i64 offs
db10: 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20  et = 0;.  i64 c 
db20: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
db30: 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b  lOff;.  if( c ){
db40: 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28  .    offset = ((
db50: 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52  c-1)/JOURNAL_HDR
db60: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29  _SZ(pPager) + 1)
db70: 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   * JOURNAL_HDR_S
db80: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  Z(pPager);.  }. 
db90: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25   assert( offset%
dba0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
dbb0: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61  Pager)==0 );.  a
dbc0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63  ssert( offset>=c
dbd0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f   );.  assert( (o
dbe0: 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c  ffset-c)<JOURNAL
dbf0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
dc00: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73  );.  return offs
dc10: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
dc20: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
dc30: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
dc40: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
dc50: 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   called..**.** T
dc60: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
dc70: 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a  a no-op if the j
dc80: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
dc90: 6e 6f 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e  not been written
dca0: 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68   to.** within th
dcb0: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
dcc0: 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50  ction (i.e. if P
dcd0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ager.journalOff=
dce0: 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f  =0)..**.** If do
dcf0: 54 72 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d  Truncate is non-
dd00: 7a 65 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65  zero or the Page
dd10: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
dd20: 69 74 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a  it variable is.*
dd30: 2a 20 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e  * set to 0, then
dd40: 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f   truncate the jo
dd50: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65  urnal file to ze
dd60: 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ro bytes in size
dd70: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20  . Otherwise,.** 
dd80: 7a 65 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65  zero the 28-byte
dd90: 20 68 65 61 64 65 72 20 61 74 20 74 68 65 20 73   header at the s
dda0: 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
ddb0: 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74  nal file. In eit
ddc0: 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66  her case, .** if
ddd0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
dde0: 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  t in no-sync mod
ddf0: 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
de00: 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61  nal file immedia
de10: 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77  tely .** after w
de20: 72 69 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  riting or trunca
de30: 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49  ting it..**.** I
de40: 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  f Pager.journalS
de50: 69 7a 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20  izeLimit is set 
de60: 74 6f 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e  to a positive, n
de70: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61  on-zero value, a
de80: 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  nd.** following 
de90: 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f  the truncation o
dea0: 72 20 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69  r zeroing descri
deb0: 62 65 64 20 61 62 6f 76 65 20 74 68 65 20 73 69  bed above the si
dec0: 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f  ze of the .** jo
ded0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
dee0: 74 65 73 20 69 73 20 6c 61 72 67 65 72 20 74 68  tes is larger th
def0: 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74  an this value, t
df00: 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65  hen truncate the
df10: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
df20: 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   to Pager.journa
df30: 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73  lSizeLimit bytes
df40: 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
df50: 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e  le does.** not n
df60: 65 65 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64  eed to be synced
df70: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
df80: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  operation..**.**
df90: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
dfa0: 6f 63 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20  occurs, abandon 
dfb0: 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
dfc0: 65 74 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72  eturn the IO err
dfd0: 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65  or code..** Othe
dfe0: 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51  rwise, return SQ
dff0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
e000: 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e  ic int zeroJourn
e010: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
e020: 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63  ger, int doTrunc
e030: 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ate){.  int rc =
e040: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
e050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
e070: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73  urn code */.  as
e080: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
e090: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61  ger->jfd) );.  a
e0a0: 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 4a  ssert( !sqlite3J
e0b0: 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79  ournalIsInMemory
e0c0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
e0d0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
e0e0: 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
e0f0: 20 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69   const i64 iLimi
e100: 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
e110: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
e120: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
e130: 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49  of jsl */..    I
e140: 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44  OTRACE(("JZEROHD
e150: 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  R %p\n", pPager)
e160: 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e  ).    if( doTrun
e170: 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d  cate || iLimit==
e180: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
e190: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
e1a0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
e1b0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
e1c0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
e1d0: 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38   char zeroHdr[28
e1e0: 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72  ] = {0};.      r
e1f0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
e200: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
e210: 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28  zeroHdr, sizeof(
e220: 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20  zeroHdr), 0);.  
e230: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
e240: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50  SQLITE_OK && !pP
e250: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
e260: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e270: 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
e280: 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e  >jfd, SQLITE_SYN
e290: 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65  C_DATAONLY|pPage
e2a0: 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
e2b0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
e2c0: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74  this point the t
e2d0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
e2e0: 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20  mmitted but the 
e2f0: 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20  write lock .    
e300: 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64  ** is still held
e310: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66   on the file. If
e320: 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65   there is a size
e330: 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65   limit configure
e340: 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68  d for .    ** th
e350: 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  e persistent jou
e360: 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75  rnal and the jou
e370: 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e  rnal file curren
e380: 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72  tly consumes mor
e390: 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74  e.    ** space t
e3a0: 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61  han that limit a
e3b0: 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63  llows for, trunc
e3c0: 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72  ate it now. Ther
e3d0: 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20  e is no need.   
e3e0: 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20   ** to sync the 
e3f0: 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  file following t
e400: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  his operation.. 
e410: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
e420: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
e430: 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20  Limit>0 ){.     
e440: 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72   i64 sz;.      r
e450: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
e460: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
e470: 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69  d, &sz);.      i
e480: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
e490: 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b   && sz>iLimit ){
e4a0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
e4b0: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
e4c0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69  pPager->jfd, iLi
e4d0: 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
e4e0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
e4f0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
e500: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
e510: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
e520: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
e530: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
e540: 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f  al.** header (JO
e550: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
e560: 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69  es) is written i
e570: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
e580: 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63  file at the.** c
e590: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
e5a0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
e5b0: 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  t for the journa
e5c0: 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66  l header is as f
e5d0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62  ollows:.** - 8 b
e5e0: 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e  ytes: Magic iden
e5f0: 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  tifying journal 
e600: 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62  format..** - 4 b
e610: 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
e620: 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e  records in journ
e630: 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e  al, or -1 no-syn
e640: 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a  c mode is on..**
e650: 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64   - 4 bytes: Rand
e660: 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66  om number used f
e670: 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a  or page hash..**
e680: 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74   - 4 bytes: Init
e690: 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67  ial database pag
e6a0: 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20  e count..** - 4 
e6b0: 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69  bytes: Sector si
e6c0: 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70  ze used by the p
e6d0: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
e6e0: 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a  e this journal..
e6f0: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61  ** - 4 bytes: Da
e700: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
e710: 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65  ..** .** Followe
e720: 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  d by (JOURNAL_HD
e730: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
e740: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
e750: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e760: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
e770: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
e780: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
e790: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
e7a0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
e7b0: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
e7c0: 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72  zHeader = pPager
e7d0: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a  ->pTmpSpace;  /*
e7e0: 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65   Temporary space
e7f0: 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68   used to build h
e800: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
e810: 48 65 61 64 65 72 20 3d 20 28 75 33 32 29 70 50  Header = (u32)pP
e820: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 2f  ager->pageSize;/
e830: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
e840: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
e850: 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  Header */.  u32 
e860: 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
e870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e880: 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64  /* Bytes of head
e890: 65 72 20 73 65 63 74 6f 72 20 77 72 69 74 74 65  er sector writte
e8a0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20  n */.  int ii;  
e8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
e8d0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
e8e0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
e8f0: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20  pPager->jfd) ); 
e900: 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20       /* Journal 
e910: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
e920: 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65  n. */..  if( nHe
e930: 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52  ader>JOURNAL_HDR
e940: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
e950: 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55     nHeader = JOU
e960: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
e970: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
e980: 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
e990: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
e9a0: 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65  d any of them we
e9b0: 72 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a  re created .  **
e9c0: 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20   since the most 
e9d0: 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68  recent journal h
e9e0: 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
e9f0: 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a 20  n, update the . 
ea00: 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
ea10: 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69  nt.iHdrOffset fi
ea20: 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  elds now..  */. 
ea30: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
ea40: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
ea50: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
ea60: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
ea70: 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73  int[ii].iHdrOffs
ea80: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  et==0 ){.      p
ea90: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
eaa0: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
eab0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
eac0: 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  alOff;.    }.  }
ead0: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
eae0: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
eaf0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
eb00: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
eb10: 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20  Pager);..  /* . 
eb20: 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   ** Write the nR
eb30: 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e  ec Field - the n
eb40: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
eb50: 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  cords that follo
eb60: 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72  w this.  ** jour
eb70: 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d  nal header. Norm
eb80: 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72  ally, zero is wr
eb90: 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61  itten to this va
eba0: 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  lue at this time
ebb0: 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65  ..  ** After the
ebc0: 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64   records are add
ebd0: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
ebe0: 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  l (and the journ
ebf0: 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a  al synced, .  **
ec00: 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   if in full-sync
ec10: 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f   mode), the zero
ec20: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
ec30: 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75  with the true nu
ec40: 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63  mber.  ** of rec
ec50: 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f  ords (see syncJo
ec60: 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20  urnal())..  **. 
ec70: 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74   ** A faster alt
ec80: 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77  ernative is to w
ec90: 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20  rite 0xFFFFFFFF 
eca0: 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  to the nRec fiel
ecb0: 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61  d. When.  ** rea
ecc0: 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ding the journal
ecd0: 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c   this value tell
ece0: 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75  s SQLite to assu
ecf0: 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a  me that the.  **
ed00: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
ed10: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
ed20: 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  ns valid page re
ed30: 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75  cords. This assu
ed40: 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64  mption.  ** is d
ed50: 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20  angerous, as if 
ed60: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  a failure occurr
ed70: 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
ed80: 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
ed90: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61  .  ** file it ma
eda0: 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67  y contain some g
edb0: 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65  arbage data. The
edc0: 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61  re are two scena
edd0: 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20  rios.  ** where 
ede0: 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65  this risk can be
edf0: 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20   ignored:.  **. 
ee00: 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65   **   * When the
ee10: 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d   pager is in no-
ee20: 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75  sync mode. Corru
ee30: 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77  ption can follow
ee40: 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65   a.  **     powe
ee50: 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69  r failure in thi
ee60: 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20  s case anyway.. 
ee70: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
ee80: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  n the SQLITE_IOC
ee90: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66  AP_SAFE_APPEND f
eea0: 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73  lag is set. This
eeb0: 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a   guarantees.  **
eec0: 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67       that garbag
eed0: 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20  e data is never 
eee0: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
eef0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
ef00: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
ef10: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
ef20: 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  || pPager->noSyn
ef30: 63 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  c );.  if( pPage
ef40: 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50  r->noSync || (pP
ef50: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
ef60: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
ef70: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20  MODE_MEMORY).   
ef80: 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76  || (sqlite3OsDev
ef90: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
efa0: 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53  cs(pPager->fd)&S
efb0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
efc0: 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20  _APPEND) .  ){. 
efd0: 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65     memcpy(zHeade
efe0: 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  r, aJournalMagic
eff0: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
f000: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75  lMagic));.    pu
f010: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
f020: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
f030: 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66  Magic)], 0xfffff
f040: 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fff);.  }else{. 
f050: 20 20 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65     memset(zHeade
f060: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  r, 0, sizeof(aJo
f070: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a  urnalMagic)+4);.
f080: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61    }..  /* The ra
f090: 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20  ndom check-hash 
f0a0: 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 20 0a  initializer */ .
f0b0: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
f0c0: 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67  ness(sizeof(pPag
f0d0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20  er->cksumInit), 
f0e0: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
f0f0: 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  it);.  put32bits
f100: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
f110: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
f120: 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  4], pPager->cksu
f130: 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65  mInit);.  /* The
f140: 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   initial databas
f150: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33  e size */.  put3
f160: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
f170: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
f180: 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d  gic)+8], pPager-
f190: 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20  >dbOrigSize);.  
f1a0: 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73  /* The assumed s
f1b0: 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74  ector size for t
f1c0: 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  his process */. 
f1d0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
f1e0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
f1f0: 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70  nalMagic)+12], p
f200: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
f210: 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61  e);..  /* The pa
f220: 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74  ge size */.  put
f230: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
f240: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
f250: 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65  agic)+16], pPage
f260: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
f270: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67   /* Initializing
f280: 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65   the tail of the
f290: 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e   buffer is not n
f2a0: 65 63 65 73 73 61 72 79 2e 20 20 45 76 65 72 79  ecessary.  Every
f2b0: 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73  thing.  ** works
f2c0: 20 66 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c   find if the fol
f2d0: 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20  lowing memset() 
f2e0: 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74  is omitted.  But
f2f0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20   initializing.  
f300: 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72  ** the memory pr
f310: 65 76 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20  events valgrind 
f320: 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67  from complaining
f330: 2c 20 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c  , so we are will
f340: 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65  ing to.  ** take
f350: 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   the performance
f360: 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d   hit..  */.  mem
f370: 73 65 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  set(&zHeader[siz
f380: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
f390: 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20  c)+20], 0,.     
f3a0: 20 20 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a      nHeader-(siz
f3b0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
f3c0: 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49  c)+20));..  /* I
f3d0: 6e 20 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20  n theory, it is 
f3e0: 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74  only necessary t
f3f0: 6f 20 77 72 69 74 65 20 74 68 65 20 32 38 20 62  o write the 28 b
f400: 79 74 65 73 20 74 68 61 74 20 74 68 65 20 0a 20  ytes that the . 
f410: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
f420: 65 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74  er consumes to t
f430: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
f440: 68 65 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65  here. Then incre
f450: 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50  ment the .  ** P
f460: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
f470: 76 61 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52  variable by JOUR
f480: 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68  NAL_HDR_SZ so th
f490: 61 74 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a  at the next .  *
f4a0: 2a 20 72 65 63 6f 72 64 20 69 73 20 77 72 69 74  * record is writ
f4b0: 74 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ten to the follo
f4c0: 77 69 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61  wing sector (lea
f4d0: 76 69 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68  ving a gap in th
f4e0: 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74  e file.  ** that
f4f0: 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69   will be implici
f500: 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79  tly filled in by
f510: 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20   the OS)..  **. 
f520: 20 2a 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68   ** However it h
f530: 61 73 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72  as been discover
f540: 65 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20  ed that on some 
f550: 73 79 73 74 65 6d 73 20 74 68 69 73 20 70 61 74  systems this pat
f560: 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62  tern can .  ** b
f570: 65 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20  e significantly 
f580: 73 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74  slower than cont
f590: 69 67 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67  iguously writing
f5a0: 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c   data to the fil
f5b0: 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20  e,.  ** even if 
f5c0: 74 68 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69  that means expli
f5d0: 63 69 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61  citly writing da
f5e0: 74 61 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20  ta to the block 
f5f0: 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41  of .  ** (JOURNA
f600: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
f610: 79 74 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e  ytes that will n
f620: 6f 74 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74  ot be used. So t
f630: 68 61 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a  hat is what.  **
f640: 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a   is done. .  **.
f650: 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73    ** The loop is
f660: 20 72 65 71 75 69 72 65 64 20 68 65 72 65 20 69   required here i
f670: 6e 20 63 61 73 65 20 74 68 65 20 73 65 63 74 6f  n case the secto
f680: 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72  r-size is larger
f690: 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20   than the .  ** 
f6a0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69  database page si
f6b0: 7a 65 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48  ze. Since the zH
f6c0: 65 61 64 65 72 20 62 75 66 66 65 72 20 69 73 20  eader buffer is 
f6d0: 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53  only Pager.pageS
f6e0: 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69  ize.  ** bytes i
f6f0: 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61  n size, more tha
f700: 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71  n one call to sq
f710: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d  lite3OsWrite() m
f720: 61 79 20 62 65 20 72 65 71 75 69 72 65 64 0a 20  ay be required. 
f730: 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20   ** to populate 
f740: 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
f750: 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  al header sector
f760: 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57  ..  */ .  for(nW
f770: 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  rite=0; rc==SQLI
f780: 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f  TE_OK&&nWrite<JO
f790: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
f7a0: 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48  ger); nWrite+=nH
f7b0: 65 61 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52  eader){.    IOTR
f7c0: 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
f7d0: 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
f7e0: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
f7f0: 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a  lHdr, nHeader)).
f800: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f810: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
f820: 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48  jfd, zHeader, nH
f830: 65 61 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  eader, pPager->j
f840: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20  ournalOff);.    
f850: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
f860: 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50  journalHdr <= pP
f870: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f880: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
f890: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48  journalOff += nH
f8a0: 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65  eader;.  }..  re
f8b0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
f8c0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
f8d0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
f8e0: 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  when this is cal
f8f0: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68  led. A journal h
f900: 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a  eader file.** (J
f910: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
f920: 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f  tes) is read fro
f930: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  m the current lo
f940: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
f950: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54  urnal.** file. T
f960: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
f970: 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ion in the journ
f980: 61 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e  al file is given
f990: 20 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a   by.** pPager->j
f9a0: 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63  ournalOff. See c
f9b0: 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75  omments above fu
f9c0: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72  nction writeJour
f9d0: 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20  nalHdr() for.** 
f9e0: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
f9f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
fa00: 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  der format..**.*
fa10: 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20  * If the header 
fa20: 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66  is read successf
fa30: 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20  ully, *pNRec is 
fa40: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
fa50: 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63  r of.** page rec
fa60: 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ords following t
fa70: 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a  his header and *
fa80: 70 44 62 53 69 7a 65 20 69 73 20 73 65 74 20 74  pDbSize is set t
fa90: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
faa0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65  e.** database be
fab0: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
fac0: 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70  tion began, in p
fad0: 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67  ages. Also, pPag
fae0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a  er->cksumInit.**
faf0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
fb00: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
fb10: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
fb20: 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r. SQLITE_OK is 
fb30: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74  returned.** in t
fb40: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
fb50: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
fb60: 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61  eader file appea
fb70: 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74  rs to be corrupt
fb80: 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
fb90: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  is.** returned a
fba0: 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50  nd *pNRec and *P
fbb0: 44 62 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66  DbSize are undef
fbc0: 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41  ined.  If JOURNA
fbd0: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a  L_HDR_SZ bytes.*
fbe0: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64  * cannot be read
fbf0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
fc00: 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20  l file an error 
fc10: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
fc20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
fc30: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a  readJournalHdr(.
fc40: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fc60: 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
fc70: 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20  /.  int isHot,. 
fc80: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65   i64 journalSize
fc90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
fca0: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65   Size of the ope
fcb0: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  n journal file i
fcc0: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
fcd0: 20 2a 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20   *pNRec,        
fce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
fcf0: 3a 20 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f  : Value read fro
fd00: 6d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  m the nRec field
fd10: 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69   */.  u32 *pDbSi
fd20: 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
fd30: 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65     /* OUT: Value
fd40: 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74   of original dat
fd50: 61 62 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64  abase size field
fd60: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
fd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd80: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
fd90: 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  code */.  unsign
fda0: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
fdb0: 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66  ];     /* A buff
fdc0: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
fdd0: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
fde0: 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
fdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fe00: 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e   Offset of journ
fe10: 61 6c 20 68 65 61 64 65 72 20 62 65 69 6e 67 20  al header being 
fe20: 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  read */..  asser
fe30: 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
fe40: 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f  ->jfd) );      /
fe50: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * Journal file m
fe60: 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a  ust be open. */.
fe70: 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61  .  /* Advance Pa
fe80: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74  ger.journalOff t
fe90: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
fea0: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20  he next sector. 
feb0: 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  If the.  ** jour
fec0: 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20  nal file is too 
fed0: 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20  small for there 
fee0: 74 6f 20 62 65 20 61 20 68 65 61 64 65 72 20 73  to be a header s
fef0: 74 6f 72 65 64 20 61 74 20 74 68 69 73 0a 20 20  tored at this.  
ff00: 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e  ** point, return
ff10: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20   SQLITE_DONE..  
ff20: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  */.  pPager->jou
ff30: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
ff40: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
ff50: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
ff60: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55  ->journalOff+JOU
ff70: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
ff80: 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a  er) > journalSiz
ff90: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
ffa0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
ffb0: 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61  .  iHdrOff = pPa
ffc0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
ffd0: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74  ..  /* Read in t
ffe0: 68 65 20 66 69 72 73 74 20 38 20 62 79 74 65 73  he first 8 bytes
fff0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
10000 68 65 61 64 65 72 2e 20 49 66 20 74 68 65 79 20  header. If they 
10010 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a  do not match.  *
10020 2a 20 74 68 65 20 20 6d 61 67 69 63 20 73 74 72  * the  magic str
10030 69 6e 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65  ing found at the
10040 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a   start of each j
10050 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72  ournal header, r
10060 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
10070 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f  E_DONE. If an IO
10080 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
10090 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
100a0 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ode. Otherwise,.
100b0 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20    ** proceed..  
100c0 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c  */.  if( isHot |
100d0 7c 20 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65  | iHdrOff!=pPage
100e0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b  r->journalHdr ){
100f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10100 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
10110 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a  jfd, aMagic, siz
10120 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64  eof(aMagic), iHd
10130 72 4f 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72  rOff);.    if( r
10140 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
10150 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
10160 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69  if( memcmp(aMagi
10170 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
10180 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
10190 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )!=0 ){.      re
101a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
101b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
101c0 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
101d0 20 74 68 72 65 65 20 33 32 2d 62 69 74 20 66 69   three 32-bit fi
101e0 65 6c 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  elds of the jour
101f0 6e 61 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20  nal header: The 
10200 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c  nRec.  ** field,
10210 20 74 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e   the checksum-in
10220 69 74 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68  itializer and th
10230 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
10240 61 74 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a  at the start.  *
10250 2a 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  * of the transac
10260 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20  tion. Return an 
10270 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
10280 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
10290 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51  g..  */.  if( SQ
102a0 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
102b0 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
102c0 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38  ->jfd, iHdrOff+8
102d0 2c 20 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20  , pNRec)).   || 
102e0 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
102f0 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
10300 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
10310 2b 31 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  +12, &pPager->ck
10320 73 75 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20  sumInit)).   || 
10330 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
10340 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
10350 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
10360 2b 31 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20  +16, pDbSize)). 
10370 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
10380 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  c;.  }..  if( pP
10390 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
103a0 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69  ==0 ){.    u32 i
103b0 50 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20  PageSize;       
103c0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d          /* Page-
103d0 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f  size field of jo
103e0 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
103f0 20 20 20 20 75 33 32 20 69 53 65 63 74 6f 72 53      u32 iSectorS
10400 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
10410 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20   /* Sector-size 
10420 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c  field of journal
10430 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20   header */..    
10440 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65  /* Read the page
10450 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
10460 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65  -size journal he
10470 61 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a  ader fields. */.
10480 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
10490 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62  K!=(rc = read32b
104a0 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
104b0 20 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53   iHdrOff+20, &iS
104c0 65 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20  ectorSize)).    
104d0 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
104e0 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
104f0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
10500 72 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53  rOff+24, &iPageS
10510 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  ize)).    ){.   
10520 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
10530 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 73    }..    /* Vers
10540 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70  ions of SQLite p
10550 72 69 6f 72 20 74 6f 20 33 2e 35 2e 38 20 73 65  rior to 3.5.8 se
10560 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
10570 66 69 65 6c 64 20 6f 66 20 74 68 65 0a 20 20 20  field of the.   
10580 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
10590 65 72 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74  er to zero. In t
105a0 68 69 73 20 63 61 73 65 2c 20 61 73 73 75 6d 65  his case, assume
105b0 20 74 68 61 74 20 74 68 65 20 50 61 67 65 72 2e   that the Pager.
105c0 70 61 67 65 53 69 7a 65 0a 20 20 20 20 2a 2a 20  pageSize.    ** 
105d0 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 72 65  variable is alre
105e0 61 64 79 20 73 65 74 20 74 6f 20 74 68 65 20 63  ady set to the c
105f0 6f 72 72 65 63 74 20 70 61 67 65 20 73 69 7a 65  orrect page size
10600 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
10610 20 69 50 61 67 65 53 69 7a 65 3d 3d 30 20 29 7b   iPageSize==0 ){
10620 0a 20 20 20 20 20 20 69 50 61 67 65 53 69 7a 65  .      iPageSize
10630 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
10640 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ize;.    }..    
10650 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
10660 65 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72  e values read fr
10670 6f 6d 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  om the page-size
10680 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
10690 20 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61   fields.    ** a
106a0 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e  re within range.
106b0 20 54 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65   To be 'in range
106c0 27 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e  ', both values n
106d0 65 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  eed to be a powe
106e0 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20  r.    ** of two 
106f0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
10700 65 71 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20  equal to 512 or 
10710 33 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61  32, and not grea
10720 74 65 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a  ter than their .
10730 20 20 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76      ** respectiv
10740 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d  e compile time m
10750 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20  aximum limits.. 
10760 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50     */.    if( iP
10770 61 67 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20  ageSize<512     
10780 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
10790 69 53 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20  iSectorSize<32. 
107a0 20 20 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65      || iPageSize
107b0 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
107c0 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72  _SIZE || iSector
107d0 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f  Size>MAX_SECTOR_
107e0 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69  SIZE.     || ((i
107f0 50 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67  PageSize-1)&iPag
10800 65 53 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28  eSize)!=0   || (
10810 28 69 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26  (iSectorSize-1)&
10820 69 53 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20  iSectorSize)!=0 
10830 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
10840 20 49 66 20 74 68 65 20 65 69 74 68 65 72 20 74   If the either t
10850 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20  he page-size or 
10860 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74  sector-size in t
10870 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  he journal-heade
10880 72 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69  r is .      ** i
10890 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65  nvalid, then the
108a0 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72   process that wr
108b0 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  ote the journal-
108c0 68 65 61 64 65 72 20 6d 75 73 74 20 68 61 76 65  header must have
108d0 20 0a 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68   .      ** crash
108e0 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 68 65  ed before the he
108f0 61 64 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e  ader was synced.
10900 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 73 74   In this case st
10910 6f 70 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20  op reading .    
10920 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
10930 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20   file here..    
10940 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
10950 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
10960 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64     }..    /* Upd
10970 61 74 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a  ate the page-siz
10980 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76  e to match the v
10990 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
109a0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  he journal. .   
109b0 20 2a 2a 20 55 73 65 20 61 20 74 65 73 74 63 61   ** Use a testca
109c0 73 65 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61  se() macro to ma
109d0 6b 65 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c  ke sure that mal
109e0 6c 6f 63 20 66 61 69 6c 75 72 65 20 77 69 74 68  loc failure with
109f0 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72  in .    ** Pager
10a00 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 69 73  SetPagesize() is
10a10 20 74 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a   tested..    */.
10a20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10a30 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
10a40 28 70 50 61 67 65 72 2c 20 26 69 50 61 67 65 53  (pPager, &iPageS
10a50 69 7a 65 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65  ize, -1);.    te
10a60 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
10a70 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  TE_OK );..    /*
10a80 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75   Update the assu
10a90 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  med sector-size 
10aa0 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
10ab0 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 20 20  ue used by .    
10ac0 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  ** the process t
10ad0 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73  hat created this
10ae0 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69   journal. If thi
10af0 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20  s journal was.  
10b00 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20    ** created by 
10b10 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20  a process other 
10b20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74  than this one, t
10b30 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
10b40 0a 20 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  .    ** is being
10b50 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
10b60 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61  hin pager_playba
10b70 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20  ck(). The local 
10b80 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20  value.    ** of 
10b90 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
10ba0 20 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20   is restored at 
10bb0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20  the end of that 
10bc0 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a  routine..    */.
10bd0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
10be0 6f 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72  orSize = iSector
10bf0 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61  Size;.  }..  pPa
10c00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10c10 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  += JOURNAL_HDR_S
10c20 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  Z(pPager);.  ret
10c30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
10c40 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70  * Write the supp
10c50 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72  lied master jour
10c60 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68  nal name into th
10c70 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
10c80 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67  or pager.** pPag
10c90 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  er at the curren
10ca0 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20  t location. The 
10cb0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
10cc0 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20  ame must be the 
10cd0 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72  last.** thing wr
10ce0 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e  itten to a journ
10cf0 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
10d00 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c  pager is in full
10d10 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a  -sync mode, the.
10d20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
10d30 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64  descriptor is ad
10d40 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65  vanced to the ne
10d50 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  xt sector bounda
10d60 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  ry before.** any
10d70 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e  thing is written
10d80 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a  . The format is:
10d90 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  .**.**   + 4 byt
10da0 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  es: PAGER_MJ_PGN
10db0 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65  O..**   + N byte
10dc0 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61  s: Master journa
10dd0 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74  l filename in ut
10de0 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79  f-8..**   + 4 by
10df0 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f  tes: N (length o
10e00 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
10e10 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20   name in bytes, 
10e20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  no nul-terminato
10e30 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  r)..**   + 4 byt
10e40 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e  es: Master journ
10e50 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d  al name checksum
10e60 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73  ..**   + 8 bytes
10e70 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  : aJournalMagic[
10e80 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73  ]..**.** The mas
10e90 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter journal page
10ea0 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65   checksum is the
10eb0 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65   sum of the byte
10ec0 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a  s in the master.
10ed0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c  ** journal name,
10ee0 20 77 68 65 72 65 20 65 61 63 68 20 62 79 74 65   where each byte
10ef0 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
10f00 61 73 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69  as a signed 8-bi
10f10 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a  t integer..**.**
10f20 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61   If zMaster is a
10f30 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f   NULL pointer (o
10f40 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67  ccurs for a sing
10f50 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
10f60 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68  saction), .** th
10f70 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
10f80 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
10f90 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  t writeMasterJou
10fa0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
10fb0 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
10fc0 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
10fd0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
10fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10ff0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
11000 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20   int nMaster;   
11010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11020 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73    /* Length of s
11030 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f  tring zMaster */
11040 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20  .  i64 iHdrOff; 
11050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11060 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
11070 20 68 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e   header in journ
11080 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
11090 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20   jrnlSize;      
110a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
110b0 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c   Size of journal
110c0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f   file on disk */
110d0 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30  .  u32 cksum = 0
110e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
110f0 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
11100 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65  of string zMaste
11110 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
11120 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
11130 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r==0 );.  assert
11140 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
11150 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28  Pager) );..  if(
11160 20 21 7a 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c   !zMaster .   ||
11170 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11180 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
11190 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
111a0 20 20 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50     || !isOpen(pP
111b0 61 67 65 72 2d 3e 6a 66 64 29 0a 20 20 29 7b 0a  ager->jfd).  ){.
111c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
111d0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  E_OK;.  }.  pPag
111e0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
111f0 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  1;.  assert( pPa
11200 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
11210 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  <= pPager->journ
11220 61 6c 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43  alOff );..  /* C
11230 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e  alculate the len
11240 67 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64  gth in bytes and
11250 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66   the checksum of
11260 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f   zMaster */.  fo
11270 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61  r(nMaster=0; zMa
11280 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e  ster[nMaster]; n
11290 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63  Master++){.    c
112a0 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b  ksum += zMaster[
112b0 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20  nMaster];.  }.. 
112c0 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
112d0 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63  ync mode, advanc
112e0 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69  e to the next di
112f0 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65  sk sector before
11300 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68   writing.  ** th
11310 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11320 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69   name. This is i
11330 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69  n case the previ
11340 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e  ous page written
11350 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   to.  ** the jou
11360 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79  rnal has already
11370 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20   been synced..  
11380 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
11390 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
113a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
113b0 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
113c0 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
113d0 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
113e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
113f0 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  ff;..  /* Write 
11400 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
11410 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 65  al data to the e
11420 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
11430 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20  l file. If.  ** 
11440 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
11450 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
11460 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
11470 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ller..  */.  if(
11480 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69   (0 != (rc = wri
11490 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
114a0 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50  >jfd, iHdrOff, P
114b0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
114c0 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30  ger)))).   || (0
114d0 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
114e0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
114f0 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  >jfd, zMaster, n
11500 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b  Master, iHdrOff+
11510 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  4))).   || (0 !=
11520 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
11530 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
11540 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
11550 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20  r, nMaster))).  
11560 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
11570 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
11580 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
11590 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b  +4+nMaster+4, ck
115a0 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  sum))).   || (0 
115b0 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
115c0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
115d0 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  jfd, aJournalMag
115e0 69 63 2c 20 38 2c 0a 20 20 20 20 20 20 20 20 20  ic, 8,.         
115f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11600 20 20 20 20 20 20 20 20 69 48 64 72 4f 66 66 2b          iHdrOff+
11610 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20  4+nMaster+8))). 
11620 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
11630 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  c;.  }.  pPager-
11640 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28  >journalOff += (
11650 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20  nMaster+20);..  
11660 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
11670 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d  is in peristent-
11680 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68  journal mode, th
11690 65 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20  en the physical 
116a0 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69  .  ** journal-fi
116b0 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61  le may extend pa
116c0 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
116d0 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
116e0 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38   name.  ** and 8
116f0 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20   bytes of magic 
11700 64 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65  data just writte
11710 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54  n to the file. T
11720 68 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e  his is .  ** dan
11730 67 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74  gerous because t
11740 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62  he code to rollb
11750 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
11760 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c  l file.  ** will
11770 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20   not be able to 
11780 66 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d  find the master-
11790 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20  journal name to 
117a0 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20  determine .  ** 
117b0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
117c0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f  he journal is ho
117d0 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61  t. .  **.  ** Ea
117e0 73 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64  siest thing to d
117f0 6f 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72  o in this scenar
11800 69 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74  io is to truncat
11810 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20  e the journal . 
11820 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20   ** file to the 
11830 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20  required size.. 
11840 20 2a 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54   */ .  if( SQLIT
11850 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK==(rc = sqli
11860 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
11870 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c  ager->jfd, &jrnl
11880 53 69 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e  Size)).   && jrn
11890 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f  lSize>pPager->jo
118a0 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20  urnalOff.  ){.  
118b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
118c0 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
118d0 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
118e0 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20  urnalOff);.  }. 
118f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11900 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 74 68 65  *.** Discard the
11910 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
11920 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   of the in-memor
11930 79 20 70 61 67 65 2d 63 61 63 68 65 2e 0a 2a 2f  y page-cache..*/
11940 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
11950 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a  er_reset(Pager *
11960 70 50 61 67 65 72 29 7b 0a 20 20 70 50 61 67 65  pPager){.  pPage
11970 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b  r->iDataVersion+
11980 2b 3b 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b  +;.  sqlite3Back
11990 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72  upRestart(pPager
119a0 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 73 71  ->pBackup);.  sq
119b0 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72  lite3PcacheClear
119c0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
119d0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
119e0 72 6e 20 74 68 65 20 70 50 61 67 65 72 2d 3e 69  rn the pPager->i
119f0 44 61 74 61 56 65 72 73 69 6f 6e 20 76 61 6c 75  DataVersion valu
11a00 65 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  e.*/.u32 sqlite3
11a10 50 61 67 65 72 44 61 74 61 56 65 72 73 69 6f 6e  PagerDataVersion
11a20 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
11a30 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
11a40 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f  r->eState>PAGER_
11a50 4f 50 45 4e 20 29 3b 0a 20 20 72 65 74 75 72 6e  OPEN );.  return
11a60 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65   pPager->iDataVe
11a70 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rsion;.}../*.** 
11a80 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75  Free all structu
11a90 72 65 73 20 69 6e 20 74 68 65 20 50 61 67 65 72  res in the Pager
11aa0 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72  .aSavepoint[] ar
11ab0 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68  ray and set both
11ac0 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70  .** Pager.aSavep
11ad0 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e  oint and Pager.n
11ae0 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72  Savepoint to zer
11af0 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62  o. Close the sub
11b00 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69  -journal.** if i
11b10 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  t is open and th
11b20 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
11b30 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
11b40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11b50 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
11b60 6f 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61  oints(Pager *pPa
11b70 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20  ger){.  int ii; 
11b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11b90 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f   Iterator for lo
11ba0 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61  oping through Pa
11bb0 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a  ger.aSavepoint *
11bc0 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
11bd0 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
11be0 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
11bf0 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
11c00 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61  troy(pPager->aSa
11c10 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53  vepoint[ii].pInS
11c20 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20  avepoint);.  }. 
11c30 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
11c40 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73  clusiveMode || s
11c50 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49  qlite3JournalIsI
11c60 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e  nMemory(pPager->
11c70 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 73 71 6c  sjfd) ){.    sql
11c80 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
11c90 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20  er->sjfd);.  }. 
11ca0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
11cb0 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
11cc0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61  );.  pPager->aSa
11cd0 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70  vepoint = 0;.  p
11ce0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
11cf0 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
11d00 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a  >nSubRec = 0;.}.
11d10 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
11d20 69 74 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69  it number pgno i
11d30 6e 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  n the PagerSavep
11d40 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
11d50 74 20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66  t .** bitvecs of
11d60 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
11d70 69 6e 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c  ints. Return SQL
11d80 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
11d90 73 66 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  sful.** or SQLIT
11da0 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c  E_NOMEM if a mal
11db0 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
11dc0 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
11dd0 74 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  t addToSavepoint
11de0 42 69 74 76 65 63 73 28 50 61 67 65 72 20 2a 70  Bitvecs(Pager *p
11df0 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
11e00 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  ){.  int ii;    
11e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11e20 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
11e30 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
11e40 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a  ITE_OK;       /*
11e50 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
11e60 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
11e70 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
11e80 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50  nt; ii++){.    P
11e90 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
11ea0 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76   = &pPager->aSav
11eb0 65 70 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20  epoint[ii];.    
11ec0 69 66 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72  if( pgno<=p->nOr
11ed0 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c  ig ){.      rc |
11ee0 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  = sqlite3BitvecS
11ef0 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69  et(p->pInSavepoi
11f00 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  nt, pgno);.     
11f10 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
11f20 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
11f30 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
11f40 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
11f50 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
11f60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
11f70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11f80 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
11f90 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
11fa0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78  e pager is in ex
11fb0 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64  clusive mode and
11fc0 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45   not.** in the E
11fd0 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65  RROR state. Othe
11fe0 72 77 69 73 65 2c 20 69 74 20 73 77 69 74 63 68  rwise, it switch
11ff0 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  es the pager to 
12000 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74  PAGER_OPEN.** st
12010 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ate..**.** If th
12020 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
12030 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
12040 73 73 20 6d 6f 64 65 2c 20 74 68 65 20 64 61 74  ss mode, the dat
12050 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a  abase file is.**
12060 20 63 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f   completely unlo
12070 63 6b 65 64 2e 20 49 66 20 74 68 65 20 66 69 6c  cked. If the fil
12080 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e  e is unlocked an
12090 64 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  d the file-syste
120a0 6d 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78  m does.** not ex
120b0 68 69 62 69 74 20 74 68 65 20 55 4e 44 45 4c 45  hibit the UNDELE
120c0 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20  TABLE_WHEN_OPEN 
120d0 70 72 6f 70 65 72 74 79 2c 20 74 68 65 20 6a 6f  property, the jo
120e0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a  urnal file is.**
120f0 20 63 6c 6f 73 65 64 20 28 69 66 20 69 74 20 69   closed (if it i
12100 73 20 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49  s open)..**.** I
12110 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
12120 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68  n ERROR state wh
12130 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
12140 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
12150 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
12160 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
12170 61 72 65 20 64 69 73 63 61 72 64 65 64 20 62 65  are discarded be
12180 66 6f 72 65 20 73 77 69 74 63 68 69 6e 67 20 62  fore switching b
12190 61 63 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f  ack to .** the O
121a0 50 45 4e 20 73 74 61 74 65 2e 20 52 65 67 61 72  PEN state. Regar
121b0 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
121c0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
121d0 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a   exclusive-mode.
121e0 2a 2a 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a  ** or not, any j
121f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74  ournal file left
12200 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
12210 74 65 6d 20 77 69 6c 6c 20 62 65 20 74 72 65 61  tem will be trea
12220 74 65 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d  ted.** as a hot-
12230 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c  journal and roll
12240 65 64 20 62 61 63 6b 20 74 68 65 20 6e 65 78 74  ed back the next
12250 20 74 69 6d 65 20 61 20 72 65 61 64 2d 74 72 61   time a read-tra
12260 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f  nsaction.** is o
12270 70 65 6e 65 64 20 28 62 79 20 74 68 69 73 20 6f  pened (by this o
12280 72 20 62 79 20 61 6e 79 20 6f 74 68 65 72 20 63  r by any other c
12290 6f 6e 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73  onnection)..*/.s
122a0 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
122b0 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  _unlock(Pager *p
122c0 50 61 67 65 72 29 7b 0a 0a 20 20 61 73 73 65 72  Pager){..  asser
122d0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
122e0 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
122f0 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
12300 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
12310 5f 4f 50 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c  _OPEN .       ||
12320 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
12330 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 0a 20 20  =PAGER_ERROR .  
12340 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74  );..  sqlite3Bit
12350 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
12360 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
12370 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
12380 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c 65  rnal = 0;.  rele
12390 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
123a0 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28  (pPager);..  if(
123b0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
123c0 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65  ger) ){.    asse
123d0 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  rt( !isOpen(pPag
123e0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20  er->jfd) );.    
123f0 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
12400 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
12410 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20  ger->pWal);.    
12420 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
12430 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d   PAGER_OPEN;.  }
12440 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72  else if( !pPager
12450 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
12460 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20  ){.    int rc;  
12470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12480 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
12490 64 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 70  de returned by p
124a0 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a  agerUnlockDb() *
124b0 2f 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20  /.    int iDc = 
124c0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
124d0 64 29 3f 73 71 6c 69 74 65 33 4f 73 44 65 76 69  d)?sqlite3OsDevi
124e0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
124f0 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b  s(pPager->fd):0;
12500 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
12510 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
12520 20 73 75 70 70 6f 72 74 20 64 65 6c 65 74 69 6f   support deletio
12530 6e 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c  n of open files,
12540 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f   then.    ** clo
12550 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
12560 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e  ile when droppin
12570 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  g the database l
12580 6f 63 6b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a  ock.  Otherwise.
12590 20 20 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63      ** another c
125a0 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a  onnection with j
125b0 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65  ournal_mode=dele
125c0 74 65 20 6d 69 67 68 74 20 64 65 6c 65 74 65 20  te might delete 
125d0 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
125e0 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75  out from under u
125f0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  s..    */.    as
12600 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
12610 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
12620 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20    & 5)!=1 );.   
12630 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f   assert( (PAGER_
12640 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
12650 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a       & 5)!=1 );.
12660 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47      assert( (PAG
12670 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
12680 41 4c 20 20 20 20 20 20 26 20 35 29 21 3d 31 20  AL      & 5)!=1 
12690 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
126a0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
126b0 45 5f 44 45 4c 45 54 45 20 20 20 26 20 35 29 21  E_DELETE   & 5)!
126c0 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
126d0 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
126e0 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20  MODE_TRUNCATE & 
126f0 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)==1 );.    ass
12700 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
12710 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
12720 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20   & 5)==1 );.    
12730 69 66 28 20 30 3d 3d 28 69 44 63 20 26 20 53 51  if( 0==(iDc & SQ
12740 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
12750 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
12760 29 0a 20 20 20 20 20 7c 7c 20 31 21 3d 28 70 50  ).     || 1!=(pP
12770 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
12780 65 20 26 20 35 29 0a 20 20 20 20 29 7b 0a 20 20  e & 5).    ){.  
12790 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
127a0 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
127b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
127c0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
127d0 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  n the ERROR stat
127e0 65 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 20 74  e and the call t
127f0 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
12800 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
12810 65 20 66 61 69 6c 73 2c 20 73 65 74 20 74 68 65  e fails, set the
12820 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f   current lock to
12830 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53   UNKNOWN_LOCK. S
12840 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20  ee the comment. 
12850 20 20 20 2a 2a 20 61 62 6f 76 65 20 74 68 65 20     ** above the 
12860 23 64 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e  #define for UNKN
12870 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20  OWN_LOCK for an 
12880 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77  explanation of w
12890 68 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  hy this.    ** i
128a0 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20  s necessary..   
128b0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
128c0 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
128d0 72 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  r, NO_LOCK);.   
128e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
128f0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  OK && pPager->eS
12900 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
12910 52 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  R ){.      pPage
12920 72 2d 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f  r->eLock = UNKNO
12930 57 4e 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a  WN_LOCK;.    }..
12940 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
12950 20 73 74 61 74 65 20 6d 61 79 20 62 65 20 63 68   state may be ch
12960 61 6e 67 65 64 20 66 72 6f 6d 20 50 41 47 45 52  anged from PAGER
12970 5f 45 52 52 4f 52 20 74 6f 20 50 41 47 45 52 5f  _ERROR to PAGER_
12980 4f 50 45 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a  OPEN here.    **
12990 20 77 69 74 68 6f 75 74 20 63 6c 65 61 72 69 6e   without clearin
129a0 67 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  g the error code
129b0 2e 20 54 68 69 73 20 69 73 20 69 6e 74 65 6e 74  . This is intent
129c0 69 6f 6e 61 6c 20 2d 20 74 68 65 20 65 72 72 6f  ional - the erro
129d0 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73  r.    ** code is
129e0 20 63 6c 65 61 72 65 64 20 61 6e 64 20 74 68 65   cleared and the
129f0 20 63 61 63 68 65 20 72 65 73 65 74 20 69 6e 20   cache reset in 
12a00 74 68 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e  the block below.
12a10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
12a20 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
12a30 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ode || pPager->e
12a40 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52  State!=PAGER_ERR
12a50 4f 52 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  OR );.    pPager
12a60 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
12a70 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
12a80 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
12a90 52 5f 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f  R_OPEN;.  }..  /
12aa0 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f  * If Pager.errCo
12ab0 64 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63  de is set, the c
12ac0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
12ad0 61 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f  ager cache canno
12ae0 74 20 62 65 0a 20 20 2a 2a 20 74 72 75 73 74 65  t be.  ** truste
12af0 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 72  d. Now that ther
12b00 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
12b10 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
12b20 74 6f 20 74 68 65 20 70 61 67 65 72 2c 0a 20 20  to the pager,.  
12b30 2a 2a 20 69 74 20 63 61 6e 20 73 61 66 65 6c 79  ** it can safely
12b40 20 6d 6f 76 65 20 62 61 63 6b 20 74 6f 20 50 41   move back to PA
12b50 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20  GER_OPEN state. 
12b60 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20  This happens in 
12b70 62 6f 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c  both.  ** normal
12b80 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 2d 6c   and exclusive-l
12b90 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a  ocking mode..  *
12ba0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
12bb0 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
12bc0 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42  ITE_OK || !MEMDB
12bd0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
12be0 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
12bf0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
12c00 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pFile==0 ){.    
12c10 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
12c20 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61  ager);.      pPa
12c30 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
12c40 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Done = 0;.      
12c50 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
12c60 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20   PAGER_OPEN;.   
12c70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
12c80 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 28  ager->eState = (
12c90 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
12ca0 66 64 29 20 3f 20 50 41 47 45 52 5f 4f 50 45 4e  fd) ? PAGER_OPEN
12cb0 20 3a 20 50 41 47 45 52 5f 52 45 41 44 45 52 29   : PAGER_READER)
12cc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
12cd0 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29  USEFETCH(pPager)
12ce0 20 29 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65   ) sqlite3OsUnfe
12cf0 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  tch(pPager->fd, 
12d00 30 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 67 65  0, 0);.    pPage
12d10 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c  r->errCode = SQL
12d20 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 73 65 74 47  ITE_OK;.    setG
12d30 65 74 74 65 72 4d 65 74 68 6f 64 28 70 50 61 67  etterMethod(pPag
12d40 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67  er);.  }..  pPag
12d50 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
12d60 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   0;.  pPager->jo
12d70 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20  urnalHdr = 0;.  
12d80 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
12d90 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r = 0;.}../*.** 
12da0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
12db0 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72   called whenever
12dc0 20 61 6e 20 49 4f 45 52 52 20 6f 72 20 46 55 4c   an IOERR or FUL
12dd0 4c 20 65 72 72 6f 72 20 74 68 61 74 20 72 65 71  L error that req
12de0 75 69 72 65 73 0a 2a 2a 20 74 68 65 20 70 61 67  uires.** the pag
12df0 65 72 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e  er to transition
12e00 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20   into the ERROR 
12e10 73 74 61 74 65 20 6d 61 79 20 61 68 76 65 20 6f  state may ahve o
12e20 63 63 75 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20  ccurred..** The 
12e30 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
12e40 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
12e50 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75  he pager structu
12e60 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 0a  re, the second .
12e70 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64  ** the error-cod
12e80 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65  e about to be re
12e90 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65  turned by a page
12ea0 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20  r API function. 
12eb0 54 68 65 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65  The .** value re
12ec0 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79  turned is a copy
12ed0 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   of the second a
12ee0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
12ef0 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  function. .**.**
12f00 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
12f10 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54  rgument is SQLIT
12f20 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49  E_FULL, SQLITE_I
12f30 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74  OERR or one of t
12f40 68 65 0a 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d  he.** IOERR sub-
12f50 63 6f 64 65 73 2c 20 74 68 65 20 70 61 67 65 72  codes, the pager
12f60 20 65 6e 74 65 72 73 20 74 68 65 20 45 52 52 4f   enters the ERRO
12f70 52 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20  R state and the 
12f80 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73  error code.** is
12f90 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72   stored in Pager
12fa0 2e 65 72 72 43 6f 64 65 2e 20 57 68 69 6c 65 20  .errCode. While 
12fb0 74 68 65 20 70 61 67 65 72 20 72 65 6d 61 69 6e  the pager remain
12fc0 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73  s in the ERROR s
12fd0 74 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a  tate,.** all maj
12fe0 6f 72 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20  or API calls on 
12ff0 74 68 65 20 50 61 67 65 72 20 77 69 6c 6c 20 69  the Pager will i
13000 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72  mmediately retur
13010 6e 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e  n Pager.errCode.
13020 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52  .**.** The ERROR
13030 20 73 74 61 74 65 20 69 6e 64 69 63 61 74 65 73   state indicates
13040 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
13050 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
13060 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74  cache .** cannot
13070 20 62 65 20 74 72 75 73 74 65 64 2e 20 54 68 69   be trusted. Thi
13080 73 20 73 74 61 74 65 20 63 61 6e 20 62 65 20 63  s state can be c
13090 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65  leared by comple
130a0 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20  tely discarding 
130b0 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  .** the contents
130c0 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
130d0 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61  che. If a transa
130e0 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65  ction was active
130f0 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72   when.** the per
13100 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63  sistent error oc
13110 63 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65  curred, then the
13120 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
13130 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f  l may need.** to
13140 20 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20   be replayed to 
13150 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74  restore the cont
13160 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61  ents of the data
13170 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 69 66  base file (as if
13180 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f  .** it were a ho
13190 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73  t-journal)..*/.s
131a0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
131b0 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61  error(Pager *pPa
131c0 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20  ger, int rc){.  
131d0 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30  int rc2 = rc & 0
131e0 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72  xff;.  assert( r
131f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
13200 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
13210 72 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65  rt(.       pPage
13220 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
13230 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20  TE_FULL ||.     
13240 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
13250 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a  e==SQLITE_OK ||.
13260 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
13270 65 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d  errCode & 0xff)=
13280 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
13290 29 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51  );.  if( rc2==SQ
132a0 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32  LITE_FULL || rc2
132b0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  ==SQLITE_IOERR )
132c0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
132d0 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20  rCode = rc;.    
132e0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
132f0 20 50 41 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20   PAGER_ERROR;.  
13300 20 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f    setGetterMetho
13310 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  d(pPager);.  }. 
13320 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73   return rc;.}..s
13330 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
13340 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
13350 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
13360 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ge);../*.** The 
13370 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
13380 6e 20 6f 70 65 6e 20 6f 6e 20 70 50 61 67 65 72  n open on pPager
13390 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74   is being commit
133a0 74 65 64 20 28 62 43 6f 6d 6d 69 74 3d 3d 31 29  ted (bCommit==1)
133b0 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  .** or rolled ba
133c0 63 6b 20 28 62 43 6f 6d 6d 69 74 3d 3d 30 29 2e  ck (bCommit==0).
133d0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  .**.** Return TR
133e0 55 45 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69  UE if and only i
133f0 66 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  f all dirty page
13400 73 20 73 68 6f 75 6c 64 20 62 65 20 66 6c 75 73  s should be flus
13410 68 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  hed to disk..**.
13420 2a 2a 20 52 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  ** Rules:.**.** 
13430 20 20 2a 20 20 46 6f 72 20 6e 6f 6e 2d 54 45 4d    *  For non-TEM
13440 50 20 64 61 74 61 62 61 73 65 73 2c 20 61 6c 77  P databases, alw
13450 61 79 73 20 73 79 6e 63 20 74 6f 20 64 69 73 6b  ays sync to disk
13460 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
13470 73 61 72 79 0a 2a 2a 20 20 20 20 20 20 66 6f 72  sary.**      for
13480 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 74 6f   transactions to
13490 20 62 65 20 64 75 72 61 62 6c 65 2e 0a 2a 2a 0a   be durable..**.
134a0 2a 2a 20 20 20 2a 20 20 53 79 6e 63 20 54 45 4d  **   *  Sync TEM
134b0 50 20 64 61 74 61 62 61 73 65 20 6f 6e 6c 79 20  P database only 
134c0 6f 6e 20 61 20 43 4f 4d 4d 49 54 20 28 6e 6f 74  on a COMMIT (not
134d0 20 61 20 52 4f 4c 4c 42 41 43 4b 29 20 77 68 65   a ROLLBACK) whe
134e0 6e 20 74 68 65 20 62 61 63 6b 69 6e 67 0a 2a 2a  n the backing.**
134f0 20 20 20 20 20 20 66 69 6c 65 20 68 61 73 20 62        file has b
13500 65 65 6e 20 63 72 65 61 74 65 64 20 61 6c 72 65  een created alre
13510 61 64 79 20 28 76 69 61 20 61 20 73 70 69 6c 6c  ady (via a spill
13520 20 6f 6e 20 70 61 67 65 72 53 74 72 65 73 73 28   on pagerStress(
13530 29 29 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 77  )) and.**      w
13540 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
13550 66 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e  f dirty pages in
13560 20 6d 65 6d 6f 72 79 20 65 78 63 65 65 64 73 20   memory exceeds 
13570 32 35 25 20 6f 66 20 74 68 65 20 74 6f 74 61 6c  25% of the total
13580 0a 2a 2a 20 20 20 20 20 20 63 61 63 68 65 20 73  .**      cache s
13590 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
135a0 6e 74 20 70 61 67 65 72 46 6c 75 73 68 4f 6e 43  nt pagerFlushOnC
135b0 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61  ommit(Pager *pPa
135c0 67 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74  ger, int bCommit
135d0 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
135e0 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 20 72  >tempFile==0 ) r
135f0 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 21  eturn 1;.  if( !
13600 62 43 6f 6d 6d 69 74 20 29 20 72 65 74 75 72 6e  bCommit ) return
13610 20 30 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65   0;.  if( !isOpe
13620 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 20  n(pPager->fd) ) 
13630 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
13640 72 6e 20 28 73 71 6c 69 74 65 33 50 43 61 63 68  rn (sqlite3PCach
13650 65 50 65 72 63 65 6e 74 44 69 72 74 79 28 70 50  ePercentDirty(pP
13660 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 3d  ager->pPCache)>=
13670 32 35 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  25);.}../*.** Th
13680 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20  is routine ends 
13690 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  a transaction. A
136a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
136b0 75 73 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79  usually ended by
136c0 20 0a 2a 2a 20 65 69 74 68 65 72 20 61 20 43 4f   .** either a CO
136d0 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41  MMIT or a ROLLBA
136e0 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68  CK operation. Th
136f0 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 62  is routine may b
13700 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74  e called .** aft
13710 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61  er rollback of a
13720 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72   hot-journal, or
13730 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
13740 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e  urs while openin
13750 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g.** the journal
13760 20 66 69 6c 65 20 6f 72 20 77 72 69 74 69 6e 67   file or writing
13770 20 74 68 65 20 76 65 72 79 20 66 69 72 73 74 20   the very first 
13780 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f  journal-header o
13790 66 20 61 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  f a.** database 
137a0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
137b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
137c0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
137d0 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20   in PAGER_ERROR 
137e0 73 74 61 74 65 2e 20 49 66 20 69 74 20 69 73 20  state. If it is 
137f0 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47  called.** in PAG
13800 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52  ER_NONE or PAGER
13810 5f 53 48 41 52 45 44 20 73 74 61 74 65 20 61 6e  _SHARED state an
13820 64 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20  d the lock held 
13830 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75  is less.** exclu
13840 73 69 76 65 20 74 68 61 6e 20 61 20 52 45 53 45  sive than a RESE
13850 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73  RVED lock, it is
13860 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
13870 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61  Otherwise, any a
13880 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
13890 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a   are released..*
138a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
138b0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
138c0 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22 66 69  , then it is "fi
138d0 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61  nalized". Once a
138e0 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c   journal .** fil
138f0 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c  e has been final
13900 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70  ized it is not p
13910 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69  ossible to use i
13920 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61  t to roll back a
13930 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
13940 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65  . Nor will it be
13950 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
13960 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  e a hot-journal 
13970 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e  by this.** or an
13980 79 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  y other database
13990 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61   connection. Exa
139a0 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e  ctly how a journ
139b0 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a  al is finalized.
139c0 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68  ** depends on wh
139d0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
139e0 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
139f0 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
13a00 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63  ode and.** the c
13a10 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d  urrent journal-m
13a20 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e  ode (Pager.journ
13a30 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61  alMode value), a
13a40 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
13a50 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
13a60 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f  MEMORY.**     Jo
13a70 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
13a80 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20  iptor is simply 
13a90 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73  closed. This des
13aa0 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20  troys an .**    
13ab0 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
13ac0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  al..**.**   jour
13ad0 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54  nalMode==TRUNCAT
13ae0 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c  E.**     Journal
13af0 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
13b00 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  ed to zero bytes
13b10 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20   in size..**.** 
13b20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
13b30 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68  ERSIST.**     Th
13b40 65 20 66 69 72 73 74 20 32 38 20 62 79 74 65 73  e first 28 bytes
13b50 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
13b60 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e  file are zeroed.
13b70 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65   This invalidate
13b80 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72  s.**     the fir
13b90 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
13ba0 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61  r in the file, a
13bb0 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74  nd hence the ent
13bc0 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ire journal.**  
13bd0 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61     file. An inva
13be0 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  lid journal file
13bf0 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65   cannot be rolle
13c00 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
13c10 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c  journalMode==DEL
13c20 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a  ETE.**     The j
13c30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63  ournal file is c
13c40 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65  losed and delete
13c50 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  d using sqlite3O
13c60 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a  sDelete()..**.**
13c70 20 20 20 20 20 49 66 20 74 68 65 20 70 61 67 65       If the page
13c80 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20  r is running in 
13c90 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
13ca0 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66  this method of f
13cb0 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20  inalizing.**    
13cc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
13cd0 65 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e  e is never used.
13ce0 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65   Instead, if the
13cf0 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a   journalMode is.
13d00 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e  **     DELETE an
13d10 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  d the pager is i
13d20 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
13d30 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73  , the method des
13d40 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20  cribed under.** 
13d50 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d      journalMode=
13d60 3d 50 45 52 53 49 53 54 20 69 73 20 75 73 65 64  =PERSIST is used
13d70 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
13d80 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  After the journa
13d90 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20  l is finalized, 
13da0 74 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20  the pager moves 
13db0 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45 52 20  to PAGER_READER 
13dc0 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e  state..** If run
13dd0 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c  ning in non-excl
13de0 75 73 69 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d  usive rollback m
13df0 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e  ode, the lock on
13e00 20 74 68 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a   the file is .**
13e10 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61   downgraded to a
13e20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
13e30 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
13e40 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20   returned if no 
13e50 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66  error occurs. If
13e60 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
13e70 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f   during.** any o
13e80 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69  f the IO operati
13e90 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  ons to finalize 
13ea0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13eb0 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a   or unlock the.*
13ec0 2a 20 64 61 74 61 62 61 73 65 20 74 68 65 6e 20  * database then 
13ed0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
13ee0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
13ef0 20 74 68 65 20 75 73 65 72 2e 20 49 66 20 74 68   the user. If th
13f00 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  e .** operation 
13f10 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  to finalize the 
13f20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69  journal file fai
13f30 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64  ls, then the cod
13f40 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73  e still.** tries
13f50 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64   to unlock the d
13f60 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
13f70 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
13f80 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a   mode. If the.**
13f90 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f   unlock operatio
13fa0 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c  n fails as well,
13fb0 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
13fc0 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74  error code relat
13fd0 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72  ed.** to the fir
13fe0 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74  st error encount
13ff0 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61  ered (the journa
14000 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f  l finalization o
14010 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ne) is.** return
14020 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
14030 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  t pager_end_tran
14040 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70  saction(Pager *p
14050 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61  Pager, int hasMa
14060 73 74 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69  ster, int bCommi
14070 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
14080 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
14090 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  * Error code fro
140a0 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69  m journal finali
140b0 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e  zation operation
140c0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d 20   */.  int rc2 = 
140d0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f  SQLITE_OK;     /
140e0 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  * Error code fro
140f0 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b  m db file unlock
14100 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20   operation */.. 
14110 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69   /* Do nothing i
14120 66 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73  f the pager does
14130 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 6f 70 65   not have an ope
14140 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
14150 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c  ion.  ** or at l
14160 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20  east a RESERVED 
14170 6c 6f 63 6b 2e 20 54 68 69 73 20 66 75 6e 63 74  lock. This funct
14180 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
14190 64 20 77 68 65 6e 20 74 68 65 72 65 0a 20 20 2a  d when there.  *
141a0 2a 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72  * is no write-tr
141b0 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65  ansaction active
141c0 20 62 75 74 20 61 20 52 45 53 45 52 56 45 44 20   but a RESERVED 
141d0 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
141e0 69 73 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64  is.  ** held und
141f0 65 72 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61  er two circumsta
14200 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  nces:.  **.  ** 
14210 20 20 31 2e 20 41 66 74 65 72 20 61 20 73 75 63    1. After a suc
14220 63 65 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72  cessful hot-jour
14230 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74  nal rollback, it
14240 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 0a   is called with.
14250 20 20 2a 2a 20 20 20 20 20 20 65 53 74 61 74 65    **      eState
14260 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64  ==PAGER_NONE and
14270 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56   eLock==EXCLUSIV
14280 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a  E_LOCK..  **.  *
14290 2a 20 20 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e  *   2. If a conn
142a0 65 63 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b  ection with lock
142b0 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
142c0 76 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58  ve holding an EX
142d0 43 4c 55 53 49 56 45 20 0a 20 20 2a 2a 20 20 20  CLUSIVE .  **   
142e0 20 20 20 6c 6f 63 6b 20 73 77 69 74 63 68 65 73     lock switches
142f0 20 62 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67   back to locking
14300 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64  _mode=normal and
14310 20 74 68 65 6e 20 65 78 65 63 75 74 65 73 20 61   then executes a
14320 0a 20 20 2a 2a 20 20 20 20 20 20 72 65 61 64 2d  .  **      read-
14330 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69  transaction, thi
14340 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
14350 6c 6c 65 64 20 77 69 74 68 20 65 53 74 61 74 65  lled with eState
14360 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a  ==PAGER_READER .
14370 20 20 2a 2a 20 20 20 20 20 20 61 6e 64 20 65 4c    **      and eL
14380 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
14390 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 72 65 61  OCK when the rea
143a0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
143b0 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20   closed..  */.  
143c0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
143d0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
143e0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
143f0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
14400 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
14410 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74   if( pPager->eSt
14420 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54 45 52  ate<PAGER_WRITER
14430 5f 4c 4f 43 4b 45 44 20 26 26 20 70 50 61 67 65  _LOCKED && pPage
14440 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45  r->eLock<RESERVE
14450 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
14460 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14470 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c    }..  releaseAl
14480 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67  lSavepoints(pPag
14490 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  er);.  assert( i
144a0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
144b0 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49  d) || pPager->pI
144c0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 0a 20 20 20  nJournal==0 .   
144d0 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73     || (sqlite3Os
144e0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
144f0 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
14500 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42  )&SQLITE_IOCAP_B
14510 41 54 43 48 5f 41 54 4f 4d 49 43 29 0a 20 20 29  ATCH_ATOMIC).  )
14520 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  ;.  if( isOpen(p
14530 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
14540 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65     assert( !page
14550 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
14560 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c  );..    /* Final
14570 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
14580 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  file. */.    if(
14590 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49   sqlite3JournalI
145a0 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72  sInMemory(pPager
145b0 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
145c0 2f 2a 20 61 73 73 65 72 74 28 20 70 50 61 67 65  /* assert( pPage
145d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
145e0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
145f0 45 5f 4d 45 4d 4f 52 59 20 29 3b 20 2a 2f 0a 20  E_MEMORY ); */. 
14600 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
14610 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
14620 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
14630 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
14640 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
14650 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
14660 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ){.      if( pPa
14670 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
14680 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
14690 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
146a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
146b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
146c0 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
146d0 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20  ->jfd, 0);.     
146e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
146f0 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
14700 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
14710 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
14720 72 65 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20  re the new file 
14730 73 69 7a 65 20 69 73 20 77 72 69 74 74 65 6e 20  size is written 
14740 69 6e 74 6f 20 74 68 65 20 69 6e 6f 64 65 20 72  into the inode r
14750 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 20  ight away..     
14760 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73       ** Otherwis
14770 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69  e the journal mi
14780 67 68 74 20 72 65 73 75 72 72 65 63 74 20 66 6f  ght resurrect fo
14790 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20  llowing a power 
147a0 6c 6f 73 73 20 61 6e 64 0a 20 20 20 20 20 20 20  loss and.       
147b0 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68 65 20     ** cause the 
147c0 6c 61 73 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  last transaction
147d0 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20   to roll back.  
147e0 53 65 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  See.          **
147f0 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c   https://bugzill
14800 61 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72 67 2f 73 68  a.mozilla.org/sh
14810 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 31 30  ow_bug.cgi?id=10
14820 37 32 37 37 33 0a 20 20 20 20 20 20 20 20 20 20  72773.          
14830 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
14840 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
14850 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
14860 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b  ger->syncFlags);
14870 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14880 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
14890 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
148a0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
148b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
148c0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
148d0 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20  LMODE_PERSIST.  
148e0 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
148f0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
14900 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14910 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
14920 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20  NALMODE_WAL).   
14930 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a   ){.      rc = z
14940 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eroJournalHdr(pP
14950 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 7c  ager, hasMaster|
14960 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  |pPager->tempFil
14970 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  e);.      pPager
14980 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
14990 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
149a0 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
149b0 68 20 6d 61 79 20 62 65 20 65 78 65 63 75 74 65  h may be execute
149c0 64 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f 75  d with Pager.jou
149d0 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59  rnalMode==MEMORY
149e0 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20 68   if.      ** a h
149f0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a  ot-journal was j
14a00 75 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  ust rolled back.
14a10 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
14a20 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  e journal.      
14a30 2a 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  ** file should b
14a40 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c  e closed and del
14a50 65 74 65 64 2e 20 49 66 20 74 68 69 73 20 63 6f  eted. If this co
14a60 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20  nnection writes 
14a70 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  to.      ** the 
14a80 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
14a90 74 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69  t will do so usi
14aa0 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ng an in-memory 
14ab0 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20 20 2a  journal..      *
14ac0 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 44 65 6c  /.      int bDel
14ad0 65 74 65 20 3d 20 21 70 50 61 67 65 72 2d 3e 74  ete = !pPager->t
14ae0 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 20 20 61  empFile;.      a
14af0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4a 6f  ssert( sqlite3Jo
14b00 75 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28  urnalIsInMemory(
14b10 70 50 61 67 65 72 2d 3e 6a 66 64 29 3d 3d 30 20  pPager->jfd)==0 
14b20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
14b30 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14b40 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
14b50 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a  NALMODE_DELETE .
14b60 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
14b70 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
14b80 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
14b90 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20  MODE_MEMORY .   
14ba0 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65          || pPage
14bb0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
14bc0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
14bd0 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a  E_WAL .      );.
14be0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
14bf0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
14c00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 65  );.      if( bDe
14c10 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lete ){.        
14c20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
14c30 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66  lete(pPager->pVf
14c40 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
14c50 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 65 78 74  nal, pPager->ext
14c60 72 61 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d  raSync);.      }
14c70 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
14c80 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
14c90 50 41 47 45 53 0a 20 20 73 71 6c 69 74 65 33 50  PAGES.  sqlite3P
14ca0 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74  cacheIterateDirt
14cb0 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  y(pPager->pPCach
14cc0 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67  e, pager_set_pag
14cd0 65 68 61 73 68 29 3b 0a 20 20 69 66 28 20 70 50  ehash);.  if( pP
14ce0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20  ager->dbSize==0 
14cf0 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  && sqlite3Pcache
14d00 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
14d10 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20  >pPCache)>0 ){. 
14d20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 73 71     PgHdr *p = sq
14d30 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
14d40 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
14d50 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
14d60 70 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 30 3b  p->pageHash = 0;
14d70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
14d80 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
14d90 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  p);.    }.  }.#e
14da0 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 42  ndif..  sqlite3B
14db0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
14dc0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
14dd0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ;.  pPager->pInJ
14de0 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50  ournal = 0;.  pP
14df0 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
14e00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14e10 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 4d  _OK ){.    if( M
14e20 45 4d 44 42 20 7c 7c 20 70 61 67 65 72 46 6c 75  EMDB || pagerFlu
14e30 73 68 4f 6e 43 6f 6d 6d 69 74 28 70 50 61 67 65  shOnCommit(pPage
14e40 72 2c 20 62 43 6f 6d 6d 69 74 29 20 29 7b 0a 20  r, bCommit) ){. 
14e50 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
14e60 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65  heCleanAll(pPage
14e70 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20  r->pPCache);.   
14e80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
14e90 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72  lite3PcacheClear
14ea0 57 72 69 74 61 62 6c 65 28 70 50 61 67 65 72 2d  Writable(pPager-
14eb0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 7d  >pPCache);.    }
14ec0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
14ed0 68 65 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  heTruncate(pPage
14ee0 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67  r->pPCache, pPag
14ef0 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d  er->dbSize);.  }
14f00 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  ..  if( pagerUse
14f10 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
14f20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 57     /* Drop the W
14f30 41 4c 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 69  AL write-lock, i
14f40 66 20 61 6e 79 2e 20 41 6c 73 6f 2c 20 69 66 20  f any. Also, if 
14f50 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
14f60 61 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 6c 6f  as in .    ** lo
14f70 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
14f80 73 69 76 65 20 6d 6f 64 65 20 62 75 74 20 69 73  sive mode but is
14f90 20 6e 6f 20 6c 6f 6e 67 65 72 2c 20 64 72 6f 70   no longer, drop
14fa0 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 0a   the EXCLUSIVE .
14fb0 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 68 65 6c 64      ** lock held
14fc0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
14fd0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
14fe0 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57    rc2 = sqlite3W
14ff0 61 6c 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61  alEndWriteTransa
15000 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
15010 61 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  al);.    assert(
15020 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2==SQLITE_OK 
15030 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72  );.  }else if( r
15040 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
15050 62 43 6f 6d 6d 69 74 20 26 26 20 70 50 61 67 65  bCommit && pPage
15060 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 70 50  r->dbFileSize>pP
15070 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
15080 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
15090 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e  ch is taken when
150a0 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
150b0 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 72 6f 6c  ansaction in rol
150c0 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 0a 20 20  lback-journal.  
150d0 20 20 2a 2a 20 6d 6f 64 65 20 69 66 20 74 68 65    ** mode if the
150e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
150f0 6e 20 64 69 73 6b 20 69 73 20 6c 61 72 67 65 72  n disk is larger
15100 20 74 68 61 6e 20 74 68 65 20 64 61 74 61 62 61   than the databa
15110 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a  se image..    **
15120 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
15130 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62  he journal has b
15140 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e  een finalized an
15150 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  d the transactio
15160 6e 20 0a 20 20 20 20 2a 2a 20 73 75 63 63 65 73  n .    ** succes
15170 73 66 75 6c 6c 79 20 63 6f 6d 6d 69 74 74 65 64  sfully committed
15180 2c 20 62 75 74 20 74 68 65 20 45 58 43 4c 55 53  , but the EXCLUS
15190 49 56 45 20 6c 6f 63 6b 20 69 73 20 73 74 69 6c  IVE lock is stil
151a0 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20  l held on the.  
151b0 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 69 74    ** file. So it
151c0 20 69 73 20 73 61 66 65 20 74 6f 20 74 72 75 6e   is safe to trun
151d0 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  cate the databas
151e0 65 20 66 69 6c 65 20 74 6f 20 69 74 73 20 6d 69  e file to its mi
151f0 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 72 65 71  nimum.    ** req
15200 75 69 72 65 64 20 73 69 7a 65 2e 20 20 2a 2f 0a  uired size.  */.
15210 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
15220 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  er->eLock==EXCLU
15230 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
15240 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
15250 63 61 74 65 28 70 50 61 67 65 72 2c 20 70 50 61  cate(pPager, pPa
15260 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
15270 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
15280 49 54 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69  ITE_OK && bCommi
15290 74 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  t && isOpen(pPag
152a0 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 72  er->fd) ){.    r
152b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
152c0 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d  eControl(pPager-
152d0 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  >fd, SQLITE_FCNT
152e0 4c 5f 43 4f 4d 4d 49 54 5f 50 48 41 53 45 54 57  L_COMMIT_PHASETW
152f0 4f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  O, 0);.    if( r
15300 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  c==SQLITE_NOTFOU
15310 4e 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  ND ) rc = SQLITE
15320 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  _OK;.  }..  if( 
15330 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
15340 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 28 21  veMode .   && (!
15350 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
15360 65 72 29 20 7c 7c 20 73 71 6c 69 74 65 33 57 61  er) || sqlite3Wa
15370 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70  lExclusiveMode(p
15380 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29  Pager->pWal, 0))
15390 0a 20 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20  .  ){.    rc2 = 
153a0 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50  pagerUnlockDb(pP
153b0 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
153c0 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  K);.    pPager->
153d0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
153e0 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 0;.  }.  pPage
153f0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
15400 52 5f 52 45 41 44 45 52 3b 0a 20 20 70 50 61 67  R_READER;.  pPag
15410 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
15420 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63  0;..  return (rc
15430 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a  ==SQLITE_OK?rc2:
15440 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  rc);.}../*.** Ex
15450 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b  ecute a rollback
15460 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
15470 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20  n is active and 
15480 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64  unlock the .** d
15490 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a  atabase file. .*
154a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
154b0 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e  r has already en
154c0 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20  tered the ERROR 
154d0 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74  state, do not at
154e0 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f  tempt .** the ro
154f0 6c 6c 62 61 63 6b 20 61 74 20 74 68 69 73 20 74  llback at this t
15500 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61  ime. Instead, pa
15510 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20  ger_unlock() is 
15520 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63  called. The.** c
15530 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c  all to pager_unl
15540 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61  ock() will disca
15550 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79  rd all in-memory
15560 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a   pages, unlock.*
15570 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
15580 69 6c 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65  ile and move the
15590 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 4f   pager back to O
155a0 50 45 4e 20 73 74 61 74 65 2e 20 49 66 20 74 68  PEN state. If th
155b0 69 73 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61  is .** means tha
155c0 74 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  t there is a hot
155d0 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e  -journal left in
155e0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
155f0 2c 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63  , the next .** c
15600 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74  onnection to obt
15610 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ain a shared loc
15620 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28  k on the pager (
15630 77 68 69 63 68 20 6d 61 79 20 62 65 20 74 68 69  which may be thi
15640 73 20 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20  s one) .** will 
15650 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a  roll it back..**
15660 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
15670 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
15680 20 65 6e 74 65 72 65 64 20 74 68 65 20 45 52 52   entered the ERR
15690 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e  OR state, but an
156a0 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63   IO or.** malloc
156b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
156c0 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  ring a rollback,
156d0 20 74 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20   then this will 
156e0 69 74 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a  itself cause .**
156f0 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e   the pager to en
15700 74 65 72 20 74 68 65 20 45 52 52 4f 52 20 73 74  ter the ERROR st
15710 61 74 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20  ate. Which will 
15720 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 74 68  be cleared by th
15730 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67  e.** call to pag
15740 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20  er_unlock(), as 
15750 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e  described above.
15760 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
15770 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
15780 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
15790 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
157a0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
157b0 45 52 5f 45 52 52 4f 52 20 26 26 20 70 50 61 67  ER_ERROR && pPag
157c0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
157d0 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61 73  R_OPEN ){.    as
157e0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
157f0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
15800 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
15810 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
15820 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
15830 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15840 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
15850 63 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  c();.      sqlit
15860 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
15870 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73  pPager);.      s
15880 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
15890 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c  alloc();.    }el
158a0 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  se if( !pPager->
158b0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
158c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
158d0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
158e0 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
158f0 20 20 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74       pager_end_t
15900 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
15910 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  r, 0, 0);.    }.
15920 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f    }.  pager_unlo
15930 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  ck(pPager);.}../
15940 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61  *.** Parameter a
15950 44 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20  Data must point 
15960 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70  to a buffer of p
15970 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
15980 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
15990 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  . Compute and re
159a0 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
159b0 62 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f  based ont the co
159c0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a  ntents of the .*
159d0 2a 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61  * page of data a
159e0 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  nd the current v
159f0 61 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  alue of pPager->
15a00 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a  cksumInit..**.**
15a10 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
15a20 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74  eal checksum. It
15a30 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20   is really just 
15a40 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a  the sum of the .
15a50 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  ** random initia
15a60 6c 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d  l value (pPager-
15a70 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20  >cksumInit) and 
15a80 65 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65  every 200th byte
15a90 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
15aa0 64 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77  data, starting w
15ab0 69 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20  ith byte offset 
15ac0 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
15ad0 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20  e%200)..** Each 
15ae0 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
15af0 74 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20  ted as an 8-bit 
15b00 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
15b10 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67  ..**.** Changing
15b20 20 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65   the formula use
15b30 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69  d to compute thi
15b40 73 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c  s checksum resul
15b50 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f  ts in an.** inco
15b60 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c  mpatible journal
15b70 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a   file format..**
15b80 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63  .** If journal c
15b90 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73  orruption occurs
15ba0 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20   due to a power 
15bb0 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73  failure, the mos
15bc0 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65  t likely .** sce
15bd0 6e 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e  nario is that on
15be0 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68  e end or the oth
15bf0 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  er of the record
15c00 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
15c10 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68  . .** It is much
15c20 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61   less likely tha
15c30 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f  t the two ends o
15c40 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  f the journal re
15c50 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  cord will be.** 
15c60 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20  correct and the 
15c70 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70  middle be corrup
15c80 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22  t.  Thus, this "
15c90 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65  checksum" scheme
15ca0 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74  ,.** though fast
15cb0 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74   and simple, cat
15cc0 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20  ches the mostly 
15cd0 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63  likely kind of c
15ce0 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  orruption..*/.st
15cf0 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
15d00 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
15d10 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44  er, const u8 *aD
15d20 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
15d30 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
15d40 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f  mInit;         /
15d50 2a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  * Checksum value
15d60 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
15d70 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e  int i = pPager->
15d80 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20  pageSize-200;   
15d90 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
15da0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c  ounter */.  whil
15db0 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b  e( i>0 ){.    ck
15dc0 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b  sum += aData[i];
15dd0 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20  .    i -= 200;. 
15de0 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75   }.  return cksu
15df0 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f  m;.}../*.** Repo
15e00 72 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  rt the current p
15e10 61 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d  age size and num
15e20 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
15e30 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f  bytes back.** to
15e40 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23   the codec..*/.#
15e50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
15e60 5f 43 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f  _CODEC.static vo
15e70 69 64 20 70 61 67 65 72 52 65 70 6f 72 74 53 69  id pagerReportSi
15e80 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
15e90 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
15ea0 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20  >xCodecSizeChng 
15eb0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78  ){.    pPager->x
15ec0 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50  CodecSizeChng(pP
15ed0 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50  ager->pCodec, pP
15ee0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a  ager->pageSize,.
15ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f00 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
15f10 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
15f20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
15f30 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 65 70   define pagerRep
15f40 6f 72 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f  ortSize(X)     /
15f50 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f  * No-op if we do
15f60 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63   not support a c
15f70 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  odec */.#endif..
15f80 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
15f90 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 4d 61  S_CODEC./*.** Ma
15fa0 6b 65 20 73 75 72 65 20 74 68 65 20 6e 75 6d 62  ke sure the numb
15fb0 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
15fc0 69 74 73 20 69 73 20 74 68 65 20 73 61 6d 65 20  its is the same 
15fd0 69 6e 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  in the destinati
15fe0 6f 6e 0a 2a 2a 20 70 61 67 65 72 20 61 73 20 69  on.** pager as i
15ff0 74 20 69 73 20 69 6e 20 74 68 65 20 73 6f 75 72  t is in the sour
16000 63 65 2e 20 20 54 68 69 73 20 63 6f 6d 65 73 20  ce.  This comes 
16010 75 70 20 77 68 65 6e 20 61 20 56 41 43 55 55 4d  up when a VACUUM
16020 20 63 68 61 6e 67 65 73 20 74 68 65 0a 2a 2a 20   changes the.** 
16030 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
16040 65 64 20 62 69 74 73 20 74 6f 20 74 68 65 20 22  ed bits to the "
16050 6f 70 74 69 6d 61 6c 22 20 61 6d 6f 75 6e 74 2e  optimal" amount.
16060 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
16070 50 61 67 65 72 41 6c 69 67 6e 52 65 73 65 72 76  PagerAlignReserv
16080 65 28 50 61 67 65 72 20 2a 70 44 65 73 74 2c 20  e(Pager *pDest, 
16090 50 61 67 65 72 20 2a 70 53 72 63 29 7b 0a 20 20  Pager *pSrc){.  
160a0 69 66 28 20 70 44 65 73 74 2d 3e 6e 52 65 73 65  if( pDest->nRese
160b0 72 76 65 21 3d 70 53 72 63 2d 3e 6e 52 65 73 65  rve!=pSrc->nRese
160c0 72 76 65 20 29 7b 0a 20 20 20 20 70 44 65 73 74  rve ){.    pDest
160d0 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 70 53 72  ->nReserve = pSr
160e0 63 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20  c->nReserve;.   
160f0 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
16100 28 70 44 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23  (pDest);.  }.}.#
16110 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
16120 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  d a single page 
16130 66 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20  from either the 
16140 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66  journal file (if
16150 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20   isMainJrnl==1) 
16160 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73  or.** from the s
16170 75 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69  ub-journal (if i
16180 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e  sMainJrnl==0) an
16190 64 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20  d playback that 
161a0 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67  page..** The pag
161b0 65 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73  e begins at offs
161c0 65 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f  et *pOffset into
161d0 20 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a   the file. The *
161e0 70 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65  pOffset.** value
161f0 20 69 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f   is increased to
16200 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
16210 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
16220 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
16230 2a 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  * The main rollb
16240 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73  ack journal uses
16250 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65   checksums - the
16260 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
16270 61 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e  al does .** not.
16280 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
16290 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
162a0 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65 61   page record rea
162b0 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
162c0 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
162d0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
162e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
162f0 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69  ue of Pager.dbSi
16300 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  ze, then playbac
16310 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20  k is.** skipped 
16320 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  and SQLITE_OK is
16330 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
16340 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74   If pDone is not
16350 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69   NULL, then it i
16360 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61  s a record of pa
16370 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61 6c  ges that have al
16380 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c  ready.** been pl
16390 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74  ayed back.  If t
163a0 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66  he page at *pOff
163b0 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  set has already 
163c0 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
163d0 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72  .** (if the corr
163e0 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20  esponding pDone 
163f0 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65 6e  bit is set) then
16400 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61   skip the playba
16410 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ck..** Make sure
16420 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63   the pDone bit c
16430 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
16440 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67  the *pOffset pag
16450 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f  e is set.** prio
16460 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a  r to returning..
16470 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
16480 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63 63  e record is succ
16490 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
164a0 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
164b0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  rnal file.** and
164c0 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68   played back, th
164d0 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  en SQLITE_OK is 
164e0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
164f0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
16500 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  ** while reading
16510 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d   the record from
16520 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
16530 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65  al file or while
16540 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74   writing.** to t
16550 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16560 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
16570 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
16580 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a  rned. If data.**
16590 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
165a0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
165b0 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
165c0 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f  e but appears to
165d0 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64   be.** corrupted
165e0 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
165f0 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20   returned. Data 
16600 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  is considered co
16610 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77  rrupted in.** tw
16620 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a  o circumstances:
16630 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74  .** .**   * If t
16640 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e  he record page-n
16650 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c  umber is illegal
16660 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f   (0 or PAGER_MJ_
16670 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a  PGNO), or.**   *
16680 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69   If the record i
16690 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
166a0 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
166b0 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  n journal file.*
166c0 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 68  *     and the ch
166d0 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65  ecksum field doe
166e0 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
166f0 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a  record content..
16700 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66  **.** Neither of
16710 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61   these two scena
16720 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c  rios are possibl
16730 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65 70  e during a savep
16740 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  oint rollback..*
16750 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20  *.** If this is 
16760 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
16770 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72  back, then memor
16780 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65  y may have to be
16790 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20   dynamically.** 
167a0 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
167b0 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74  s function. If t
167c0 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20  his is the case 
167d0 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f  and an allocatio
167e0 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49  n fails,.** SQLI
167f0 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
16800 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
16810 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
16820 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50  ck_one_page(.  P
16830 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
16840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16850 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20  The pager being 
16860 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
16870 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20   i64 *pOffset,  
16880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16890 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f  * Offset of reco
168a0 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a  rd to playback *
168b0 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
168c0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
168d0 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70    /* Bitvec of p
168e0 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61  ages already pla
168f0 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e  yed back */.  in
16900 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20  t isMainJrnl,   
16910 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
16920 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c   -> main journal
16930 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e  . 0 -> sub-journ
16940 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  al. */.  int isS
16950 61 76 65 70 6e 74 20 20 20 20 20 20 20 20 20 20  avepnt          
16960 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
16970 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  or a savepoint r
16980 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20  ollback */.){.  
16990 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
169a0 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
169b0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
169c0 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
169d0 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67  he cache */.  Pg
169e0 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
169f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16a00 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
16a10 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72  f a page in jour
16a20 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
16a30 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
16a40 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
16a50 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69  um used for sani
16a60 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ty checking */. 
16a70 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20   char *aData;   
16a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16a90 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  * Temporary stor
16aa0 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  age for the page
16ab0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
16ac0 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20  le *jfd;        
16ad0 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
16ae0 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
16af0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
16b00 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65  */.  int isSynce
16b10 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
16b20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f     /* True if jo
16b30 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79  urnal page is sy
16b40 6e 63 65 64 20 2a 2f 0a 23 69 66 64 65 66 20 53  nced */.#ifdef S
16b50 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
16b60 20 20 2f 2a 20 54 68 65 20 6a 72 6e 6c 45 6e 63    /* The jrnlEnc
16b70 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66   flag is true if
16b80 20 4a 6f 75 72 6e 61 6c 20 70 61 67 65 73 20 73   Journal pages s
16b90 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
16ba0 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20 74 68 65  through.  ** the
16bb0 20 63 6f 64 65 63 2e 20 20 49 74 20 69 73 20 66   codec.  It is f
16bc0 61 6c 73 65 20 66 6f 72 20 70 75 72 65 20 69 6e  alse for pure in
16bd0 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 73  -memory journals
16be0 2e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  . */.  const int
16bf0 20 6a 72 6e 6c 45 6e 63 20 3d 20 28 69 73 4d 61   jrnlEnc = (isMa
16c00 69 6e 4a 72 6e 6c 20 7c 7c 20 70 50 61 67 65 72  inJrnl || pPager
16c10 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3d 3d  ->subjInMemory==
16c20 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  0);.#endif..  as
16c30 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e  sert( (isMainJrn
16c40 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20  l&~1)==0 );     
16c50 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69   /* isMainJrnl i
16c60 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73  s 0 or 1 */.  as
16c70 73 65 72 74 28 20 28 69 73 53 61 76 65 70 6e 74  sert( (isSavepnt
16c80 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  &~1)==0 );      
16c90 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73   /* isSavepnt is
16ca0 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73   0 or 1 */.  ass
16cb0 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20  ert( isMainJrnl 
16cc0 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20  || pDone );     
16cd0 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20  /* pDone always 
16ce0 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72  used on sub-jour
16cf0 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  nals */.  assert
16d00 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70  ( isSavepnt || p
16d10 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20  Done==0 );   /* 
16d20 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64  pDone never used
16d30 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e   on non-savepoin
16d40 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20  t */..  aData = 
16d50 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
16d60 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61  e;.  assert( aDa
16d70 74 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  ta );         /*
16d80 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75   Temp storage mu
16d90 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  st have already 
16da0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a  been allocated *
16db0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  /.  assert( page
16dc0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
16dd0 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72  =0 || (!isMainJr
16de0 6e 6c 20 26 26 20 69 73 53 61 76 65 70 6e 74 29  nl && isSavepnt)
16df0 20 29 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72   );..  /* Either
16e00 20 74 68 65 20 73 74 61 74 65 20 69 73 20 67 72   the state is gr
16e10 65 61 74 65 72 20 74 68 61 6e 20 50 41 47 45 52  eater than PAGER
16e20 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
16e30 20 28 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   (a transaction 
16e40 0a 20 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69  .  ** or savepoi
16e50 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65  nt rollback done
16e60 20 61 74 20 74 68 65 20 72 65 71 75 65 73 74 20   at the request 
16e70 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 29 20 6f  of the caller) o
16e80 72 20 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 61  r this is.  ** a
16e90 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
16ea0 6c 62 61 63 6b 2e 20 49 66 20 69 74 20 69 73 20  lback. If it is 
16eb0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
16ec0 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70 61 67 65  llback, the page
16ed0 72 0a 20 20 2a 2a 20 69 73 20 69 6e 20 73 74 61  r.  ** is in sta
16ee0 74 65 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64  te OPEN and hold
16ef0 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
16f00 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c  ock. Hot-journal
16f10 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f   rollback.  ** o
16f20 6e 6c 79 20 72 65 61 64 73 20 66 72 6f 6d 20 74  nly reads from t
16f30 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  he main journal,
16f40 20 6e 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f 75   not the sub-jou
16f50 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  rnal..  */.  ass
16f60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
16f70 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
16f80 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
16f90 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 53    || (pPager->eS
16fa0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
16fb0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   && pPager->eLoc
16fc0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
16fd0 4b 29 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  K).  );.  assert
16fe0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
16ff0 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
17000 41 43 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69  ACHEMOD || isMai
17010 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52  nJrnl );..  /* R
17020 65 61 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ead the page num
17030 62 65 72 20 61 6e 64 20 70 61 67 65 20 64 61 74  ber and page dat
17040 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  a from the journ
17050 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61  al or sub-journa
17060 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74  l.  ** file. Ret
17070 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
17080 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  e to the caller 
17090 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
170a0 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66  ccurs..  */.  jf
170b0 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f  d = isMainJrnl ?
170c0 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70   pPager->jfd : p
170d0 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72  Pager->sjfd;.  r
170e0 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
170f0 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70  fd, *pOffset, &p
17100 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  gno);.  if( rc!=
17110 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
17120 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
17130 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c  lite3OsRead(jfd,
17140 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61   (u8*)aData, pPa
17150 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
17160 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20  *pOffset)+4);.  
17170 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17180 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
17190 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61   *pOffset += pPa
171a0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  ger->pageSize + 
171b0 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34  4 + isMainJrnl*4
171c0 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  ;..  /* Sanity c
171d0 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70  hecking on the p
171e0 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f  age.  This is mo
171f0 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  re important tha
17200 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  t I originally. 
17210 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66   ** thought.  If
17220 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
17230 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
17240 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69  e journal is bei
17250 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a  ng written,.  **
17260 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20   it could cause 
17270 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20  invalid data to 
17280 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
17290 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65  the journal.  We
172a0 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65   need to.  ** de
172b0 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69  tect this invali
172c0 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67  d data (with hig
172d0 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61  h probability) a
172e0 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20  nd ignore it..  
172f0 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  */.  if( pgno==0
17300 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
17310 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
17320 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
17330 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20  isSavepnt );.   
17340 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
17350 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ONE;.  }.  if( p
17360 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72  gno>(Pgno)pPager
17370 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69  ->dbSize || sqli
17380 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 44  te3BitvecTest(pD
17390 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20  one, pgno) ){.  
173a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
173b0 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  OK;.  }.  if( is
173c0 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20  MainJrnl ){.    
173d0 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
173e0 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d  jfd, (*pOffset)-
173f0 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20  4, &cksum);.    
17400 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
17410 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53  rc;.    if( !isS
17420 61 76 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f  avepnt && pager_
17430 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75  cksum(pPager, (u
17440 38 2a 29 61 44 61 74 61 29 21 3d 63 6b 73 75 6d  8*)aData)!=cksum
17450 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
17460 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
17470 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
17480 20 74 68 69 73 20 70 61 67 65 20 68 61 73 20 61   this page has a
17490 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79  lready been play
174a0 65 64 20 62 61 63 6b 20 62 65 66 6f 72 65 20 64  ed back before d
174b0 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  uring the curren
174c0 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c  t.  ** rollback,
174d0 20 74 68 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68   then don't both
174e0 65 72 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61  er to play it ba
174f0 63 6b 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20  ck again..  */. 
17500 20 69 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72   if( pDone && (r
17510 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
17520 63 53 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f  cSet(pDone, pgno
17530 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))!=SQLITE_OK ){
17540 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
17550 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70    }..  /* When p
17560 6c 61 79 69 6e 67 20 62 61 63 6b 20 70 61 67 65  laying back page
17570 20 31 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20   1, restore the 
17580 6e 52 65 73 65 72 76 65 20 73 65 74 74 69 6e 67  nReserve setting
17590 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f  .  */.  if( pgno
175a0 3d 3d 31 20 26 26 20 70 50 61 67 65 72 2d 3e 6e  ==1 && pPager->n
175b0 52 65 73 65 72 76 65 21 3d 28 28 75 38 2a 29 61  Reserve!=((u8*)a
175c0 44 61 74 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20  Data)[20] ){.   
175d0 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
175e0 65 20 3d 20 28 28 75 38 2a 29 61 44 61 74 61 29  e = ((u8*)aData)
175f0 5b 32 30 5d 3b 0a 20 20 20 20 70 61 67 65 72 52  [20];.    pagerR
17600 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72  eportSize(pPager
17610 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
17620 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
17630 43 41 43 48 45 4d 4f 44 20 73 74 61 74 65 2c 20  CACHEMOD state, 
17640 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
17650 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69  be a copy of thi
17660 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74  s.  ** page in t
17670 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
17680 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73  In this case jus
17690 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  t update the pag
176a0 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e  er cache,.  ** n
176b0 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ot the database 
176c0 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
176d0 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69  s left marked di
176e0 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65  rty in this case
176f0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65  ..  **.  ** An e
17700 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20  xception to the 
17710 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74  above rule: If t
17720 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 69  he database is i
17730 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20  n no-sync mode. 
17740 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69   ** and a page i
17750 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61  s moved during a
17760 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
17770 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61  cuum then the pa
17780 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20  ge may.  ** not 
17790 62 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  be in the pager 
177a0 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66  cache. Later: if
177b0 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49   a malloc() or I
177c0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20  O error occurs. 
177d0 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76   ** during a Mov
177e0 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68  epage() call, th
177f0 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 20  en the page may 
17800 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63 61  not be in the ca
17810 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e  che.  ** either.
17820 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f   So the conditio
17830 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74  n described in t
17840 68 65 20 61 62 6f 76 65 20 70 61 72 61 67 72 61  he above paragra
17850 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61  ph is not.  ** a
17860 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a  ssert()able..  *
17870 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 57 52 49  *.  ** If in WRI
17880 54 45 52 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45  TER_DBMOD, WRITE
17890 52 5f 46 49 4e 49 53 48 45 44 20 6f 72 20 4f 50  R_FINISHED or OP
178a0 45 4e 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77  EN state, then w
178b0 65 20 75 70 64 61 74 65 20 74 68 65 0a 20 20 2a  e update the.  *
178c0 2a 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66  * pager cache if
178d0 20 69 74 20 65 78 69 73 74 73 20 61 6e 64 20 74   it exists and t
178e0 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68  he main file. Th
178f0 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d  e page is then m
17900 61 72 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20  arked .  ** not 
17910 64 69 72 74 79 2e 20 53 69 6e 63 65 20 74 68 69  dirty. Since thi
17920 73 20 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65  s code is only e
17930 78 65 63 75 74 65 64 20 69 6e 20 50 41 47 45 52  xecuted in PAGER
17940 5f 4f 50 45 4e 20 73 74 61 74 65 20 66 6f 72 0a  _OPEN state for.
17950 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e    ** a hot-journ
17960 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20  al rollback, it 
17970 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
17980 61 74 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  at the page-cach
17990 65 20 69 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20  e is empty.  ** 
179a0 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
179b0 69 6e 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20  in OPEN state.. 
179c0 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20   **.  ** Ticket 
179d0 23 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74  #1171:  The stat
179e0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69  ement journal mi
179f0 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65  ght contain page
17a00 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73   content that is
17a10 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20  .  ** different 
17a20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f  from the page co
17a30 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61  ntent at the sta
17a40 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
17a50 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73  ction..  ** This
17a60 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70   occurs when a p
17a70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70  age is changed p
17a80 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
17a90 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74  t of a statement
17aa0 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67  .  ** then chang
17ab0 65 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20  ed again within 
17ac0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  the statement.  
17ad0 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  When rolling bac
17ae0 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74  k such a.  ** st
17af0 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20  atement we must 
17b00 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
17b10 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
17b20 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f  se unless we kno
17b30 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61  w.  ** for certa
17b40 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c  in that original
17b50 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
17b60 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74  re synced into t
17b70 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
17b80 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20  .  ** journal.  
17b90 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77  Otherwise, a pow
17ba0 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65  er loss might le
17bb0 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74  ave modified dat
17bc0 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  a in the.  ** da
17bd0 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68  tabase file with
17be0 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  out an entry in 
17bf0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
17c00 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20  rnal that can.  
17c10 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  ** restore the d
17c20 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f  atabase to its o
17c30 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54  riginal form.  T
17c40 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75  wo conditions mu
17c50 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62  st be.  ** met b
17c60 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
17c70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17c80 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 74  les. (1) the dat
17c90 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20  abase must be.  
17ca0 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20  ** locked.  (2) 
17cb0 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
17cc0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
17cd0 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20  ontent is fully 
17ce0 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74  synced.  ** in t
17cf0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
17d00 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74  either because t
17d10 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
17d20 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a  n cache or else.
17d30 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73    ** the page is
17d40 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53   marked as needS
17d50 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a  ync==0..  **.  *
17d60 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57  * 2008-04-14:  W
17d70 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74  hen attempting t
17d80 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75  o vacuum a corru
17d90 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
17da0 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73  , it.  ** is pos
17db0 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20  sible to fail a 
17dc0 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64  statement on a d
17dd0 61 74 61 62 61 73 65 20 74 68 61 74 20 64 6f 65  atabase that doe
17de0 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e  s not yet exist.
17df0 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74  .  ** Do not att
17e00 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 69 66  empt to write if
17e10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
17e20 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70  as never been op
17e30 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ened..  */.  if(
17e40 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
17e50 67 65 72 29 20 29 7b 0a 20 20 20 20 70 50 67 20  ger) ){.    pPg 
17e60 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
17e70 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50    pPg = sqlite3P
17e80 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65  agerLookup(pPage
17e90 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  r, pgno);.  }.  
17ea0 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21  assert( pPg || !
17eb0 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
17ec0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
17ed0 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c  e!=PAGER_OPEN ||
17ee0 20 70 50 67 3d 3d 30 20 7c 7c 20 70 50 61 67 65   pPg==0 || pPage
17ef0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
17f00 20 50 41 47 45 52 54 52 41 43 45 28 28 22 50 4c   PAGERTRACE(("PL
17f10 41 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25  AYBACK %d page %
17f20 64 20 68 61 73 68 28 25 30 38 78 29 20 25 73 5c  d hash(%08x) %s\
17f30 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 50  n",.           P
17f40 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
17f50 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61  pgno, pager_data
17f60 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67  hash(pPager->pag
17f70 65 53 69 7a 65 2c 20 28 75 38 2a 29 61 44 61 74  eSize, (u8*)aDat
17f80 61 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28  a),.           (
17f90 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e  isMainJrnl?"main
17fa0 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a  -journal":"sub-j
17fb0 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20  ournal").  ));. 
17fc0 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
17fd0 29 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20  ){.    isSynced 
17fe0 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  = pPager->noSync
17ff0 20 7c 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d   || (*pOffset <=
18000 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
18010 48 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Hdr);.  }else{. 
18020 20 20 20 69 73 53 79 6e 63 65 64 20 3d 20 28 70     isSynced = (p
18030 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67  Pg==0 || 0==(pPg
18040 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f  ->flags & PGHDR_
18050 4e 45 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d  NEED_SYNC));.  }
18060 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
18070 61 67 65 72 2d 3e 66 64 29 0a 20 20 20 26 26 20  ager->fd).   && 
18080 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e  (pPager->eState>
18090 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
180a0 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  MOD || pPager->e
180b0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
180c0 4e 29 0a 20 20 20 26 26 20 69 73 53 79 6e 63 65  N).   && isSynce
180d0 64 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f  d.  ){.    i64 o
180e0 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  fst = (pgno-1)*(
180f0 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
18100 53 69 7a 65 3b 0a 20 20 20 20 74 65 73 74 63 61  Size;.    testca
18110 73 65 28 20 21 69 73 53 61 76 65 70 6e 74 20 26  se( !isSavepnt &
18120 26 20 70 50 67 21 3d 30 20 26 26 20 28 70 50 67  & pPg!=0 && (pPg
18130 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
18140 45 44 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20  ED_SYNC)!=0 );. 
18150 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65     assert( !page
18160 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
18170 29 3b 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  );..    /* Write
18180 20 74 68 65 20 64 61 74 61 20 72 65 61 64 20 66   the data read f
18190 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
181a0 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
181b0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
181c0 20 2a 2a 20 54 68 69 73 20 69 73 20 75 73 75 61   ** This is usua
181d0 6c 6c 79 20 73 61 66 65 20 65 76 65 6e 20 66 6f  lly safe even fo
181e0 72 20 61 6e 20 65 6e 63 72 79 70 74 65 64 20 64  r an encrypted d
181f0 61 74 61 62 61 73 65 20 2d 20 61 73 20 74 68 65  atabase - as the
18200 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 77 61 73   data.    ** was
18210 20 65 6e 63 72 79 70 74 65 64 20 62 65 66 6f 72   encrypted befor
18220 65 20 69 74 20 77 61 73 20 77 72 69 74 74 65 6e  e it was written
18230 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
18240 66 69 6c 65 2e 20 54 68 65 20 65 78 63 65 70 74  file. The except
18250 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 73 20 69 66  ion.    ** is if
18260 20 74 68 65 20 64 61 74 61 20 77 61 73 20 6a 75   the data was ju
18270 73 74 20 72 65 61 64 20 66 72 6f 6d 20 61 6e 20  st read from an 
18280 69 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f  in-memory sub-jo
18290 75 72 6e 61 6c 2e 20 49 6e 20 74 68 61 74 0a 20  urnal. In that. 
182a0 20 20 20 2a 2a 20 63 61 73 65 20 69 74 20 6d 75     ** case it mu
182b0 73 74 20 62 65 20 65 6e 63 72 79 70 74 65 64 20  st be encrypted 
182c0 68 65 72 65 20 62 65 66 6f 72 65 20 69 74 20 69  here before it i
182d0 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68  s copied into th
182e0 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
182f0 2a 20 66 69 6c 65 2e 20 20 2a 2f 0a 23 69 66 64  * file.  */.#ifd
18300 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
18310 44 45 43 0a 20 20 20 20 69 66 28 20 21 6a 72 6e  DEC.    if( !jrn
18320 6c 45 6e 63 20 29 7b 0a 20 20 20 20 20 20 43 4f  lEnc ){.      CO
18330 44 45 43 32 28 70 50 61 67 65 72 2c 20 61 44 61  DEC2(pPager, aDa
18340 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d  ta, pgno, 7, rc=
18350 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
18360 54 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20 20  T, aData);.     
18370 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
18380 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
18390 20 28 75 38 20 2a 29 61 44 61 74 61 2c 20 70 50   (u8 *)aData, pP
183a0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
183b0 6f 66 73 74 29 3b 0a 20 20 20 20 20 20 43 4f 44  ofst);.      COD
183c0 45 43 31 28 70 50 61 67 65 72 2c 20 61 44 61 74  EC1(pPager, aDat
183d0 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53  a, pgno, 3, rc=S
183e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
183f0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
18400 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  dif.    rc = sql
18410 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
18420 65 72 2d 3e 66 64 2c 20 28 75 38 20 2a 29 61 44  er->fd, (u8 *)aD
18430 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
18440 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 0a 20  eSize, ofst);.. 
18450 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
18460 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
18470 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
18480 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e  dbFileSize = pgn
18490 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  o;.    }.    if(
184a0 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70   pPager->pBackup
184b0 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
184c0 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20  E_HAS_CODEC.    
184d0 20 20 69 66 28 20 6a 72 6e 6c 45 6e 63 20 29 7b    if( jrnlEnc ){
184e0 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 31 28  .        CODEC1(
184f0 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70  pPager, aData, p
18500 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
18510 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20  E_NOMEM_BKPT);. 
18520 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61         sqlite3Ba
18530 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
18540 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
18550 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20  , (u8*)aData);. 
18560 20 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50         CODEC2(pP
18570 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e  ager, aData, pgn
18580 6f 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f  o, 7, rc=SQLITE_
18590 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 61 44 61 74 61  NOMEM_BKPT,aData
185a0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  );.      }else.#
185b0 65 6e 64 69 66 0a 20 20 20 20 20 20 73 71 6c 69  endif.      sqli
185c0 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
185d0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
185e0 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74   pgno, (u8*)aDat
185f0 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  a);.    }.  }els
18600 65 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e  e if( !isMainJrn
18610 6c 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20  l && pPg==0 ){. 
18620 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
18630 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61   a rollback of a
18640 20 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64   savepoint and d
18650 61 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74  ata was not writ
18660 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68  ten to.    ** th
18670 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  e database and t
18680 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
18690 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20  n-memory, there 
186a0 69 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20  is a potential. 
186b0 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57     ** problem. W
186c0 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20  hen the page is 
186d0 6e 65 78 74 20 66 65 74 63 68 65 64 20 62 79 20  next fetched by 
186e0 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
186f0 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c  , it .    ** wil
18700 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  l be read from t
18710 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18720 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d  , which may or m
18730 61 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a  ay not be .    *
18740 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20  * current. .    
18750 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20  **.    ** There 
18760 61 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20  are a couple of 
18770 64 69 66 66 65 72 65 6e 74 20 77 61 79 73 20 74  different ways t
18780 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20  his can happen. 
18790 41 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20  All are quite.  
187a0 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68    ** obscure. Wh
187b0 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79  en running in sy
187c0 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
187d0 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61  this can only ha
187e0 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20  ppen .    ** if 
187f0 74 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74  the page is on t
18800 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20  he free-list at 
18810 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
18820 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
18830 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61  en.    ** popula
18840 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20  ted, then moved 
18850 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67  using sqlite3Pag
18860 65 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20  erMovepage()..  
18870 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
18880 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61  solution is to a
18890 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  dd an in-memory 
188a0 70 61 67 65 20 74 6f 20 74 68 65 20 63 61 63 68  page to the cach
188b0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20  e containing.   
188c0 20 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73   ** the data jus
188d0 74 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  t read from the 
188e0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72  sub-journal. Mar
188f0 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69  k the page as di
18900 72 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20  rty .    ** and 
18910 69 66 20 74 68 65 20 70 61 67 65 72 20 72 65 71  if the pager req
18920 75 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d  uires a journal-
18930 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20  sync, then mark 
18940 74 68 65 20 70 61 67 65 20 61 73 20 0a 20 20 20  the page as .   
18950 20 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20   ** requiring a 
18960 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66  journal-sync bef
18970 6f 72 65 20 69 74 20 69 73 20 77 72 69 74 74 65  ore it is writte
18980 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  n..    */.    as
18990 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20  sert( isSavepnt 
189a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
189b0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
189c0 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52  ll & SPILLFLAG_R
189d0 4f 4c 4c 42 41 43 4b 29 3d 3d 30 20 29 3b 0a 20  OLLBACK)==0 );. 
189e0 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
189f0 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c  Spill |= SPILLFL
18a00 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  AG_ROLLBACK;.   
18a10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
18a20 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67  erGet(pPager, pg
18a30 6e 6f 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20  no, &pPg, 1);.  
18a40 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65    assert( (pPage
18a50 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20  r->doNotSpill & 
18a60 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41  SPILLFLAG_ROLLBA
18a70 43 4b 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  CK)!=0 );.    pP
18a80 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
18a90 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 52   &= ~SPILLFLAG_R
18aa0 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 69 66 28  OLLBACK;.    if(
18ab0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18ac0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18ad0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
18ae0 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d  eDirty(pPg);.  }
18af0 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
18b00 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f    /* No page sho
18b10 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c  uld ever be expl
18b20 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61  icitly rolled ba
18b30 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73  ck that is in us
18b40 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  e, except.    **
18b50 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63   for page 1 whic
18b60 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65  h is held in use
18b70 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
18b80 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  p the lock on th
18b90 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
18ba0 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65  e active. Howeve
18bb0 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61  r such a page ma
18bc0 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y be rolled back
18bd0 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20   as a result.   
18be0 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e   ** of an intern
18bf0 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69  al error resulti
18c00 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74  ng in an automat
18c10 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ic call to.    *
18c20 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  * sqlite3PagerRo
18c30 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f  llback()..    */
18c40 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61  .    void *pData
18c50 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70 50  ;.    pData = pP
18c60 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65  g->pData;.    me
18c70 6d 63 70 79 28 70 44 61 74 61 2c 20 28 75 38 2a  mcpy(pData, (u8*
18c80 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
18c90 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 70  pageSize);.    p
18ca0 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
18cb0 28 70 50 67 29 3b 0a 20 20 20 20 2f 2a 20 49 74  (pPg);.    /* It
18cc0 20 75 73 65 64 20 74 6f 20 62 65 20 74 68 61 74   used to be that
18cd0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
18ce0 6b 65 43 6c 65 61 6e 28 70 50 67 29 20 77 61 73  keClean(pPg) was
18cf0 20 63 61 6c 6c 65 64 20 68 65 72 65 2e 20 20 42   called here.  B
18d00 75 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 63  ut.    ** that c
18d10 61 6c 6c 20 77 61 73 20 64 61 6e 67 65 72 6f 75  all was dangerou
18d20 73 20 61 6e 64 20 68 61 64 20 6e 6f 20 64 65 74  s and had no det
18d30 65 63 74 61 62 6c 65 20 62 65 6e 65 66 69 74 20  ectable benefit 
18d40 73 69 6e 63 65 20 74 68 65 20 63 61 63 68 65 0a  since the cache.
18d50 20 20 20 20 2a 2a 20 69 73 20 6e 6f 72 6d 61 6c      ** is normal
18d60 6c 79 20 63 6c 65 61 6e 65 64 20 62 79 20 73 71  ly cleaned by sq
18d70 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e  lite3PcacheClean
18d80 41 6c 6c 28 29 20 61 66 74 65 72 20 72 6f 6c 6c  All() after roll
18d90 62 61 63 6b 20 61 6e 64 20 73 6f 0a 20 20 20 20  back and so.    
18da0 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f  ** has been remo
18db0 76 65 64 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65  ved. */.    page
18dc0 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70  r_set_pagehash(p
18dd0 50 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  Pg);..    /* If 
18de0 74 68 69 73 20 77 61 73 20 70 61 67 65 20 31 2c  this was page 1,
18df0 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68   then restore th
18e00 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  e value of Pager
18e10 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20  .dbFileVers..   
18e20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f   ** Do this befo
18e30 72 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e  re any decoding.
18e40 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
18e50 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ==1 ){.      mem
18e60 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
18e70 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29  ileVers, &((u8*)
18e80 70 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f  pData)[24],sizeo
18e90 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
18ea0 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  Vers));.    }.. 
18eb0 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65     /* Decode the
18ec0 20 70 61 67 65 20 6a 75 73 74 20 72 65 61 64 20   page just read 
18ed0 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 23 69 66  from disk */.#if
18ee0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
18ef0 43 0a 20 20 20 20 69 66 28 20 6a 72 6e 6c 45 6e  C.    if( jrnlEn
18f00 63 20 29 7b 20 43 4f 44 45 43 31 28 70 50 61 67  c ){ CODEC1(pPag
18f10 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
18f20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49  pgno, 3, rc=SQLI
18f30 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 20  TE_NOMEM_BKPT); 
18f40 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  }.#endif.    sql
18f50 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73  ite3PcacheReleas
18f60 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65  e(pPg);.  }.  re
18f70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18f80 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73  * Parameter zMas
18f90 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ter is the name 
18fa0 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
18fb0 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67  nal file. A sing
18fc0 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  le journal.** fi
18fd0 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64  le that referred
18fe0 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a   to the master j
18ff0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
19000 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64  just been rolled
19010 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72   back..** This r
19020 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
19030 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
19040 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
19050 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19060 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73  e,.** and does s
19070 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  o if it is..**.*
19080 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74  * Argument zMast
19090 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  er may point to 
190a0 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e  Pager.pTmpSpace.
190b0 20 53 6f 20 74 68 61 74 20 62 75 66 66 65 72 20   So that buffer 
190c0 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c  is not .** avail
190d0 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74  able for use wit
190e0 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hin this functio
190f0 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20  n..**.** When a 
19100 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
19110 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20  ile is created, 
19120 69 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  it is populated 
19130 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20 0a  with the names .
19140 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73  ** of all of its
19150 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c   child journals,
19160 20 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74 68   one after anoth
19170 65 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61 73  er, formatted as
19180 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64   utf-8 .** encod
19190 65 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e 64  ed text. The end
191a0 20 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20 6a   of each child j
191b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d  ournal file is m
191c0 61 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a 2a  arked with a .**
191d0 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
191e0 62 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e 65  byte (0x00). i.e
191f0 2e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  . the entire con
19200 74 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74 65  tents of a maste
19210 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  r journal.** fil
19220 65 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  e for a transact
19230 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77  ion involving tw
19240 6f 20 64 61 74 61 62 61 73 65 73 20 6d 69 67 68  o databases migh
19250 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f  t be:.**.**   "/
19260 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a  home/bill/a.db-j
19270 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f  ournal\x00/home/
19280 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61  bill/b.db-journa
19290 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d  l\x00".**.** A m
192a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
192b0 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64  le may only be d
192c0 65 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20  eleted once all 
192d0 6f 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a  of its child .**
192e0 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20 62   journals have b
192f0 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  een rolled back.
19300 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
19310 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20 63  tion reads the c
19320 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
19330 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
19340 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f  le into .** memo
19350 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72  ry and loops thr
19360 6f 75 67 68 20 65 61 63 68 20 6f 66 20 74 68 65  ough each of the
19370 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e   child journal n
19380 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63  ames. For.** eac
19390 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c  h child journal,
193a0 20 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a   it checks if:.*
193b0 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20  *.**   * if the 
193c0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78  child journal ex
193d0 69 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a  ists, and if so.
193e0 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68  **   * if the ch
193f0 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74  ild journal cont
19400 61 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63 65  ains a reference
19410 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   to master journ
19420 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  al .**     file 
19430 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66  zMaster.**.** If
19440 20 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c   a child journal
19450 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68   can be found th
19460 61 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68 20  at matches both 
19470 6f 66 20 74 68 65 20 63 72 69 74 65 72 69 61 0a  of the criteria.
19480 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20 66  ** above, this f
19490 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
194a0 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
194b0 79 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69 73  ything. Otherwis
194c0 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68  e, if.** no such
194d0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63   child journal c
194e0 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c  an be found, fil
194f0 65 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65 6c  e zMaster is del
19500 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  eted from.** the
19510 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73 69   file-system usi
19520 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65  ng sqlite3OsDele
19530 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  te()..**.** If a
19540 6e 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68 69  n IO error withi
19550 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  n this function,
19560 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
19570 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  s returned. This
19580 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c  .** function all
19590 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62 79  ocates memory by
195a0 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
195b0 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20  Malloc(). If an 
195c0 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61  allocation.** fa
195d0 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ils, SQLITE_NOME
195e0 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  M is returned. O
195f0 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20  therwise, if no 
19600 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72  IO or malloc err
19610 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53  ors .** occur, S
19620 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
19630 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f  rned..**.** TODO
19640 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  : This function 
19650 61 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e 67  allocates a sing
19660 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f  le block of memo
19670 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68  ry to load.** th
19680 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
19690 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  s of the master 
196a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
196b0 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61  is could be.** a
196c0 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62   couple of kilob
196d0 79 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74  ytes or so - pot
196e0 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72 20  entially larger 
196f0 74 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a 2a  than the page .*
19700 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  * size..*/.stati
19710 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d  c int pager_delm
19720 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  aster(Pager *pPa
19730 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
19740 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c  *zMaster){.  sql
19750 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
19760 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
19770 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
19780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
19790 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73  turn code */.  s
197a0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61  qlite3_file *pMa
197b0 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c  ster;    /* Mall
197c0 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72  oc'd master-jour
197d0 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
197e0 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  tor */.  sqlite3
197f0 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b  _file *pJournal;
19800 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63     /* Malloc'd c
19810 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild-journal fil
19820 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
19830 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a    char *zMasterJ
19840 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43  ournal = 0; /* C
19850 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65  ontents of maste
19860 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
19870 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a  /.  i64 nMasterJ
19880 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a  ournal;       /*
19890 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20   Size of master 
198a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
198b0 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
198c0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
198d0 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f  ointer to one jo
198e0 75 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20  urnal within MJ 
198f0 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
19900 7a 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20  zMasterPtr;     
19910 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20      /* Space to 
19920 68 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65  hold MJ filename
19930 20 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20   from a journal 
19940 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  file */.  int nM
19950 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20  asterPtr;       
19960 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66      /* Amount of
19970 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
19980 20 74 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d   to zMasterPtr[]
19990 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
199a0 74 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74  te space for bot
199b0 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61  h the pJournal a
199c0 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20  nd pMaster file 
199d0 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a  descriptors..  *
199e0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
199f0 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   open the master
19a00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
19a10 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a  r reading..  */.
19a20 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c    pMaster = (sql
19a30 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69  ite3_file *)sqli
19a40 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56  te3MallocZero(pV
19a50 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32  fs->szOsFile * 2
19a60 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20  );.  pJournal = 
19a70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
19a80 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29  (((u8 *)pMaster)
19a90 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c   + pVfs->szOsFil
19aa0 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74  e);.  if( !pMast
19ab0 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  er ){.    rc = S
19ac0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
19ad0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
19ae0 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
19af0 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
19b00 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
19b10 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
19b20 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  L);.    rc = sql
19b30 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
19b40 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65   zMaster, pMaste
19b50 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  r, flags, 0);.  
19b60 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
19b70 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
19b80 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f  master_out;..  /
19b90 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  * Load the entir
19ba0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
19bb0 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65   file into space
19bc0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20   obtained from. 
19bd0 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c   ** sqlite3_mall
19be0 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64  oc() and pointed
19bf0 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f   to by zMasterJo
19c00 75 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62  urnal.   Also ob
19c10 74 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63  tain.  ** suffic
19c20 69 65 6e 74 20 73 70 61 63 65 20 28 69 6e 20 7a  ient space (in z
19c30 4d 61 73 74 65 72 50 74 72 29 20 74 6f 20 68 6f  MasterPtr) to ho
19c40 6c 64 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ld the names of 
19c50 6d 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72  master.  ** jour
19c60 6e 61 6c 20 66 69 6c 65 73 20 65 78 74 72 61 63  nal files extrac
19c70 74 65 64 20 66 72 6f 6d 20 72 65 67 75 6c 61 72  ted from regular
19c80 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61   rollback-journa
19c90 6c 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ls..  */.  rc = 
19ca0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
19cb0 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73  e(pMaster, &nMas
19cc0 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
19cd0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19ce0 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
19cf0 72 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72  r_out;.  nMaster
19d00 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  Ptr = pVfs->mxPa
19d10 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73  thname+1;.  zMas
19d20 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  terJournal = sql
19d30 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74  ite3Malloc(nMast
19d40 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73  erJournal + nMas
19d50 74 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 69  terPtr + 1);.  i
19d60 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  f( !zMasterJourn
19d70 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  al ){.    rc = S
19d80 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
19d90 3b 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61  ;.    goto delma
19da0 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  ster_out;.  }.  
19db0 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d  zMasterPtr = &zM
19dc0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61  asterJournal[nMa
19dd0 73 74 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a  sterJournal+1];.
19de0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
19df0 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d  Read(pMaster, zM
19e00 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69  asterJournal, (i
19e10 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  nt)nMasterJourna
19e20 6c 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  l, 0);.  if( rc!
19e30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
19e40 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
19e50 0a 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  .  zMasterJourna
19e60 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l[nMasterJournal
19e70 5d 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e  ] = 0;..  zJourn
19e80 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72  al = zMasterJour
19e90 6e 61 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a  nal;.  while( (z
19ea0 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a  Journal-zMasterJ
19eb0 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a  ournal)<nMasterJ
19ec0 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e  ournal ){.    in
19ed0 74 20 65 78 69 73 74 73 3b 0a 20 20 20 20 72 63  t exists;.    rc
19ee0 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
19ef0 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61  ss(pVfs, zJourna
19f00 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
19f10 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73  _EXISTS, &exists
19f20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
19f30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19f40 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
19f50 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
19f60 69 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20  if( exists ){.  
19f70 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
19f80 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74  e journals point
19f90 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73  ed to by the mas
19fa0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ter journal exis
19fb0 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 70 65  ts..      ** Ope
19fc0 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69  n it and check i
19fd0 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74  f it points at t
19fe0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
19ff0 6c 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 73  l. If.      ** s
1a000 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  o, return withou
1a010 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d  t deleting the m
1a020 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1a030 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  le..      */.   
1a040 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20     int c;.      
1a050 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c  int flags = (SQL
1a060 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
1a070 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
1a080 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  IN_JOURNAL);.   
1a090 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1a0a0 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75  sOpen(pVfs, zJou
1a0b0 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20  rnal, pJournal, 
1a0c0 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20  flags, 0);.     
1a0d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a0e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
1a0f0 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
1a100 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1a110 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
1a120 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c  Journal(pJournal
1a130 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d  , zMasterPtr, nM
1a140 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20  asterPtr);.     
1a150 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
1a160 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  pJournal);.     
1a170 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a180 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
1a190 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
1a1a0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1a1b0 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b   c = zMasterPtr[
1a1c0 30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28  0]!=0 && strcmp(
1a1d0 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73  zMasterPtr, zMas
1a1e0 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69  ter)==0;.      i
1a1f0 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20  f( c ){.        
1a200 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74  /* We have a mat
1a210 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74  ch. Do not delet
1a220 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
1a230 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
1a240 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
1a250 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
1a260 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4a 6f 75  }.    }.    zJou
1a270 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33  rnal += (sqlite3
1a280 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61  Strlen30(zJourna
1a290 6c 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20 20 73  l)+1);.  }. .  s
1a2a0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d  qlite3OsClose(pM
1a2b0 61 73 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 73  aster);.  rc = s
1a2c0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
1a2d0 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
1a2e0 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  ;..delmaster_out
1a2f0 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
1a300 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  (zMasterJournal)
1a310 3b 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72 20  ;.  if( pMaster 
1a320 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
1a330 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a  Close(pMaster);.
1a340 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f      assert( !isO
1a350 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b  pen(pJournal) );
1a360 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1a370 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a  e(pMaster);.  }.
1a380 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a390 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1a3a0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
1a3b0 63 68 61 6e 67 65 20 74 68 65 20 61 63 74 75 61  change the actua
1a3c0 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  l size of the da
1a3d0 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
1a3e0 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
1a3f0 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61  em. This only ha
1a400 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69  ppens when commi
1a410 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
1a420 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69  ion,.** or rolli
1a430 6e 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61  ng back a transa
1a440 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67  ction (including
1a450 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
1a460 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a  hot-journal)..**
1a470 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20  .** If the main 
1a480 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1a490 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 74 68   not open, or th
1a4a0 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
1a4b0 6e 20 65 69 74 68 65 72 0a 2a 2a 20 44 42 4d 4f  n either.** DBMO
1a4c0 44 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c  D or OPEN state,
1a4d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1a4e0 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72  s a no-op. Other
1a4f0 77 69 73 65 2c 20 74 68 65 20 73 69 7a 65 20 0a  wise, the size .
1a500 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ** of the file i
1a510 73 20 63 68 61 6e 67 65 64 20 74 6f 20 6e 50 61  s changed to nPa
1a520 67 65 20 70 61 67 65 73 20 28 6e 50 61 67 65 2a  ge pages (nPage*
1a530 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1a540 20 62 79 74 65 73 29 2e 20 0a 2a 2a 20 49 66 20   bytes). .** If 
1a550 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
1a560 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61   is currently la
1a570 72 67 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20  rger than nPage 
1a580 70 61 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20  pages, then use 
1a590 74 68 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e  the VFS.** xTrun
1a5a0 63 61 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f  cate() method to
1a5b0 20 74 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a   truncate it..**
1a5c0 0a 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74  .** Or, it might
1a5d0 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
1a5e0 74 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  t the file on di
1a5f0 73 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  sk is smaller th
1a600 61 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67  an .** nPage pag
1a610 65 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69  es. Some operati
1a620 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d  ng system implem
1a630 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65  entations can ge
1a640 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a  t confused if .*
1a650 2a 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75  * you try to tru
1a660 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20  ncate a file to 
1a670 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69  some size that i
1a680 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74  s larger than it
1a690 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69   .** currently i
1a6a0 73 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68 69  s, so detect thi
1a6b0 73 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65  s case and write
1a6c0 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62   a single zero b
1a6d0 79 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65  yte to .** the e
1a6e0 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69  nd of the new fi
1a6f0 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  le instead..**.*
1a700 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
1a710 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a720 4b 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  K. If an IO erro
1a730 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d  r occurs while m
1a740 6f 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20  odifying.** the 
1a750 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72  database file, r
1a760 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
1a770 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
1a780 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1a790 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  t pager_truncate
1a7a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1a7b0 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69  Pgno nPage){.  i
1a7c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1a7d0 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
1a7e0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
1a7f0 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73  ER_ERROR );.  as
1a800 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1a810 74 61 74 65 21 3d 50 41 47 45 52 5f 52 45 41 44  tate!=PAGER_READ
1a820 45 52 20 29 3b 0a 20 20 0a 20 20 69 66 28 20 69  ER );.  .  if( i
1a830 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1a840 29 20 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  ) .   && (pPager
1a850 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
1a860 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20  WRITER_DBMOD || 
1a870 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
1a880 50 41 47 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29  PAGER_OPEN) .  )
1a890 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72 65 6e  {.    i64 curren
1a8a0 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a  tSize, newSize;.
1a8b0 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65 20 3d      int szPage =
1a8c0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1a8d0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
1a8e0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
1a8f0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
1a900 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20      /* TODO: Is 
1a910 69 74 20 73 61 66 65 20 74 6f 20 75 73 65 20 50  it safe to use P
1a920 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20  ager.dbFileSize 
1a930 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20  here? */.    rc 
1a940 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
1a950 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
1a960 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20  &currentSize);. 
1a970 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50     newSize = szP
1a980 61 67 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a  age*(i64)nPage;.
1a990 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1a9a0 54 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74  TE_OK && current
1a9b0 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b  Size!=newSize ){
1a9c0 0a 20 20 20 20 20 20 69 66 28 20 63 75 72 72 65  .      if( curre
1a9d0 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29  ntSize>newSize )
1a9e0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
1a9f0 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
1aa00 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77  (pPager->fd, new
1aa10 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Size);.      }el
1aa20 73 65 20 69 66 28 20 28 63 75 72 72 65 6e 74 53  se if( (currentS
1aa30 69 7a 65 2b 73 7a 50 61 67 65 29 3c 3d 6e 65 77  ize+szPage)<=new
1aa40 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1aa50 63 68 61 72 20 2a 70 54 6d 70 20 3d 20 70 50 61  char *pTmp = pPa
1aa60 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
1aa70 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
1aa80 54 6d 70 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b  Tmp, 0, szPage);
1aa90 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1aaa0 65 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61  e( (newSize-szPa
1aab0 67 65 29 20 3d 3d 20 63 75 72 72 65 6e 74 53 69  ge) == currentSi
1aac0 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  ze );.        te
1aad0 73 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65  stcase( (newSize
1aae0 2d 73 7a 50 61 67 65 29 20 3e 20 20 63 75 72 72  -szPage) >  curr
1aaf0 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  entSize );.     
1ab00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1ab10 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
1ab20 64 2c 20 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c  d, pTmp, szPage,
1ab30 20 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29   newSize-szPage)
1ab40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ab50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ab60 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
1ab70 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
1ab80 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  = nPage;.      }
1ab90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1aba0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1abb0 20 52 65 74 75 72 6e 20 61 20 73 61 6e 69 74 69   Return a saniti
1abc0 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  zed version of t
1abd0 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6f  he sector-size o
1abe0 66 20 4f 53 20 66 69 6c 65 20 70 46 69 6c 65 2e  f OS file pFile.
1abf0 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76   The.** return v
1ac00 61 6c 75 65 20 69 73 20 67 75 61 72 61 6e 74 65  alue is guarante
1ac10 65 64 20 74 6f 20 6c 69 65 20 62 65 74 77 65 65  ed to lie betwee
1ac20 6e 20 33 32 20 61 6e 64 20 4d 41 58 5f 53 45 43  n 32 and MAX_SEC
1ac30 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74  TOR_SIZE..*/.int
1ac40 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69   sqlite3SectorSi
1ac50 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
1ac60 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 69  *pFile){.  int i
1ac70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  Ret = sqlite3OsS
1ac80 65 63 74 6f 72 53 69 7a 65 28 70 46 69 6c 65 29  ectorSize(pFile)
1ac90 3b 0a 20 20 69 66 28 20 69 52 65 74 3c 33 32 20  ;.  if( iRet<32 
1aca0 29 7b 0a 20 20 20 20 69 52 65 74 20 3d 20 35 31  ){.    iRet = 51
1acb0 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69  2;.  }else if( i
1acc0 52 65 74 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53  Ret>MAX_SECTOR_S
1acd0 49 5a 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72  IZE ){.    asser
1ace0 74 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  t( MAX_SECTOR_SI
1acf0 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 69  ZE>=512 );.    i
1ad00 52 65 74 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52  Ret = MAX_SECTOR
1ad10 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74  _SIZE;.  }.  ret
1ad20 75 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn iRet;.}../*.
1ad30 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
1ad40 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73 65   of the Pager.se
1ad50 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
1ad60 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
1ad70 2a 2a 20 70 61 67 65 72 20 62 61 73 65 64 20 6f  ** pager based o
1ad80 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
1ad90 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63  rned by the xSec
1ada0 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a  torSize method.*
1adb0 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61  * of the open da
1adc0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
1add0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
1ade0 6c 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 74 6f  l be used .** to
1adf0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73   determine the s
1ae00 69 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e  ize and alignmen
1ae10 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  t of journal hea
1ae20 64 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74  der and .** mast
1ae30 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
1ae40 65 72 73 20 77 69 74 68 69 6e 20 63 72 65 61 74  ers within creat
1ae50 65 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ed journal files
1ae60 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70  ..**.** For temp
1ae70 6f 72 61 72 79 20 66 69 6c 65 73 20 74 68 65 20  orary files the 
1ae80 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72  effective sector
1ae90 20 73 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20   size is always 
1aea0 35 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  512 bytes..**.**
1aeb0 20 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20   Otherwise, for 
1aec0 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66 69  non-temporary fi
1aed0 6c 65 73 2c 20 74 68 65 20 65 66 66 65 63 74 69  les, the effecti
1aee0 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  ve sector size i
1aef0 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72  s.** the value r
1af00 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78  eturned by the x
1af10 53 65 63 74 6f 72 53 69 7a 65 28 29 20 6d 65 74  SectorSize() met
1af20 68 6f 64 20 72 6f 75 6e 64 65 64 20 75 70 20 74  hod rounded up t
1af30 6f 20 33 32 20 69 66 0a 2a 2a 20 69 74 20 69 73  o 32 if.** it is
1af40 20 6c 65 73 73 20 74 68 61 6e 20 33 32 2c 20 6f   less than 32, o
1af50 72 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74  r rounded down t
1af60 6f 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  o MAX_SECTOR_SIZ
1af70 45 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 67 72  E if it.** is gr
1af80 65 61 74 65 72 20 74 68 61 6e 20 4d 41 58 5f 53  eater than MAX_S
1af90 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a  ECTOR_SIZE..**.*
1afa0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 68 61  * If the file ha
1afb0 73 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  s the SQLITE_IOC
1afc0 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
1afd0 52 57 52 49 54 45 20 70 72 6f 70 65 72 74 79 2c  RWRITE property,
1afe0 20 74 68 65 6e 20 73 65 74 0a 2a 2a 20 74 68 65   then set.** the
1aff0 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
1b000 72 20 73 69 7a 65 20 74 6f 20 69 74 73 20 6d 69  r size to its mi
1b010 6e 69 6d 75 6d 20 76 61 6c 75 65 20 28 35 31 32  nimum value (512
1b020 29 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20  ).  The purpose 
1b030 6f 66 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 73 65  of.** pPager->se
1b040 63 74 6f 72 53 69 7a 65 20 69 73 20 74 6f 20 64  ctorSize is to d
1b050 65 66 69 6e 65 20 74 68 65 20 22 62 6c 61 73 74  efine the "blast
1b060 20 72 61 64 69 75 73 22 20 6f 66 20 62 79 74 65   radius" of byte
1b070 73 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20  s that.** might 
1b080 63 68 61 6e 67 65 20 69 66 20 61 20 63 72 61 73  change if a cras
1b090 68 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 77  h occurs while w
1b0a0 72 69 74 69 6e 67 20 74 6f 20 61 20 73 69 6e 67  riting to a sing
1b0b0 6c 65 20 62 79 74 65 20 69 6e 0a 2a 2a 20 74 68  le byte in.** th
1b0c0 61 74 20 72 61 6e 67 65 2e 20 20 42 75 74 20 77  at range.  But w
1b0d0 69 74 68 20 50 4f 57 45 52 53 41 46 45 5f 4f 56  ith POWERSAFE_OV
1b0e0 45 52 57 52 49 54 45 2c 20 74 68 65 20 62 6c 61  ERWRITE, the bla
1b0f0 73 74 20 72 61 64 69 75 73 20 69 73 20 7a 65 72  st radius is zer
1b100 6f 0a 2a 2a 20 28 74 68 61 74 20 69 73 20 77 68  o.** (that is wh
1b110 61 74 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  at POWERSAFE_OVE
1b120 52 57 52 49 54 45 20 6d 65 61 6e 73 29 2c 20 73  RWRITE means), s
1b130 6f 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68  o we minimize th
1b140 65 20 73 65 63 74 6f 72 0a 2a 2a 20 73 69 7a 65  e sector.** size
1b150 2e 20 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73  .  For backwards
1b160 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 6f   compatibility o
1b170 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  f the rollback j
1b180 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
1b190 61 74 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e 6f 74  at,.** we cannot
1b1a0 20 72 65 64 75 63 65 20 74 68 65 20 65 66 66 65   reduce the effe
1b1b0 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a  ctive sector siz
1b1c0 65 20 62 65 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a  e below 512..*/.
1b1d0 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53  static void setS
1b1e0 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20  ectorSize(Pager 
1b1f0 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65  *pPager){.  asse
1b200 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1b210 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
1b220 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20  ->tempFile );.. 
1b230 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
1b240 70 46 69 6c 65 0a 20 20 20 7c 7c 20 28 73 71 6c  pFile.   || (sql
1b250 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
1b260 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
1b270 65 72 2d 3e 66 64 29 20 26 20 0a 20 20 20 20 20  er->fd) & .     
1b280 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1b290 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f  IOCAP_POWERSAFE_
1b2a0 4f 56 45 52 57 52 49 54 45 29 21 3d 30 0a 20 20  OVERWRITE)!=0.  
1b2b0 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72  ){.    /* Sector
1b2c0 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61   size doesn't ma
1b2d0 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61  tter for tempora
1b2e0 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20  ry files. Also, 
1b2f0 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
1b300 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65  may not have bee
1b310 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e  n opened yet, in
1b320 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
1b330 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20  OsSectorSize(). 
1b340 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20     ** call will 
1b350 73 65 67 66 61 75 6c 74 2e 20 2a 2f 0a 20 20 20  segfault. */.   
1b360 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
1b370 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c  ize = 512;.  }el
1b380 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
1b390 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c  sectorSize = sql
1b3a0 69 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28 70  ite3SectorSize(p
1b3b0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a  Pager->fd);.  }.
1b3c0 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
1b3d0 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  k the journal an
1b3e0 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74  d thus restore t
1b3f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b400 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65   to.** the state
1b410 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72   it was in befor
1b420 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b  e we started mak
1b430 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a  ing changes.  .*
1b440 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
1b450 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20   file format is 
1b460 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a  as follows: .**.
1b470 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20  **  (1)  8 byte 
1b480 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20  prefix.  A copy 
1b490 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of aJournalMagic
1b4a0 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62  []..**  (2)  4 b
1b4b0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
1b4c0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
1b4d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61  the number of va
1b4e0 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73  lid page records
1b4f0 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65  .**       in the
1b500 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68   journal.  If th
1b510 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  is value is 0xff
1b520 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d  ffffff, then com
1b530 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  pute the.**     
1b540 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65    number of page
1b550 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68   records from th
1b560 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a  e journal size..
1b570 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20  **  (3)  4 byte 
1b580 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
1b590 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
1b5a0 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f  initial value fo
1b5b0 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20  r the .**       
1b5c0 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e  sanity checksum.
1b5d0 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65  .**  (4)  4 byte
1b5e0 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1b5f0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1b600 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74  pages to truncat
1b610 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64  e the.**       d
1b620 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e  atabase to durin
1b630 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  g a rollback..**
1b640 20 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69    (5)  4 byte bi
1b650 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
1b660 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65   which is the se
1b670 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20  ctor size.  The 
1b680 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20  header.**       
1b690 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  is this many byt
1b6a0 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20  es in size..**  
1b6b0 28 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (6)  4 byte big-
1b6c0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
1b6d0 68 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65  hich is the page
1b6e0 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20   size..**  (7)  
1b6f0 7a 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74  zero padding out
1b700 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
1b710 74 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38  tor size..**  (8
1b720 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  )  Zero or more 
1b730 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c  pages instances,
1b740 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73   each as follows
1b750 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  :.**        +  4
1b760 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
1b770 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  r..**        +  
1b780 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1b790 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a   bytes of data..
1b7a0 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
1b7b0 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a  yte checksum.**.
1b7c0 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b  ** When we speak
1b7d0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1b7e0 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20  header, we mean 
1b7f0 74 68 65 20 66 69 72 73 74 20 37 20 69 74 65 6d  the first 7 item
1b800 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68  s above..** Each
1b810 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f   entry in the jo
1b820 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74  urnal is an inst
1b830 61 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68 20  ance of the 8th 
1b840 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  item..**.** Call
1b850 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20   the value from 
1b860 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65  the second bulle
1b870 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20  t "nRec".  nRec 
1b880 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1b890 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65  .** valid page e
1b8a0 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f  ntries in the jo
1b8b0 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20  urnal.  In most 
1b8c0 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63  cases, you can c
1b8d0 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61  ompute the.** va
1b8e0 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d  lue of nRec from
1b8f0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1b900 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
1b910 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a  But if a power.*
1b920 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  * failure occurr
1b930 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ed while the jou
1b940 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77  rnal was being w
1b950 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64  ritten, it could
1b960 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20   be the.** case 
1b970 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66  that the size of
1b980 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b990 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65  e had already be
1b9a0 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74  en increased but
1b9b0 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e  .** the extra en
1b9c0 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65  tries had not ye
1b9d0 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79  t made it safely
1b9e0 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75   to disk.  In su
1b9f0 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68  ch a case,.** th
1ba00 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
1ba10 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68  computed from th
1ba20 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c  e file size woul
1ba30 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20  d be too large. 
1ba40 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61   For.** that rea
1ba50 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75  son, we always u
1ba60 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  se the nRec valu
1ba70 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  e in the header.
1ba80 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52  .**.** If the nR
1ba90 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  ec value is 0xff
1baa0 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20  ffffff it means 
1bab0 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64  that nRec should
1bac0 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20   be computed.** 
1bad0 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
1bae0 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ze.  This value 
1baf0 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  is used when the
1bb00 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68   user selects th
1bb10 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74  e.** no-sync opt
1bb20 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  ion for the jour
1bb30 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61  nal.  A power fa
1bb40 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64  ilure could lead
1bb50 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a   to corruption.*
1bb60 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  * in this case. 
1bb70 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20   But for things 
1bb80 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74  like temporary t
1bb90 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c  able (which will
1bba0 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77   be.** deleted w
1bbb0 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73  hen the power is
1bbc0 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f   restored) we do
1bbd0 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a  n't care.  .**.*
1bbe0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70  * If the file op
1bbf0 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72  ened as the jour
1bc00 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
1bc10 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a  a well-formed.**
1bc20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
1bc30 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20  en all pages up 
1bc40 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72  to the first cor
1bc50 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20  rupted page are 
1bc60 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28  rolled.** back (
1bc70 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74  or no pages if t
1bc80 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
1bc90 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e  r is corrupted).
1bca0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
1bcb0 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c  e.** is then del
1bcc0 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  eted and SQLITE_
1bcd0 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73  OK returned, jus
1bce0 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75  t as if no corru
1bcf0 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65  ption had.** bee
1bd00 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  n encountered..*
1bd10 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f  *.** If an I/O o
1bd20 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
1bd30 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75   occurs, the jou
1bd40 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74  rnal-file is not
1bd50 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20   deleted.** and 
1bd60 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
1bd70 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
1bd80 20 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d   The isHot param
1bd90 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74  eter indicates t
1bda0 68 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  hat we are tryin
1bdb0 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  g to rollback a 
1bdc0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20  journal.** that 
1bdd0 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a  might be a hot j
1bde0 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20  ournal.  Or, it 
1bdf0 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68  could be that th
1be00 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a  e journal is .**
1be10 20 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75   preserved becau
1be20 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44  se of JOURNALMOD
1be30 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55  E_PERSIST or JOU
1be40 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
1be50 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  E..** If the jou
1be60 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68  rnal really is h
1be70 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61  ot, reset the pa
1be80 67 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20  ger cache prior 
1be90 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20  rolling.** back 
1bea0 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66  any content.  If
1beb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1bec0 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e  merely persisten
1bed0 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a  t, no reset is.*
1bee0 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  * needed..*/.sta
1bef0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
1bf00 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
1bf10 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29  ager, int isHot)
1bf20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
1bf30 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e  *pVfs = pPager->
1bf40 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b  pVfs;.  i64 szJ;
1bf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf60 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1bf70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
1bf80 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e  bytes */.  u32 n
1bf90 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
1bfa0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1bfb0 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   Records in the 
1bfc0 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
1bfd0 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
1bfe0 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
1bff0 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
1c000 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
1c010 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
1c020 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
1c030 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
1c040 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  es */.  int rc; 
1c050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c060 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
1c070 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  of a subroutine 
1c080 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31  */.  int res = 1
1c090 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1c0a0 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
1c0b0 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  by sqlite3OsAcce
1c0c0 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ss() */.  char *
1c0d0 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20  zMaster = 0;    
1c0e0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61     /* Name of ma
1c0f0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1c100 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e  e if any */.  in
1c110 74 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  t needPagerReset
1c120 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74  ;      /* True t
1c130 6f 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69  o reset page pri
1c140 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65  or to first page
1c150 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69   rollback */.  i
1c160 6e 74 20 6e 50 6c 61 79 62 61 63 6b 20 3d 20 30  nt nPlayback = 0
1c170 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  ;       /* Total
1c180 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1c190 20 72 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 6a   restored from j
1c1a0 6f 75 72 6e 61 6c 20 2a 2f 0a 0a 20 20 2f 2a 20  ournal */..  /* 
1c1b0 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
1c1c0 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20  any records are 
1c1d0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
1c1e0 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a   Abort early if.
1c1f0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
1c200 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a   is empty..  */.
1c210 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1c220 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
1c230 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
1c240 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
1c250 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20  ->jfd, &szJ);.  
1c260 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c270 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
1c280 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
1c290 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d  .  /* Read the m
1c2a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
1c2b0 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  me from the jour
1c2c0 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72  nal, if it is pr
1c2d0 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61  esent..  ** If a
1c2e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1c2f0 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65  file name is spe
1c300 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20  cified, but the 
1c310 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  file is not.  **
1c320 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b   present on disk
1c330 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
1c340 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e  al is not hot an
1c350 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  d does not need 
1c360 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65  to be.  ** playe
1c370 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a  d back..  **.  *
1c380 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61  * TODO: Technica
1c390 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  lly the followin
1c3a0 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65  g is an error be
1c3b0 63 61 75 73 65 20 69 74 20 61 73 73 75 6d 65 73  cause it assumes
1c3c0 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65   that.  ** buffe
1c3d0 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  r Pager.pTmpSpac
1c3e0 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65  e is (mxPathname
1c3f0 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72  +1) bytes or lar
1c400 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20  ger. i.e. that. 
1c410 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67   ** (pPager->pag
1c420 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d  eSize >= pPager-
1c430 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
1c440 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75  e+1). Using os_u
1c450 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 6d 78 50 61  nix.c,.  ** mxPa
1c460 74 68 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77  thname is 512, w
1c470 68 69 63 68 20 69 73 20 74 68 65 20 73 61 6d 65  hich is the same
1c480 20 61 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20   as the minimum 
1c490 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a  allowable value.
1c4a0 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a    ** for pageSiz
1c4b0 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65  e..  */.  zMaste
1c4c0 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  r = pPager->pTmp
1c4d0 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65  Space;.  rc = re
1c4e0 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
1c4f0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
1c500 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
1c510 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
1c520 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1c530 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65  ITE_OK && zMaste
1c540 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d  r[0] ){.    rc =
1c550 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
1c560 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
1c570 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
1c580 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d  ISTS, &res);.  }
1c590 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a  .  zMaster = 0;.
1c5a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c5b0 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20  _OK || !res ){. 
1c5c0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1c5d0 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  back;.  }.  pPag
1c5e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
1c5f0 20 30 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52   0;.  needPagerR
1c600 65 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20  eset = isHot;.. 
1c610 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65   /* This loop te
1c620 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20  rminates either 
1c630 77 68 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e  when a readJourn
1c640 61 6c 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a  alHdr() or .  **
1c650 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
1c660 6f 6e 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20  one_page() call 
1c670 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
1c680 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72  ONE or an IO err
1c690 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e  or .  ** occurs.
1c6a0 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20   .  */.  while( 
1c6b0 31 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64  1 ){.    /* Read
1c6c0 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61   the next journa
1c6d0 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68  l header from th
1c6e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
1c6f0 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20   If there are.  
1c700 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20    ** not enough 
1c710 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68  bytes left in th
1c720 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
1c730 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65  or a complete he
1c740 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  ader, or.    ** 
1c750 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c  it is corrupted,
1c760 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   then a process 
1c770 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
1c780 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69   while writing i
1c790 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  t..    ** This i
1c7a0 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67  ndicates nothing
1c7b0 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62   more needs to b
1c7c0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20  e rolled back.. 
1c7d0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72     */.    rc = r
1c7e0 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
1c7f0 61 67 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a  ager, isHot, szJ
1c800 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b  , &nRec, &mxPg);
1c810 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1c820 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20  ITE_OK ){ .     
1c830 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c840 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
1c850 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1c860 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
1c870 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1c880 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
1c890 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66  f nRec is 0xffff
1c8a0 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20  ffff, then this 
1c8b0 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61  journal was crea
1c8c0 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
1c8d0 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20  .    ** working 
1c8e0 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e  in no-sync mode.
1c8f0 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
1c900 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
1c910 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
1c920 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  file consists of
1c930 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72   pages, there ar
1c940 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61  e no more journa
1c950 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75  l headers. Compu
1c960 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61  te.    ** the va
1c970 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65  lue of nRec base
1c980 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70  d on this assump
1c990 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
1c9a0 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66   if( nRec==0xfff
1c9b0 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61  fffff ){.      a
1c9c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
1c9d0 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
1c9e0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1c9f0 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20  ) );.      nRec 
1ca00 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a  = (int)((szJ - J
1ca10 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
1ca20 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50  ager))/JOURNAL_P
1ca30 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
1ca40 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1ca50 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68  nRec is 0 and th
1ca60 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f  is rollback is o
1ca70 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
1ca80 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a  created by this.
1ca90 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61      ** process a
1caa0 6e 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68  nd if this is th
1cab0 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69  e final header i
1cac0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  n the journal, t
1cad0 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20  hen it means.   
1cae0 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61   ** that this pa
1caf0 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
1cb00 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c  l was being fill
1cb10 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79  ed but has not y
1cb20 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73  et been.    ** s
1cb30 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20  ynced to disk.  
1cb40 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62  Compute the numb
1cb50 65 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65  er of pages base
1cb60 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69  d on the remaini
1cb70 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f  ng.    ** size o
1cb80 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  f the file..    
1cb90 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68  **.    ** The th
1cba0 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ird term of the 
1cbb0 74 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74  test was added t
1cbc0 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35  o fix ticket #25
1cbd0 36 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20  65..    ** When 
1cbe0 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68  rolling back a h
1cbf0 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63  ot journal, nRec
1cc00 3d 3d 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73  ==0 always means
1cc10 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20   that the next. 
1cc20 20 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74     ** chunk of t
1cc30 68 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61  he journal conta
1cc40 69 6e 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74  ins zero pages t
1cc50 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
1cc60 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68  .  But.    ** wh
1cc70 65 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42  en doing a ROLLB
1cc80 41 43 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63  ACK and the nRec
1cc90 3d 3d 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65  ==0 chunk is the
1cca0 20 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20   last chunk in. 
1ccb0 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
1ccc0 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  l, it means that
1ccd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67   the journal mig
1cce0 68 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74  ht contain addit
1ccf0 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67  ional.    ** pag
1cd00 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  es that need to 
1cd10 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
1cd20 6e 64 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  nd that the numb
1cd30 65 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20  er of pages .   
1cd40 20 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f   ** should be co
1cd50 6d 70 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20  mputed based on 
1cd60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1cd70 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
1cd80 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26    if( nRec==0 &&
1cd90 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20   !isHot &&.     
1cda0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1cdb0 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
1cdc0 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
1cdd0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1cde0 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   ){.      nRec =
1cdf0 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50   (int)((szJ - pP
1ce00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1ce10 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) / JOURNAL_PG_S
1ce20 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
1ce30 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
1ce40 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68  s is the first h
1ce50 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20  eader read from 
1ce60 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75  the journal, tru
1ce70 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  ncate the.    **
1ce80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
1ce90 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
1cea0 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  nal size..    */
1ceb0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1cec0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
1ced0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
1cee0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
1cef0 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
1cf00 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a  (pPager, mxPg);.
1cf10 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1cf20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1cf30 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
1cf40 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  back;.      }.  
1cf50 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
1cf60 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d  ze = mxPg;.    }
1cf70 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72  ..    /* Copy or
1cf80 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
1cf90 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1cfa0 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
1cfb0 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  e .    ** databa
1cfc0 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70  se file and/or p
1cfd0 61 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a  age cache..    *
1cfe0 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75  /.    for(u=0; u
1cff0 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20  <nRec; u++){.   
1d000 20 20 20 69 66 28 20 6e 65 65 64 50 61 67 65 72     if( needPager
1d010 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20  Reset ){.       
1d020 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
1d030 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65  ger);.        ne
1d040 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 30  edPagerReset = 0
1d050 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d060 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
1d070 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
1d080 67 65 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75  ger,&pPager->jou
1d090 72 6e 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a  rnalOff,0,1,0);.
1d0a0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1d0b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d0c0 20 20 20 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a     nPlayback++;.
1d0d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d0e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1d0f0 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
1d100 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1d110 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
1d120 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1d130 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1d140 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
1d150 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
1d160 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
1d170 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  f the journal ha
1d180 73 20 62 65 65 6e 20 74 72 75 6e 63 61 74 65 64  s been truncated
1d190 2c 20 73 69 6d 70 6c 79 20 73 74 6f 70 20 72 65  , simply stop re
1d1a0 61 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20  ading and.      
1d1b0 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e      ** processin
1d1c0 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54  g the journal. T
1d1d0 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e  his might happen
1d1e0 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
1d1f0 77 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  was.          **
1d200 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   not completely 
1d210 77 72 69 74 74 65 6e 20 61 6e 64 20 73 79 6e 63  written and sync
1d220 65 64 20 70 72 69 6f 72 20 74 6f 20 61 20 63 72  ed prior to a cr
1d230 61 73 68 2e 20 20 49 6e 20 74 68 61 74 0a 20 20  ash.  In that.  
1d240 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 2c          ** case,
1d250 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68   the database sh
1d260 6f 75 6c 64 20 68 61 76 65 20 6e 65 76 65 72 20  ould have never 
1d270 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 20  been written in 
1d280 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
1d290 20 66 69 72 73 74 20 70 6c 61 63 65 20 73 6f 20   first place so 
1d2a0 69 74 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70  it is OK to simp
1d2b0 6c 79 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72  ly abandon the r
1d2c0 6f 6c 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20  ollback. */.    
1d2d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1d2e0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
1d2f0 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1d300 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
1d310 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
1d320 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  f we are unable 
1d330 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69  to rollback, qui
1d340 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  t and return the
1d350 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20   error.         
1d360 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20   ** code.  This 
1d370 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70  will cause the p
1d380 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68  ager to enter th
1d390 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20  e error state.  
1d3a0 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68          ** so th
1d3b0 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61  at no further ha
1d3c0 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e  rm will be done.
1d3d0 20 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 65    Perhaps the ne
1d3e0 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  xt.          ** 
1d3f0 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20  process to come 
1d400 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62  along will be ab
1d410 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  le to rollback t
1d420 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  he database..   
1d430 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1d440 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
1d450 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
1d460 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d470 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45   }.  /*NOTREACHE
1d480 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20  D*/.  assert( 0 
1d490 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b  );..end_playback
1d4a0 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67  :.  /* Following
1d4b0 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65   a rollback, the
1d4c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
1d4d0 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e  hould be back in
1d4e0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20   its original.  
1d4f0 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20 74  ** state prior t
1d500 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
1d510 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
1d520 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20  so invoke the.  
1d530 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ** SQLITE_FCNTL_
1d540 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c  DB_UNCHANGED fil
1d550 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64  e-control method
1d560 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a   to disable the.
1d570 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74    ** assertion t
1d580 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
1d590 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
1d5a0 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 23  modified..  */.#
1d5b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1d5c0 55 47 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  UG.  if( pPager-
1d5d0 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  >fd->pMethods ){
1d5e0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69  .    sqlite3OsFi
1d5f0 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50  leControlHint(pP
1d600 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f  ager->fd,SQLITE_
1d610 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
1d620 45 44 2c 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ED,0);.  }.#endi
1d630 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  f..  /* If this 
1d640 70 6c 61 79 62 61 63 6b 20 69 73 20 68 61 70 70  playback is happ
1d650 65 6e 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 61  ening automatica
1d660 6c 6c 79 20 61 73 20 61 20 72 65 73 75 6c 74 20  lly as a result 
1d670 6f 66 20 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a  of an IO or .  *
1d680 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74  * malloc error t
1d690 68 61 74 20 6f 63 63 75 72 72 65 64 20 61 66 74  hat occurred aft
1d6a0 65 72 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  er the change-co
1d6b0 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65  unter was update
1d6c0 64 20 62 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f  d but .  ** befo
1d6d0 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
1d6e0 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64  on was committed
1d6f0 2c 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67  , then the chang
1d700 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20  e-counter .  ** 
1d710 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 61 79  modification may
1d720 20 6a 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   just have been 
1d730 72 65 76 65 72 74 65 64 2e 20 49 66 20 74 68 69  reverted. If thi
1d740 73 20 68 61 70 70 65 6e 73 20 69 6e 20 65 78 63  s happens in exc
1d750 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64  lusive .  ** mod
1d760 65 2c 20 74 68 65 6e 20 73 75 62 73 65 71 75 65  e, then subseque
1d770 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  nt transactions 
1d780 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68 65  performed by the
1d790 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c   connection will
1d7a0 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64 61 74 65   not.  ** update
1d7b0 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
1d7c0 74 65 72 20 61 74 20 61 6c 6c 2e 20 54 68 69 73  ter at all. This
1d7d0 20 6d 61 79 20 6c 65 61 64 20 74 6f 20 63 61 63   may lead to cac
1d7e0 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79  he inconsistency
1d7f0 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66  .  ** problems f
1d800 6f 72 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  or other process
1d810 65 73 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74  es at some point
1d820 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20   in the future. 
1d830 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e  So, just.  ** in
1d840 20 63 61 73 65 20 74 68 69 73 20 68 61 73 20 68   case this has h
1d850 61 70 70 65 6e 65 64 2c 20 63 6c 65 61 72 20 74  appened, clear t
1d860 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
1d870 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a  ne flag now..  *
1d880 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  /.  pPager->chan
1d890 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50  geCountDone = pP
1d8a0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
1d8b0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1d8c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73  E_OK ){.    zMas
1d8d0 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ter = pPager->pT
1d8e0 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20  mpSpace;.    rc 
1d8f0 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
1d900 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
1d910 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
1d920 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
1d930 6d 65 2b 31 29 3b 0a 20 20 20 20 74 65 73 74 63  me+1);.    testc
1d940 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
1d950 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OK );.  }.  if( 
1d960 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  rc==SQLITE_OK.  
1d970 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74   && (pPager->eSt
1d980 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
1d990 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65  R_DBMOD || pPage
1d9a0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1d9b0 5f 4f 50 45 4e 29 0a 20 20 29 7b 0a 20 20 20 20  _OPEN).  ){.    
1d9c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1d9d0 72 53 79 6e 63 28 70 50 61 67 65 72 2c 20 30 29  rSync(pPager, 0)
1d9e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1d9f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1da00 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
1da10 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
1da20 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d  er, zMaster[0]!=
1da30 27 5c 30 27 2c 20 30 29 3b 0a 20 20 20 20 74 65  '\0', 0);.    te
1da40 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1da50 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1da60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1da70 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26   && zMaster[0] &
1da80 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20  & res ){.    /* 
1da90 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d  If there was a m
1daa0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
1dab0 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  d this routine w
1dac0 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65  ill return succe
1dad0 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69  ss,.    ** see i
1dae0 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
1daf0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
1db00 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20  aster journal.. 
1db10 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
1db20 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70  ager_delmaster(p
1db30 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
1db40 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1db50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1db60 20 20 7d 0a 20 20 69 66 28 20 69 73 48 6f 74 20    }.  if( isHot 
1db70 26 26 20 6e 50 6c 61 79 62 61 63 6b 20 29 7b 0a  && nPlayback ){.
1db80 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
1db90 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
1dba0 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20  COVER_ROLLBACK, 
1dbb0 22 72 65 63 6f 76 65 72 65 64 20 25 64 20 70 61  "recovered %d pa
1dbc0 67 65 73 20 66 72 6f 6d 20 25 73 22 2c 0a 20 20  ges from %s",.  
1dbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 50                nP
1dbe0 6c 61 79 62 61 63 6b 2c 20 70 50 61 67 65 72 2d  layback, pPager-
1dbf0 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a  >zJournal);.  }.
1dc00 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e  .  /* The Pager.
1dc10 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
1dc20 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ble may have bee
1dc30 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20  n updated while 
1dc40 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63  rolling.  ** bac
1dc50 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61  k a journal crea
1dc60 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
1dc70 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
1dc80 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20  t sector size.  
1dc90 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20  ** value. Reset 
1dca0 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  it to the correc
1dcb0 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  t value for this
1dcc0 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   process..  */. 
1dcd0 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
1dce0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
1dcf0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
1dd00 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ead the content 
1dd10 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75 74  for page pPg out
1dd20 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1dd30 20 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a   file and into .
1dd40 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41  ** pPg->pData. A
1dd50 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20   shared lock or 
1dd60 67 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20  greater must be 
1dd70 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1dd80 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66  base.** file bef
1dd90 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
1dda0 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
1ddb0 2a 2a 20 49 66 20 70 61 67 65 20 31 20 69 73 20  ** If page 1 is 
1ddc0 72 65 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76  read, then the v
1ddd0 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
1dde0 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65  FileVers[] is se
1ddf0 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75  t to.** the valu
1de00 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
1de10 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1de20 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
1de30 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
1de40 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73   the IO error is
1de50 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
1de60 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65   caller..** Othe
1de70 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
1de80 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1de90 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
1dea0 44 62 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  DbPage(PgHdr *pP
1deb0 67 2c 20 75 33 32 20 69 46 72 61 6d 65 29 7b 0a  g, u32 iFrame){.
1dec0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1ded0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f  = pPg->pPager; /
1dee0 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 61  * Pager object a
1def0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
1df00 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67 6e  age pPg */.  Pgn
1df10 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  o pgno = pPg->pg
1df20 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67  no;       /* Pag
1df30 65 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61 64  e number to read
1df40 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
1df50 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
1df60 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1df70 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20  e */.  int pgsz 
1df80 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
1df90 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ze; /* Number of
1dfa0 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
1dfb0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
1dfc0 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
1dfd0 45 52 5f 52 45 41 44 45 52 20 26 26 20 21 4d 45  ER_READER && !ME
1dfe0 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
1dff0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1e000 66 64 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  fd) );..#ifndef 
1e010 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1e020 20 20 69 66 28 20 69 46 72 61 6d 65 20 29 7b 0a    if( iFrame ){.
1e030 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75      /* Try to pu
1e040 6c 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ll the page from
1e050 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64   the write-ahead
1e060 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20   log. */.    rc 
1e070 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64  = sqlite3WalRead
1e080 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
1e090 61 6c 2c 20 69 46 72 61 6d 65 2c 20 70 67 73 7a  al, iFrame, pgsz
1e0a0 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20  , pPg->pData);. 
1e0b0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
1e0c0 7b 0a 20 20 20 20 69 36 34 20 69 4f 66 66 73 65  {.    i64 iOffse
1e0d0 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
1e0e0 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
1e0f0 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ze;.    rc = sql
1e100 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
1e110 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74  r->fd, pPg->pDat
1e120 61 2c 20 70 67 73 7a 2c 20 69 4f 66 66 73 65 74  a, pgsz, iOffset
1e130 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1e140 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1e150 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
1e160 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e170 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1e180 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
1e190 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1e1a0 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64 20 69  /* If the read i
1e1b0 73 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20  s unsuccessful, 
1e1c0 73 65 74 20 74 68 65 20 64 62 46 69 6c 65 56 65  set the dbFileVe
1e1d0 72 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e  rs[] to somethin
1e1e0 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  g.      ** that 
1e1f0 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20  will never be a 
1e200 76 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69  valid file versi
1e210 6f 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b  on.  dbFileVers[
1e220 5d 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20  ] is a copy.    
1e230 20 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34    ** of bytes 24
1e240 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61  ..39 of the data
1e250 62 61 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e  base.  Bytes 28.
1e260 2e 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  .31 should alway
1e270 73 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65  s be.      ** ze
1e280 72 6f 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f  ro or the size o
1e290 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1e2a0 6e 20 70 61 67 65 2e 20 42 79 74 65 73 20 33 32  n page. Bytes 32
1e2b0 2e 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a  ..35 and 35..39.
1e2c0 20 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20        ** should 
1e2d0 62 65 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  be page numbers 
1e2e0 77 68 69 63 68 20 61 72 65 20 6e 65 76 65 72 20  which are never 
1e2f0 30 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20  0xffffffff.  So 
1e300 66 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a  filling.      **
1e310 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56   pPager->dbFileV
1e320 65 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30  ers[] with all 0
1e330 78 66 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64  xff bytes should
1e340 20 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20   suffice..      
1e350 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20  **.      ** For 
1e360 61 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 74  an encrypted dat
1e370 61 62 61 73 65 2c 20 74 68 65 20 73 69 74 75 61  abase, the situa
1e380 74 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d  tion is more com
1e390 70 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20  plex:  bytes.   
1e3a0 20 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20     ** 24..39 of 
1e3b0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 72 65  the database are
1e3c0 20 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42   white noise.  B
1e3d0 75 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69  ut the probabili
1e3e0 74 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77  ty of.      ** w
1e3f0 68 69 74 65 20 6e 6f 69 73 65 20 65 71 75 61 6c  hite noise equal
1e400 69 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66 20  ing 16 bytes of 
1e410 30 78 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e  0xff is vanishin
1e420 67 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20  gly small so.   
1e430 20 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20     ** we should 
1e440 73 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20  still be ok..   
1e450 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73     */.      mems
1e460 65 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  et(pPager->dbFil
1e470 65 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a  eVers, 0xff, siz
1e480 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
1e490 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65  leVers));.    }e
1e4a0 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64  lse{.      u8 *d
1e4b0 62 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75  bFileVers = &((u
1e4c0 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32  8*)pPg->pData)[2
1e4d0 34 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  4];.      memcpy
1e4e0 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
1e4f0 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
1e500 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
1e510 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
1e520 20 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43     }.  }.  CODEC
1e530 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  1(pPager, pPg->p
1e540 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72  Data, pgno, 3, r
1e550 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1e560 5f 42 4b 50 54 29 3b 0a 0a 20 20 50 41 47 45 52  _BKPT);..  PAGER
1e570 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
1e580 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
1e590 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  );.  PAGER_INCR(
1e5a0 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a  pPager->nRead);.
1e5b0 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e    IOTRACE(("PGIN
1e5c0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
1e5d0 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50 41 47  r, pgno));.  PAG
1e5e0 45 52 54 52 41 43 45 28 28 22 46 45 54 43 48 20  ERTRACE(("FETCH 
1e5f0 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
1e600 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
1e610 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
1e620 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
1e630 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
1e640 50 67 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e  Pg)));..  return
1e650 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70   rc;.}../*.** Up
1e660 64 61 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f  date the value o
1e670 66 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  f the change-cou
1e680 6e 74 65 72 20 61 74 20 6f 66 66 73 65 74 73 20  nter at offsets 
1e690 32 34 20 61 6e 64 20 39 32 20 69 6e 0a 2a 2a 20  24 and 92 in.** 
1e6a0 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 74  the header and t
1e6b0 68 65 20 73 71 6c 69 74 65 20 76 65 72 73 69 6f  he sqlite versio
1e6c0 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f 66 66 73  n number at offs
1e6d0 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  et 96..**.** Thi
1e6e0 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e 64 69 74  s is an uncondit
1e6f0 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e 20 20 53  ional update.  S
1e700 65 65 20 61 6c 73 6f 20 74 68 65 20 70 61 67 65  ee also the page
1e710 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
1e720 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  nter().** routin
1e730 65 20 77 68 69 63 68 20 6f 6e 6c 79 20 75 70 64  e which only upd
1e740 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d  ates the change-
1e750 63 6f 75 6e 74 65 72 20 69 66 20 74 68 65 20 75  counter if the u
1e760 70 64 61 74 65 20 69 73 20 61 63 74 75 61 6c 6c  pdate is actuall
1e770 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20 61 73 20  y.** needed, as 
1e780 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
1e790 65 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65  e pPager->change
1e7a0 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61 74 65 20  CountDone state 
1e7b0 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  variable..*/.sta
1e7c0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 77  tic void pager_w
1e7d0 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74  rite_changecount
1e7e0 65 72 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  er(PgHdr *pPg){.
1e7f0 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
1e800 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72  nter;..  /* Incr
1e810 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
1e820 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72  just read and wr
1e830 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62  ite it back to b
1e840 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61  yte 24. */.  cha
1e850 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71  nge_counter = sq
1e860 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75  lite3Get4byte((u
1e870 38 2a 29 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  8*)pPg->pPager->
1e880 64 62 46 69 6c 65 56 65 72 73 29 2b 31 3b 0a 20  dbFileVers)+1;. 
1e890 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
1e8a0 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 32  r*)pPg->pData)+2
1e8b0 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  4, change_counte
1e8c0 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 73  r);..  /* Also s
1e8d0 74 6f 72 65 20 74 68 65 20 53 51 4c 69 74 65 20  tore the SQLite 
1e8e0 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69  version number i
1e8f0 6e 20 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61  n bytes 96..99 a
1e900 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79 74 65 73  nd in.  ** bytes
1e910 20 39 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68   92..95 store th
1e920 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
1e930 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 76   for which the v
1e940 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20  ersion number.  
1e950 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a  ** is valid. */.
1e960 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
1e970 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b  ar*)pPg->pData)+
1e980 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  92, change_count
1e990 65 72 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  er);.  put32bits
1e9a0 28 28 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44  (((char*)pPg->pD
1e9b0 61 74 61 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f  ata)+96, SQLITE_
1e9c0 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b  VERSION_NUMBER);
1e9d0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1e9e0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
1e9f0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1ea00 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20  is invoked once 
1ea10 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 74 68  for each page th
1ea20 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  at has already b
1ea30 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20  een .** written 
1ea40 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c  into the log fil
1ea50 65 20 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61  e when a WAL tra
1ea60 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
1ea70 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61  ed back..** Para
1ea80 6d 65 74 65 72 20 69 50 67 20 69 73 20 74 68 65  meter iPg is the
1ea90 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1eaa0 73 61 69 64 20 70 61 67 65 2e 20 54 68 65 20 70  said page. The p
1eab0 43 74 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a  Ctx argument .**
1eac0 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70   is actually a p
1ead0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
1eae0 67 65 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ger structure..*
1eaf0 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67  *.** If page iPg
1eb00 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74   is present in t
1eb10 68 65 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61  he cache, and ha
1eb20 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
1eb30 20 72 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20   references,.** 
1eb40 69 74 20 69 73 20 64 69 73 63 61 72 64 65 64 2e  it is discarded.
1eb50 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1eb60 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20  here are one or 
1eb70 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67  more outstanding
1eb80 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20  .** references, 
1eb90 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
1eba0 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f   is reloaded fro
1ebb0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
1ebc0 49 66 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70  If the.** attemp
1ebd0 74 20 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74  t to reload cont
1ebe0 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ent from the dat
1ebf0 61 62 61 73 65 20 69 73 20 72 65 71 75 69 72 65  abase is require
1ec00 64 20 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a  d and fails, .**
1ec10 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
1ec20 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  e error code. Ot
1ec30 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
1ec40 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
1ec50 74 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  t pagerUndoCallb
1ec60 61 63 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20  ack(void *pCtx, 
1ec70 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74  Pgno iPg){.  int
1ec80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1ec90 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1eca0 20 3d 20 28 50 61 67 65 72 20 2a 29 70 43 74 78   = (Pager *)pCtx
1ecb0 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
1ecc0 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
1ecd0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
1ece0 3b 0a 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65  ;.  pPg = sqlite
1ecf0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61  3PagerLookup(pPa
1ed00 67 65 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28  ger, iPg);.  if(
1ed10 20 70 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20   pPg ){.    if( 
1ed20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
1ed30 65 52 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d  eRefcount(pPg)==
1ed40 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
1ed50 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67  e3PcacheDrop(pPg
1ed60 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1ed70 20 20 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d      u32 iFrame =
1ed80 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
1ed90 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72 61  qlite3WalFindFra
1eda0 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  me(pPager->pWal,
1edb0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 26 69 46 72   pPg->pgno, &iFr
1edc0 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
1edd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ede0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
1edf0 61 64 44 62 50 61 67 65 28 70 50 67 2c 20 69 46  adDbPage(pPg, iF
1ee00 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rame);.      }. 
1ee10 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1ee20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ee30 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
1ee40 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ter(pPg);.      
1ee50 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  }.      sqlite3P
1ee60 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
1ee70 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
1ee80 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  ..  /* Normally,
1ee90 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
1eea0 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1eeb0 2c 20 61 6e 79 20 62 61 63 6b 75 70 20 70 72 6f  , any backup pro
1eec0 63 65 73 73 65 73 20 61 72 65 0a 20 20 2a 2a 20  cesses are.  ** 
1eed0 75 70 64 61 74 65 64 20 61 73 20 64 61 74 61 20  updated as data 
1eee0 69 73 20 63 6f 70 69 65 64 20 6f 75 74 20 6f 66  is copied out of
1eef0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1ef00 75 72 6e 61 6c 20 61 6e 64 20 69 6e 74 6f 20 74  urnal and into t
1ef10 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
1ef20 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 67 65  . This is not ge
1ef30 6e 65 72 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  nerally possible
1ef40 20 77 69 74 68 20 61 20 57 41 4c 20 64 61 74 61   with a WAL data
1ef50 62 61 73 65 2c 20 61 73 0a 20 20 2a 2a 20 72 6f  base, as.  ** ro
1ef60 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c 76 65 73 20  llback involves 
1ef70 73 69 6d 70 6c 79 20 74 72 75 6e 63 61 74 69 6e  simply truncatin
1ef80 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  g the log file. 
1ef90 54 68 65 72 65 66 6f 72 65 2c 20 69 66 20 6f 6e  Therefore, if on
1efa0 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f 72 65 20 66  e.  ** or more f
1efb0 72 61 6d 65 73 20 68 61 76 65 20 61 6c 72 65 61  rames have alrea
1efc0 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
1efd0 74 6f 20 74 68 65 20 6c 6f 67 20 28 61 6e 64 20  to the log (and 
1efe0 74 68 65 72 65 66 6f 72 65 20 0a 20 20 2a 2a 20  therefore .  ** 
1eff0 61 6c 73 6f 20 63 6f 70 69 65 64 20 69 6e 74 6f  also copied into
1f000 20 74 68 65 20 62 61 63 6b 75 70 20 64 61 74 61   the backup data
1f010 62 61 73 65 73 29 20 61 73 20 70 61 72 74 20 6f  bases) as part o
1f020 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
1f030 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65 20 62 61 63  on,.  ** the bac
1f040 6b 75 70 73 20 6d 75 73 74 20 62 65 20 72 65 73  kups must be res
1f050 74 61 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 73  tarted..  */.  s
1f060 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
1f070 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
1f080 6b 75 70 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  kup);..  return 
1f090 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1f0a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1f0b0 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  lled to rollback
1f0c0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
1f0d0 6e 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  n a WAL database
1f0e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f0f0 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c  pagerRollbackWal
1f100 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1f110 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1f120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f130 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
1f140 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c  e */.  PgHdr *pL
1f150 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
1f160 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
1f170 66 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  f dirty pages to
1f180 20 72 65 76 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a   revert */..  /*
1f190 20 46 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 69   For all pages i
1f1a0 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74  n the cache that
1f1b0 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 64   are currently d
1f1c0 69 72 74 79 20 6f 72 20 68 61 76 65 20 61 6c 72  irty or have alr
1f1d0 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e 20 77  eady.  ** been w
1f1e0 72 69 74 74 65 6e 20 28 62 75 74 20 6e 6f 74 20  ritten (but not 
1f1f0 63 6f 6d 6d 69 74 74 65 64 29 20 74 6f 20 74 68  committed) to th
1f200 65 20 6c 6f 67 20 66 69 6c 65 2c 20 64 6f 20 6f  e log file, do o
1f210 6e 65 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20  ne of the .  ** 
1f220 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a  following:.  **.
1f230 20 20 2a 2a 20 20 20 2b 20 44 69 73 63 61 72 64    **   + Discard
1f240 20 74 68 65 20 63 61 63 68 65 64 20 70 61 67 65   the cached page
1f250 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3d 3d 30   (if refcount==0
1f260 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 2b 20 52  ), or.  **   + R
1f270 65 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65  eload page conte
1f280 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  nt from the data
1f290 62 61 73 65 20 28 69 66 20 72 65 66 63 6f 75 6e  base (if refcoun
1f2a0 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  t>0)..  */.  pPa
1f2b0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
1f2c0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
1f2d0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1f2e0 57 61 6c 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e  WalUndo(pPager->
1f2f0 70 57 61 6c 2c 20 70 61 67 65 72 55 6e 64 6f 43  pWal, pagerUndoC
1f300 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
1f310 29 70 50 61 67 65 72 29 3b 0a 20 20 70 4c 69 73  )pPager);.  pLis
1f320 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  t = sqlite3Pcach
1f330 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
1f340 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 77  r->pPCache);.  w
1f350 68 69 6c 65 28 20 70 4c 69 73 74 20 26 26 20 72  hile( pList && r
1f360 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1f370 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74      PgHdr *pNext
1f380 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
1f390 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1f3a0 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 28 76 6f  UndoCallback((vo
1f3b0 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 4c 69  id *)pPager, pLi
1f3c0 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70  st->pgno);.    p
1f3d0 4c 69 73 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20  List = pNext;.  
1f3e0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
1f3f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1f400 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70  nction is a wrap
1f410 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74  per around sqlit
1f420 65 33 57 61 6c 46 72 61 6d 65 73 28 29 2e 20 41  e3WalFrames(). A
1f430 73 20 77 65 6c 6c 20 61 73 20 6c 6f 67 67 69 6e  s well as loggin
1f440 67 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  g.** the content
1f450 73 20 6f 66 20 74 68 65 20 6c 69 73 74 20 6f 66  s of the list of
1f460 20 70 61 67 65 73 20 68 65 61 64 65 64 20 62 79   pages headed by
1f470 20 70 4c 69 73 74 20 28 63 6f 6e 6e 65 63 74 65   pList (connecte
1f480 64 20 62 79 20 70 44 69 72 74 79 29 2c 0a 2a 2a  d by pDirty),.**
1f490 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e   this function n
1f4a0 6f 74 69 66 69 65 73 20 61 6e 79 20 61 63 74 69  otifies any acti
1f4b0 76 65 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73  ve backup proces
1f4c0 73 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ses that the pag
1f4d0 65 73 20 68 61 76 65 0a 2a 2a 20 63 68 61 6e 67  es have.** chang
1f4e0 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ed. .**.** The l
1f4f0 69 73 74 20 6f 66 20 70 61 67 65 73 20 70 61 73  ist of pages pas
1f500 73 65 64 20 69 6e 74 6f 20 74 68 69 73 20 72 6f  sed into this ro
1f510 75 74 69 6e 65 20 69 73 20 61 6c 77 61 79 73 20  utine is always 
1f520 73 6f 72 74 65 64 20 62 79 20 70 61 67 65 20 6e  sorted by page n
1f530 75 6d 62 65 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c  umber..** Hence,
1f540 20 69 66 20 70 61 67 65 20 31 20 61 70 70 65 61   if page 1 appea
1f550 72 73 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  rs anywhere on t
1f560 68 65 20 6c 69 73 74 2c 20 69 74 20 77 69 6c 6c  he list, it will
1f570 20 62 65 20 74 68 65 20 66 69 72 73 74 20 70 61   be the first pa
1f580 67 65 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69  ge..*/ .static i
1f590 6e 74 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65  nt pagerWalFrame
1f5a0 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  s(.  Pager *pPag
1f5b0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
1f5c0 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
1f5d0 6a 65 63 74 20 2a 2f 0a 20 20 50 67 48 64 72 20  ject */.  PgHdr 
1f5e0 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20  *pList,         
1f5f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
1f600 74 20 6f 66 20 66 72 61 6d 65 73 20 74 6f 20 6c  t of frames to l
1f610 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 72  og */.  Pgno nTr
1f620 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
1f630 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1f640 61 73 65 20 73 69 7a 65 20 61 66 74 65 72 20 74  ase size after t
1f650 68 69 73 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20  his commit */.  
1f660 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20  int isCommit    
1f670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f680 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
1f690 69 73 20 61 20 63 6f 6d 6d 69 74 20 2a 2f 0a 29  is a commit */.)
1f6a0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
1f6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6c0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1f6d0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 69 73  de */.  int nLis
1f6e0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1f6f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1f700 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70 4c  r of pages in pL
1f710 69 73 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ist */.  PgHdr *
1f720 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
1f730 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
1f740 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 61 67  looping over pag
1f750 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  es */..  assert(
1f760 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 3b   pPager->pWal );
1f770 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
1f780 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
1f790 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72  E_DEBUG.  /* Ver
1f7a0 69 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67  ify that the pag
1f7b0 65 20 6c 69 73 74 20 69 73 20 69 6e 20 61 63 63  e list is in acc
1f7c0 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a  ending order */.
1f7d0 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
1f7e0 20 26 26 20 70 2d 3e 70 44 69 72 74 79 3b 20 70   && p->pDirty; p
1f7f0 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20  =p->pDirty){.   
1f800 20 61 73 73 65 72 74 28 20 70 2d 3e 70 67 6e 6f   assert( p->pgno
1f810 20 3c 20 70 2d 3e 70 44 69 72 74 79 2d 3e 70 67   < p->pDirty->pg
1f820 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  no );.  }.#endif
1f830 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ..  assert( pLis
1f840 74 2d 3e 70 44 69 72 74 79 3d 3d 30 20 7c 7c 20  t->pDirty==0 || 
1f850 69 73 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 69 66  isCommit );.  if
1f860 28 20 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  ( isCommit ){.  
1f870 20 20 2f 2a 20 49 66 20 61 20 57 41 4c 20 74 72    /* If a WAL tr
1f880 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69  ansaction is bei
1f890 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68  ng committed, th
1f8a0 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20  ere is no point 
1f8b0 69 6e 20 77 72 69 74 69 6e 67 0a 20 20 20 20 2a  in writing.    *
1f8c0 2a 20 61 6e 79 20 70 61 67 65 73 20 77 69 74 68  * any pages with
1f8d0 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72   page numbers gr
1f8e0 65 61 74 65 72 20 74 68 61 6e 20 6e 54 72 75 6e  eater than nTrun
1f8f0 63 61 74 65 20 69 6e 74 6f 20 74 68 65 20 57 41  cate into the WA
1f900 4c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 54  L file..    ** T
1f910 68 65 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  hey will never b
1f920 65 20 72 65 61 64 20 62 79 20 61 6e 79 20 63 6c  e read by any cl
1f930 69 65 6e 74 2e 20 53 6f 20 72 65 6d 6f 76 65 20  ient. So remove 
1f940 74 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 70 44  them from the pD
1f950 69 72 74 79 0a 20 20 20 20 2a 2a 20 6c 69 73 74  irty.    ** list
1f960 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 50 67   here. */.    Pg
1f970 48 64 72 20 2a 2a 70 70 4e 65 78 74 20 3d 20 26  Hdr **ppNext = &
1f980 70 4c 69 73 74 3b 0a 20 20 20 20 6e 4c 69 73 74  pList;.    nList
1f990 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 3d   = 0;.    for(p=
1f9a0 70 4c 69 73 74 3b 20 28 2a 70 70 4e 65 78 74 20  pList; (*ppNext 
1f9b0 3d 20 70 29 21 3d 30 3b 20 70 3d 70 2d 3e 70 44  = p)!=0; p=p->pD
1f9c0 69 72 74 79 29 7b 0a 20 20 20 20 20 20 69 66 28  irty){.      if(
1f9d0 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54 72 75 6e 63   p->pgno<=nTrunc
1f9e0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ate ){.        p
1f9f0 70 4e 65 78 74 20 3d 20 26 70 2d 3e 70 44 69 72  pNext = &p->pDir
1fa00 74 79 3b 0a 20 20 20 20 20 20 20 20 6e 4c 69 73  ty;.        nLis
1fa10 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t++;.      }.   
1fa20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
1fa30 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  List );.  }else{
1fa40 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20 31 3b 0a  .    nList = 1;.
1fa50 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 61 53    }.  pPager->aS
1fa60 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57  tat[PAGER_STAT_W
1fa70 52 49 54 45 5d 20 2b 3d 20 6e 4c 69 73 74 3b 0a  RITE] += nList;.
1fa80 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67  .  if( pList->pg
1fa90 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f 77 72  no==1 ) pager_wr
1faa0 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ite_changecounte
1fab0 72 28 70 4c 69 73 74 29 3b 0a 20 20 72 63 20 3d  r(pList);.  rc =
1fac0 20 73 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65   sqlite3WalFrame
1fad0 73 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  s(pPager->pWal, 
1fae0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
1faf0 61 67 65 53 69 7a 65 2c 20 70 4c 69 73 74 2c 20  ageSize, pList, 
1fb00 6e 54 72 75 6e 63 61 74 65 2c 20 69 73 43 6f 6d  nTruncate, isCom
1fb10 6d 69 74 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c  mit, pPager->wal
1fb20 53 79 6e 63 46 6c 61 67 73 0a 20 20 29 3b 0a 20  SyncFlags.  );. 
1fb30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1fb40 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 70 42  OK && pPager->pB
1fb50 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 66 6f 72  ackup ){.    for
1fb60 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
1fb70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20  ->pDirty){.     
1fb80 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
1fb90 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
1fba0 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28  ckup, p->pgno, (
1fbb0 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a  u8 *)p->pData);.
1fbc0 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
1fbd0 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
1fbe0 41 47 45 53 0a 20 20 70 4c 69 73 74 20 3d 20 73  AGES.  pList = s
1fbf0 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
1fc00 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
1fc10 43 61 63 68 65 29 3b 0a 20 20 66 6f 72 28 70 3d  Cache);.  for(p=
1fc20 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70  pList; p; p=p->p
1fc30 44 69 72 74 79 29 7b 0a 20 20 20 20 70 61 67 65  Dirty){.    page
1fc40 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70  r_set_pagehash(p
1fc50 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
1fc60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1fc70 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 72 65 61  *.** Begin a rea
1fc80 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  d transaction on
1fc90 20 74 68 65 20 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20   the WAL..**.** 
1fca0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65  This routine use
1fcb0 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 22  d to be called "
1fcc0 70 61 67 65 72 4f 70 65 6e 53 6e 61 70 73 68 6f  pagerOpenSnapsho
1fcd0 74 28 29 22 20 62 65 63 61 75 73 65 20 69 74 20  t()" because it 
1fce0 65 73 73 65 6e 74 69 61 6c 6c 79 0a 2a 2a 20 6d  essentially.** m
1fcf0 61 6b 65 73 20 61 20 73 6e 61 70 73 68 6f 74 20  akes a snapshot 
1fd00 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1fd10 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  at the current p
1fd20 6f 69 6e 74 20 69 6e 20 74 69 6d 65 20 61 6e 64  oint in time and
1fd30 20 70 72 65 73 65 72 76 65 73 0a 2a 2a 20 74 68   preserves.** th
1fd40 61 74 20 73 6e 61 70 73 68 6f 74 20 66 6f 72 20  at snapshot for 
1fd50 75 73 65 20 62 79 20 74 68 65 20 72 65 61 64 65  use by the reade
1fd60 72 20 69 6e 20 73 70 69 74 65 20 6f 66 20 63 6f  r in spite of co
1fd70 6e 63 75 72 72 65 6e 74 6c 79 20 63 68 61 6e 67  ncurrently chang
1fd80 65 73 20 62 79 0a 2a 2a 20 6f 74 68 65 72 20 77  es by.** other w
1fd90 72 69 74 65 72 73 20 6f 72 20 63 68 65 63 6b 70  riters or checkp
1fda0 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74  ointers..*/.stat
1fdb0 69 63 20 69 6e 74 20 70 61 67 65 72 42 65 67 69  ic int pagerBegi
1fdc0 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
1fdd0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1fde0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
1fdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe00 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
1fe10 65 20 2a 2f 0a 20 20 69 6e 74 20 63 68 61 6e 67  e */.  int chang
1fe20 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ed = 0;         
1fe30 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1fe40 66 20 63 61 63 68 65 20 6d 75 73 74 20 62 65 20  f cache must be 
1fe50 72 65 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65  reset */..  asse
1fe60 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
1fe70 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
1fe80 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1fe90 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
1fea0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
1feb0 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
1fec0 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33  );..  /* sqlite3
1fed0 57 61 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61  WalEndReadTransa
1fee0 63 74 69 6f 6e 28 29 20 77 61 73 20 6e 6f 74 20  ction() was not 
1fef0 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65 20 70  called for the p
1ff00 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20 74 72 61  revious.  ** tra
1ff10 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c 6f 63 6b  nsaction in lock
1ff20 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49  ing_mode=EXCLUSI
1ff30 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20 69 74 20  VE.  So call it 
1ff40 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a  now.  If we.  **
1ff50 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f   are in locking_
1ff60 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61 6e 64 20  mode=NORMAL and 
1ff70 45 6e 64 52 65 61 64 28 29 20 77 61 73 20 70 72  EndRead() was pr
1ff80 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 2c  eviously called,
1ff90 0a 20 20 2a 2a 20 74 68 65 20 64 75 70 6c 69 63  .  ** the duplic
1ffa0 61 74 65 20 63 61 6c 6c 20 69 73 20 68 61 72 6d  ate call is harm
1ffb0 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  less..  */.  sql
1ffc0 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72  ite3WalEndReadTr
1ffd0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
1ffe0 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72 63 20 3d  ->pWal);..  rc =
1fff0 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e   sqlite3WalBegin
20000 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
20010 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 63  pPager->pWal, &c
20020 68 61 6e 67 65 64 29 3b 0a 20 20 69 66 28 20 72  hanged);.  if( r
20030 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
20040 63 68 61 6e 67 65 64 20 29 7b 0a 20 20 20 20 70  changed ){.    p
20050 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
20060 72 29 3b 0a 20 20 20 20 69 66 28 20 55 53 45 46  r);.    if( USEF
20070 45 54 43 48 28 70 50 61 67 65 72 29 20 29 20 73  ETCH(pPager) ) s
20080 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
20090 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30  pPager->fd, 0, 0
200a0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
200b0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
200c0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
200d0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20  on is called as 
200e0 70 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  part of the tran
200f0 73 69 74 69 6f 6e 20 66 72 6f 6d 20 50 41 47 45  sition from PAGE
20100 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f 20 50 41 47  R_OPEN.** to PAG
20110 45 52 5f 52 45 41 44 45 52 20 73 74 61 74 65 20  ER_READER state 
20120 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
20130 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
20140 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 6e  abase file.** in
20150 20 70 61 67 65 73 20 28 61 73 73 75 6d 69 6e 67   pages (assuming
20160 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 63   the page size c
20170 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
20180 69 6e 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  in Pager.pageSiz
20190 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  e)..**.** If no 
201a0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51  error occurs, SQ
201b0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
201c0 6e 65 64 20 61 6e 64 20 74 68 65 20 73 69 7a 65  ned and the size
201d0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
201e0 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20 69 73 20  .** in pages is 
201f0 73 74 6f 72 65 64 20 69 6e 20 2a 70 6e 50 61 67  stored in *pnPag
20200 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  e. Otherwise, an
20210 20 65 72 72 6f 72 20 63 6f 64 65 20 28 70 65 72   error code (per
20220 68 61 70 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 49  haps.** SQLITE_I
20230 4f 45 52 52 5f 46 53 54 41 54 29 20 69 73 20 72  OERR_FSTAT) is r
20240 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50  eturned and *pnP
20250 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f  age is left unmo
20260 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  dified..*/.stati
20270 63 20 69 6e 74 20 70 61 67 65 72 50 61 67 65 63  c int pagerPagec
20280 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
20290 65 72 2c 20 50 67 6e 6f 20 2a 70 6e 50 61 67 65  er, Pgno *pnPage
202a0 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b  ){.  Pgno nPage;
202b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202c0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f       /* Value to
202d0 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 50   return via *pnP
202e0 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 51 75 65  age */..  /* Que
202f0 72 79 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73  ry the WAL sub-s
20300 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 64 61  ystem for the da
20310 74 61 62 61 73 65 20 73 69 7a 65 2e 20 54 68 65  tabase size. The
20320 20 57 61 6c 44 62 73 69 7a 65 28 29 0a 20 20 2a   WalDbsize().  *
20330 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
20340 6e 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 57  ns zero if the W
20350 41 4c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 28  AL is not open (
20360 69 2e 65 2e 20 50 61 67 65 72 2e 70 57 61 6c 3d  i.e. Pager.pWal=
20370 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 69 66 20  =0), or.  ** if 
20380 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
20390 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  e is not availab
203a0 6c 65 2e 20 54 68 65 20 64 61 74 61 62 61 73 65  le. The database
203b0 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 20 20 2a   size is not.  *
203c0 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f 6d  * available from
203d0 20 74 68 65 20 57 41 4c 20 73 75 62 2d 73 79 73   the WAL sub-sys
203e0 74 65 6d 20 69 66 20 74 68 65 20 6c 6f 67 20 66  tem if the log f
203f0 69 6c 65 20 69 73 20 65 6d 70 74 79 20 6f 72 0a  ile is empty or.
20400 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6e 6f    ** contains no
20410 20 76 61 6c 69 64 20 63 6f 6d 6d 69 74 74 65 64   valid committed
20420 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 20   transactions.. 
20430 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
20440 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
20450 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61 73  GER_OPEN );.  as
20460 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c  sert( pPager->eL
20470 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock>=SHARED_LOCK
20480 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
20490 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
204a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
204b0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  ager->tempFile==
204c0 30 20 29 3b 0a 20 20 6e 50 61 67 65 20 3d 20 73  0 );.  nPage = s
204d0 71 6c 69 74 65 33 57 61 6c 44 62 73 69 7a 65 28  qlite3WalDbsize(
204e0 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a  pPager->pWal);..
204f0 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 75 6d 62    /* If the numb
20500 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
20510 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
20520 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 72 6f  ot available fro
20530 6d 20 74 68 65 0a 20 20 2a 2a 20 57 41 4c 20 73  m the.  ** WAL s
20540 75 62 2d 73 79 73 74 65 6d 2c 20 64 65 74 65 72  ub-system, deter
20550 6d 69 6e 65 20 74 68 65 20 70 61 67 65 20 63 6f  mine the page co
20560 75 6e 74 65 20 62 61 73 65 64 20 6f 6e 20 74 68  unte based on th
20570 65 20 73 69 7a 65 20 6f 66 0a 20 20 2a 2a 20 74  e size of.  ** t
20580 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20590 2e 20 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f  .  If the size o
205a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
205b0 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e 0a 20 20  ile is not an.  
205c0 2a 2a 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  ** integer multi
205d0 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d  ple of the page-
205e0 73 69 7a 65 2c 20 72 6f 75 6e 64 20 75 70 20 74  size, round up t
205f0 68 65 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a  he result..  */.
20600 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 26    if( nPage==0 &
20610 26 20 41 4c 57 41 59 53 28 69 73 4f 70 65 6e 28  & ALWAYS(isOpen(
20620 70 50 61 67 65 72 2d 3e 66 64 29 29 20 29 7b 0a  pPager->fd)) ){.
20630 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b 20 20      i64 n = 0;  
20640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20650 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 62 20    /* Size of db 
20660 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
20670 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
20680 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
20690 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 3b  pPager->fd, &n);
206a0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
206b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
206c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
206d0 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67  .    nPage = (Pg
206e0 6e 6f 29 28 28 6e 2b 70 50 61 67 65 72 2d 3e 70  no)((n+pPager->p
206f0 61 67 65 53 69 7a 65 2d 31 29 20 2f 20 70 50 61  ageSize-1) / pPa
20700 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
20710 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
20720 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20   current number 
20730 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
20740 66 69 6c 65 20 69 73 20 67 72 65 61 74 65 72 20  file is greater 
20750 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f  than the.  ** co
20760 6e 66 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d  nfigured maximum
20770 20 70 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69   pager number, i
20780 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f  ncrease the allo
20790 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a  wed limit so.  *
207a0 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20  * that the file 
207b0 63 61 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a  can be read..  *
207c0 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50  /.  if( nPage>pP
207d0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a  ager->mxPgno ){.
207e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
207f0 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65  no = (Pgno)nPage
20800 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50 61 67 65  ;.  }..  *pnPage
20810 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75   = nPage;.  retu
20820 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
20830 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20840 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 43  OMIT_WAL./*.** C
20850 68 65 63 6b 20 69 66 20 74 68 65 20 2a 2d 77 61  heck if the *-wa
20860 6c 20 66 69 6c 65 20 74 68 61 74 20 63 6f 72 72  l file that corr
20870 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 64  esponds to the d
20880 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
20890 79 20 70 50 61 67 65 72 0a 2a 2a 20 65 78 69 73  y pPager.** exis
208a0 74 73 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ts if the databa
208b0 73 65 20 69 73 20 6e 6f 74 20 65 6d 70 79 2c 20  se is not empy, 
208c0 6f 72 20 76 65 72 69 66 79 20 74 68 61 74 20 74  or verify that t
208d0 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 64 6f  he *-wal file do
208e0 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 20  es.** not exist 
208f0 28 62 79 20 64 65 6c 65 74 69 6e 67 20 69 74 29  (by deleting it)
20900 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
20910 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a   file is empty..
20920 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
20930 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70  abase is not emp
20940 74 79 20 61 6e 64 20 74 68 65 20 2a 2d 77 61 6c  ty and the *-wal
20950 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 6f 70   file exists, op
20960 65 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  en the pager.** 
20970 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 20 49 66  in WAL mode.  If
20980 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
20990 20 65 6d 70 74 79 20 6f 72 20 69 66 20 6e 6f 20   empty or if no 
209a0 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74  *-wal file exist
209b0 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e 6f 20 65  s and.** if no e
209c0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6d 61 6b  rror occurs, mak
209d0 65 20 73 75 72 65 20 50 61 67 65 72 2e 6a 6f 75  e sure Pager.jou
209e0 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e 6f 74 20  rnalMode is not 
209f0 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f  set to.** PAGER_
20a00 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 2e  JOURNALMODE_WAL.
20a10 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
20a20 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e 20 65 72  LITE_OK or an er
20a30 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
20a40 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
20a50 68 6f 6c 64 20 61 20 53 48 41 52 45 44 20 6c 6f  hold a SHARED lo
20a60 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
20a70 73 65 20 66 69 6c 65 20 74 6f 20 63 61 6c 6c 20  se file to call 
20a80 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
20a90 2e 20 42 65 63 61 75 73 65 20 61 6e 20 45 58 43  . Because an EXC
20aa0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
20ab0 68 65 20 64 62 20 66 69 6c 65 20 69 73 20 72 65  he db file is re
20ac0 71 75 69 72 65 64 20 74 6f 20 64 65 6c 65 74 65  quired to delete
20ad0 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e 20 61 20   .** a WAL on a 
20ae0 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61 74 61 62  none-empty datab
20af0 61 73 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65  ase, this ensure
20b00 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72 61  s there is no ra
20b10 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a  ce condition .**
20b20 20 62 65 74 77 65 65 6e 20 74 68 65 20 78 41 63   between the xAc
20b30 63 65 73 73 28 29 20 62 65 6c 6f 77 20 61 6e 64  cess() below and
20b40 20 61 6e 20 78 44 65 6c 65 74 65 28 29 20 62 65   an xDelete() be
20b50 69 6e 67 20 65 78 65 63 75 74 65 64 20 62 79 20  ing executed by 
20b60 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65 72 20 63  some .** other c
20b70 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  onnection..*/.st
20b80 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70  atic int pagerOp
20b90 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 50  enWalIfPresent(P
20ba0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
20bb0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
20bc0 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
20bd0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
20be0 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 61  AGER_OPEN );.  a
20bf0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
20c00 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock>=SHARED_LOC
20c10 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  K );..  if( !pPa
20c20 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
20c30 0a 20 20 20 20 69 6e 74 20 69 73 57 61 6c 3b 20  .    int isWal; 
20c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c50 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 57 41     /* True if WA
20c60 4c 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f  L file exists */
20c70 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b  .    Pgno nPage;
20c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c90 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
20ca0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
20cb0 2a 2f 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67  */..    rc = pag
20cc0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
20cd0 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
20ce0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
20cf0 20 72 63 3b 0a 20 20 20 20 69 66 28 20 6e 50 61   rc;.    if( nPa
20d00 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ge==0 ){.      r
20d10 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
20d20 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
20d30 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20  , pPager->zWal, 
20d40 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
20d50 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  ==SQLITE_IOERR_D
20d60 45 4c 45 54 45 5f 4e 4f 45 4e 54 20 29 20 72 63  ELETE_NOENT ) rc
20d70 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
20d80 20 20 20 20 69 73 57 61 6c 20 3d 20 30 3b 0a 20      isWal = 0;. 
20d90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20da0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
20db0 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20 20  cess(.          
20dc0 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
20dd0 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 53 51 4c 49  ager->zWal, SQLI
20de0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
20df0 2c 20 26 69 73 57 61 6c 0a 20 20 20 20 20 20 29  , &isWal.      )
20e00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
20e10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
20e20 0a 20 20 20 20 20 20 69 66 28 20 69 73 57 61 6c  .      if( isWal
20e30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
20e40 63 61 73 65 28 20 73 71 6c 69 74 65 33 50 63 61  case( sqlite3Pca
20e50 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61  chePagecount(pPa
20e60 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
20e70 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
20e80 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
20e90 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29 3b  nWal(pPager, 0);
20ea0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
20eb0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20ec0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
20ed0 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 29 7b 0a 20  NALMODE_WAL ){. 
20ee0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
20ef0 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
20f00 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
20f10 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20  ELETE;.      }. 
20f20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
20f30 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n rc;.}.#endif..
20f40 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73  /*.** Playback s
20f50 61 76 65 70 6f 69 6e 74 20 70 53 61 76 65 70 6f  avepoint pSavepo
20f60 69 6e 74 2e 20 4f 72 2c 20 69 66 20 70 53 61 76  int. Or, if pSav
20f70 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68  epoint==NULL, th
20f80 65 6e 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74  en playback.** t
20f90 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
20fa0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
20fb0 68 65 20 63 61 73 65 20 70 53 61 76 65 70 6f 69  he case pSavepoi
20fc0 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20  nt==NULL occurs 
20fd0 77 68 65 6e 20 0a 2a 2a 20 61 20 52 4f 4c 4c 42  when .** a ROLLB
20fe0 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69  ACK TO command i
20ff0 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 61 20 53  s invoked on a S
21000 41 56 45 50 4f 49 4e 54 20 74 68 61 74 20 69 73  AVEPOINT that is
21010 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a   a transaction .
21020 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a  ** savepoint..**
21030 0a 2a 2a 20 57 68 65 6e 20 70 53 61 76 65 70 6f  .** When pSavepo
21040 69 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  int is not NULL 
21050 28 6d 65 61 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74  (meaning a non-t
21060 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
21070 6f 69 6e 74 20 69 73 20 0a 2a 2a 20 62 65 69 6e  oint is .** bein
21080 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2c 20  g rolled back), 
21090 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  then the rollbac
210a0 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 75 70  k consists of up
210b0 20 74 6f 20 74 68 72 65 65 20 73 74 61 67 65 73   to three stages
210c0 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d 65 64 20 69  ,.** performed i
210d0 6e 20 74 68 65 20 6f 72 64 65 72 20 73 70 65 63  n the order spec
210e0 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ified:.**.**   *
210f0 20 50 61 67 65 73 20 61 72 65 20 70 6c 61 79 65   Pages are playe
21100 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
21110 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
21120 72 74 69 6e 67 20 61 74 20 62 79 74 65 0a 2a 2a  rting at byte.**
21130 20 20 20 20 20 6f 66 66 73 65 74 20 50 61 67 65       offset Page
21140 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73  rSavepoint.iOffs
21150 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  et and continuin
21160 67 20 74 6f 20 0a 2a 2a 20 20 20 20 20 50 61 67  g to .**     Pag
21170 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
21180 4f 66 66 73 65 74 2c 20 6f 72 20 74 6f 20 74 68  Offset, or to th
21190 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69  e end of the mai
211a0 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  n journal.**    
211b0 20 66 69 6c 65 20 69 66 20 50 61 67 65 72 53 61   file if PagerSa
211c0 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
211d0 65 74 20 69 73 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  et is zero..**.*
211e0 2a 20 20 20 2a 20 49 66 20 50 61 67 65 72 53 61  *   * If PagerSa
211f0 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
21200 65 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  et is not zero, 
21210 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 70  then pages are p
21220 6c 61 79 65 64 0a 2a 2a 20 20 20 20 20 62 61 63  layed.**     bac
21230 6b 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20  k starting from 
21240 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
21250 65 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  er immediately f
21260 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 20 20 20  ollowing .**    
21270 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
21280 69 48 64 72 4f 66 66 73 65 74 20 74 6f 20 74 68  iHdrOffset to th
21290 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 69  e end of the mai
212a0 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  n journal file..
212b0 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20  **.**   * Pages 
212c0 61 72 65 20 74 68 65 6e 20 70 6c 61 79 65 64 20  are then played 
212d0 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 73 75  back from the su
212e0 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  b-journal file, 
212f0 73 74 61 72 74 69 6e 67 0a 2a 2a 20 20 20 20 20  starting.**     
21300 77 69 74 68 20 74 68 65 20 50 61 67 65 72 53 61  with the PagerSa
21310 76 65 70 6f 69 6e 74 2e 69 53 75 62 52 65 63 20  vepoint.iSubRec 
21320 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74  and continuing t
21330 6f 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20  o the end of.** 
21340 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20      the journal 
21350 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 72 6f  file..**.** Thro
21360 75 67 68 6f 75 74 20 74 68 65 20 72 6f 6c 6c 62  ughout the rollb
21370 61 63 6b 20 70 72 6f 63 65 73 73 2c 20 65 61 63  ack process, eac
21380 68 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  h time a page is
21390 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68   rolled back, th
213a0 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  e.** correspondi
213b0 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69 6e  ng bit is set in
213c0 20 61 20 62 69 74 76 65 63 20 73 74 72 75 63 74   a bitvec struct
213d0 75 72 65 20 28 76 61 72 69 61 62 6c 65 20 70 44  ure (variable pD
213e0 6f 6e 65 20 69 6e 20 74 68 65 0a 2a 2a 20 69 6d  one in the.** im
213f0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 62 65 6c  plementation bel
21400 6f 77 29 2e 20 54 68 69 73 20 69 73 20 75 73 65  ow). This is use
21410 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  d to ensure that
21420 20 61 20 70 61 67 65 20 69 73 20 6f 6e 6c 79 0a   a page is only.
21430 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ** rolled back t
21440 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
21450 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
21460 69 6e 20 65 69 74 68 65 72 20 6a 6f 75 72 6e 61  in either journa
21470 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 53 61 76  l..**.** If pSav
21480 65 70 6f 69 6e 74 20 69 73 20 4e 55 4c 4c 2c 20  epoint is NULL, 
21490 74 68 65 6e 20 70 61 67 65 73 20 61 72 65 20 6f  then pages are o
214a0 6e 6c 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20  nly played back 
214b0 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 0a 2a 2a  from the main.**
214c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
214d0 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
214e0 66 6f 72 20 61 20 62 69 74 76 65 63 20 69 6e 20  for a bitvec in 
214f0 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
21500 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c   In either case,
21510 20 62 65 66 6f 72 65 20 70 6c 61 79 62 61 63 6b   before playback
21520 20 63 6f 6d 6d 65 6e 63 65 73 20 74 68 65 20 50   commences the P
21530 61 67 65 72 2e 64 62 53 69 7a 65 20 76 61 72 69  ager.dbSize vari
21540 61 62 6c 65 0a 2a 2a 20 69 73 20 72 65 73 65 74  able.** is reset
21550 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68   to the value th
21560 61 74 20 69 74 20 68 65 6c 64 20 61 74 20 74 68  at it held at th
21570 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 73  e start of the s
21580 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 28 6f 72  avepoint .** (or
21590 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 4e   transaction). N
215a0 6f 20 70 61 67 65 20 77 69 74 68 20 61 20 70 61  o page with a pa
215b0 67 65 2d 6e 75 6d 62 65 72 20 67 72 65 61 74 65  ge-number greate
215c0 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  r than this valu
215d0 65 0a 2a 2a 20 69 73 20 70 6c 61 79 65 64 20 62  e.** is played b
215e0 61 63 6b 2e 20 49 66 20 6f 6e 65 20 69 73 20 65  ack. If one is e
215f0 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73  ncountered it is
21600 20 73 69 6d 70 6c 79 20 73 6b 69 70 70 65 64 2e   simply skipped.
21610 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
21620 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65  agerPlaybackSave
21630 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61  point(Pager *pPa
21640 67 65 72 2c 20 50 61 67 65 72 53 61 76 65 70 6f  ger, PagerSavepo
21650 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74 29  int *pSavepoint)
21660 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  {.  i64 szJ;    
21670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21680 45 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f  Effective size o
21690 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
216a0 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  al */.  i64 iHdr
216b0 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
216c0 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69 72 73 74   /* End of first
216d0 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d 61 69 6e   segment of main
216e0 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73  -journal records
216f0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
21700 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
21710 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
21720 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65  .  Bitvec *pDone
21730 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 42   = 0;       /* B
21740 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65 20  itvec to ensure 
21750 70 61 67 65 73 20 70 6c 61 79 65 64 20 62 61 63  pages played bac
21760 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a 0a  k only once */..
21770 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
21780 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
21790 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
217a0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
217b0 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
217c0 4c 4f 43 4b 45 44 20 29 3b 0a 0a 20 20 2f 2a 20  LOCKED );..  /* 
217d0 41 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76 65  Allocate a bitve
217e0 63 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f 72  c to use to stor
217f0 65 20 74 68 65 20 73 65 74 20 6f 66 20 70 61 67  e the set of pag
21800 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a  es rolled back *
21810 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
21820 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20  nt ){.    pDone 
21830 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
21840 72 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e 74  reate(pSavepoint
21850 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69 66  ->nOrig);.    if
21860 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20  ( !pDone ){.    
21870 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21880 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
21890 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  }.  }..  /* Set 
218a0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
218b0 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61  e back to the va
218c0 6c 75 65 20 69 74 20 77 61 73 20 62 65 66 6f 72  lue it was befor
218d0 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  e the savepoint 
218e0 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65  .  ** being reve
218f0 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e  rted was opened.
21900 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
21910 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f  dbSize = pSavepo
21920 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74  int ? pSavepoint
21930 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72  ->nOrig : pPager
21940 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20  ->dbOrigSize;.  
21950 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
21960 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
21970 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69  ->tempFile;..  i
21980 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20 26  f( !pSavepoint &
21990 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  & pagerUseWal(pP
219a0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74  ager) ){.    ret
219b0 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61 63  urn pagerRollbac
219c0 6b 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  kWal(pPager);.  
219d0 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67  }..  /* Use pPag
219e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61  er->journalOff a
219f0 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  s the effective 
21a00 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e  size of the main
21a10 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a   rollback.  ** j
21a20 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74  ournal.  The act
21a30 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62  ual file might b
21a40 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  e larger than th
21a50 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52  is in.  ** PAGER
21a60 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
21a70 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a  NCATE or PAGER_J
21a80 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
21a90 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e  ST.  But anythin
21aa0 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67  g.  ** past pPag
21ab0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69  er->journalOff i
21ac0 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20  s off-limits to 
21ad0 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d  us..  */.  szJ =
21ae0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21af0 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Off;.  assert( p
21b00 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
21b10 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30 20  r)==0 || szJ==0 
21b20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62  );..  /* Begin b
21b30 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72  y rolling back r
21b40 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
21b50 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
21b60 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61  rting at.  ** Pa
21b70 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66  gerSavepoint.iOf
21b80 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75  fset and continu
21b90 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ing to the next 
21ba0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a  journal header..
21bb0 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74    ** There might
21bc0 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74   be records in t
21bd0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
21be0 74 68 61 74 20 68 61 76 65 20 61 20 70 61 67 65  that have a page
21bf0 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65   number.  ** gre
21c00 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ater than the cu
21c10 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 73  rrent database s
21c20 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53  ize (pPager->dbS
21c30 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20  ize) but those. 
21c40 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70   ** will be skip
21c50 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ped automaticall
21c60 79 2e 20 20 50 61 67 65 73 20 61 72 65 20 61 64  y.  Pages are ad
21c70 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20  ded to pDone as 
21c80 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c  they.  ** are pl
21c90 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a  ayed back..  */.
21ca0 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
21cb0 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61 6c   && !pagerUseWal
21cc0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
21cd0 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70  iHdrOff = pSavep
21ce0 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74  oint->iHdrOffset
21cf0 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   ? pSavepoint->i
21d00 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b  HdrOffset : szJ;
21d10 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
21d20 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70  rnalOff = pSavep
21d30 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20  oint->iOffset;. 
21d40 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
21d50 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
21d60 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48  r->journalOff<iH
21d70 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72  drOff ){.      r
21d80 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
21d90 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
21da0 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75  er, &pPager->jou
21db0 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20  rnalOff, pDone, 
21dc0 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  1, 1);.    }.   
21dd0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
21de0 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65  ITE_DONE );.  }e
21df0 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
21e00 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
21e10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69  .  }..  /* Conti
21e20 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  nue rolling back
21e30 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66 20   records out of 
21e40 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
21e50 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a   starting at.  *
21e60 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  * the first jour
21e70 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e 20  nal header seen 
21e80 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75  and continuing u
21e90 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63 74 69  ntil the effecti
21ea0 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74  ve end.  ** of t
21eb0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
21ec0 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20  file.  Continue 
21ed0 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72  to skip out-of-r
21ee0 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a 20  ange pages and. 
21ef0 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64 64   ** continue add
21f00 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65 64  ing pages rolled
21f10 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a   back to pDone..
21f20 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72 63    */.  while( rc
21f30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
21f40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
21f50 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32  f<szJ ){.    u32
21f60 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
21f70 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
21f80 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63  */.    u32 nJRec
21f90 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d   = 0;     /* Num
21fa0 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52  ber of Journal R
21fb0 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33  ecords */.    u3
21fc0 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20  2 dummy;.    rc 
21fd0 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
21fe0 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a 2c  (pPager, 0, szJ,
21ff0 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29   &nJRec, &dummy)
22000 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
22010 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
22020 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
22030 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75  The "pPager->jou
22040 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
22050 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
22060 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22070 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74 20  ff".    ** test 
22080 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74 69  is related to ti
22090 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65 65  cket #2565.  See
220a0 20 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e 20   the discussion 
220b0 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61  in the.    ** pa
220c0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 66  ger_playback() f
220d0 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64 69  unction for addi
220e0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
220f0 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
22100 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20  f( nJRec==0 .   
22110 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
22120 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
22130 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
22140 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22150 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ff.    ){.      
22160 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28 73  nJRec = (u32)((s
22170 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
22180 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c  rnalOff)/JOURNAL
22190 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
221a0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
221b0 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
221c0 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20 26  OK && ii<nJRec &
221d0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
221e0 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b  lOff<szJ; ii++){
221f0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
22200 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
22210 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61  age(pPager, &pPa
22220 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
22230 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20   pDone, 1, 1);. 
22240 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
22250 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
22260 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   );.  }.  assert
22270 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22280 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
22290 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a 20  alOff>=szJ );.. 
222a0 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f   /* Finally,  ro
222b0 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72 6f  llback pages fro
222c0 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
222d0 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20 77 65  l.  Page that we
222e0 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73  re.  ** previous
222f0 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f  ly rolled back o
22300 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ut of the main j
22310 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65 20  ournal (and are 
22320 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a  hence in pDone).
22330 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69    ** will be ski
22340 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61  pped.  Out-of-ra
22350 6e 67 65 20 70 61 67 65 73 20 61 72 65 20 61 6c  nge pages are al
22360 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  so skipped..  */
22370 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
22380 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b  t ){.    u32 ii;
22390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
223a0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
223b0 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
223c0 28 69 36 34 29 70 53 61 76 65 70 6f 69 6e 74 2d  (i64)pSavepoint-
223d0 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67  >iSubRec*(4+pPag
223e0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a  er->pageSize);..
223f0 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73 65      if( pagerUse
22400 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
22410 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
22420 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e 64  3WalSavepointUnd
22430 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  o(pPager->pWal, 
22440 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61 6c  pSavepoint->aWal
22450 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Data);.    }.   
22460 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f 69   for(ii=pSavepoi
22470 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63 3d  nt->iSubRec; rc=
22480 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69  =SQLITE_OK && ii
22490 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63  <pPager->nSubRec
224a0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
224b0 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d 28  ssert( offset==(
224c0 69 36 34 29 69 69 2a 28 34 2b 70 50 61 67 65 72  i64)ii*(4+pPager
224d0 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a 20  ->pageSize) );. 
224e0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
224f0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
22500 65 28 70 50 61 67 65 72 2c 20 26 6f 66 66 73 65  e(pPager, &offse
22510 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31 29 3b  t, pDone, 0, 1);
22520 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
22530 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
22540 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  NE );.  }..  sql
22550 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
22560 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20  y(pDone);.  if( 
22570 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22580 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
22590 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
225a0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
225b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
225c0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
225d0 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
225e0 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
225f0 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65 66 6f 72  allowed.** befor
22600 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  e attempting to 
22610 72 65 63 79 63 6c 65 20 63 6c 65 61 6e 20 61 6e  recycle clean an
22620 64 20 75 6e 75 73 65 64 20 70 61 67 65 73 2e 0a  d unused pages..
22630 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
22640 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
22650 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
22660 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73  int mxPage){.  s
22670 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 43  qlite3PcacheSetC
22680 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d  achesize(pPager-
22690 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65  >pPCache, mxPage
226a0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  );.}../*.** Chan
226b0 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ge the maximum n
226c0 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
226d0 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ry pages that ar
226e0 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 62 65 66  e allowed.** bef
226f0 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ore attempting t
22700 6f 20 73 70 69 6c 6c 20 70 61 67 65 73 20 74 6f  o spill pages to
22710 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74   journal..*/.int
22720 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
22730 53 70 69 6c 6c 73 69 7a 65 28 50 61 67 65 72 20  Spillsize(Pager 
22740 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
22750 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  age){.  return s
22760 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 53  qlite3PcacheSetS
22770 70 69 6c 6c 73 69 7a 65 28 70 50 61 67 65 72 2d  pillsize(pPager-
22780 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65  >pPCache, mxPage
22790 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  );.}../*.** Invo
227a0 6b 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ke SQLITE_FCNTL_
227b0 4d 4d 41 50 5f 53 49 5a 45 20 62 61 73 65 64 20  MMAP_SIZE based 
227c0 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  on the current v
227d0 61 6c 75 65 20 6f 66 20 73 7a 4d 6d 61 70 2e 0a  alue of szMmap..
227e0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
227f0 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28  agerFixMaplimit(
22800 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
22810 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
22820 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 73 71 6c  MAP_SIZE>0.  sql
22830 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20  ite3_file *fd = 
22840 70 50 61 67 65 72 2d 3e 66 64 3b 0a 20 20 69 66  pPager->fd;.  if
22850 28 20 69 73 4f 70 65 6e 28 66 64 29 20 26 26 20  ( isOpen(fd) && 
22860 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56  fd->pMethods->iV
22870 65 72 73 69 6f 6e 3e 3d 33 20 29 7b 0a 20 20 20  ersion>=3 ){.   
22880 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
22890 7a 3b 0a 20 20 20 20 73 7a 20 3d 20 70 50 61 67  z;.    sz = pPag
228a0 65 72 2d 3e 73 7a 4d 6d 61 70 3b 0a 20 20 20 20  er->szMmap;.    
228b0 70 50 61 67 65 72 2d 3e 62 55 73 65 46 65 74 63  pPager->bUseFetc
228c0 68 20 3d 20 28 73 7a 3e 30 29 3b 0a 20 20 20 20  h = (sz>0);.    
228d0 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64 28  setGetterMethod(
228e0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 73 71 6c  pPager);.    sql
228f0 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
22900 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64  lHint(pPager->fd
22910 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d  , SQLITE_FCNTL_M
22920 4d 41 50 5f 53 49 5a 45 2c 20 26 73 7a 29 3b 0a  MAP_SIZE, &sz);.
22930 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
22940 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d  .** Change the m
22950 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61  aximum size of a
22960 6e 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e  ny memory mappin
22970 67 20 6d 61 64 65 20 6f 66 20 74 68 65 20 64 61  g made of the da
22980 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
22990 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
229a0 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 50 61  rSetMmapLimit(Pa
229b0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 73 71 6c  ger *pPager, sql
229c0 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61  ite3_int64 szMma
229d0 70 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 73 7a  p){.  pPager->sz
229e0 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20  Mmap = szMmap;. 
229f0 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69   pagerFixMaplimi
22a00 74 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  t(pPager);.}../*
22a10 0a 2a 2a 20 46 72 65 65 20 61 73 20 6d 75 63 68  .** Free as much
22a20 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69   memory as possi
22a30 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ble from the pag
22a40 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  er..*/.void sqli
22a50 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b 28 50  te3PagerShrink(P
22a60 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
22a70 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68   sqlite3PcacheSh
22a80 72 69 6e 6b 28 70 50 61 67 65 72 2d 3e 70 50 43  rink(pPager->pPC
22a90 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ache);.}../*.** 
22aa0 41 64 6a 75 73 74 20 73 65 74 74 69 6e 67 73 20  Adjust settings 
22ab0 6f 66 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  of the pager to 
22ac0 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 20  those specified 
22ad0 69 6e 20 74 68 65 20 70 67 46 6c 61 67 73 20 70  in the pgFlags p
22ae0 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  arameter..**.** 
22af0 54 68 65 20 22 6c 65 76 65 6c 22 20 69 6e 20 70  The "level" in p
22b00 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 53  gFlags & PAGER_S
22b10 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b 20  YNCHRONOUS_MASK 
22b20 73 65 74 73 20 74 68 65 20 72 6f 62 75 73 74 6e  sets the robustn
22b30 65 73 73 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ess.** of the da
22b40 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65  tabase to damage
22b50 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
22b60 65 73 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  es or power fail
22b70 75 72 65 73 20 62 79 0a 2a 2a 20 63 68 61 6e 67  ures by.** chang
22b80 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
22b90 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20  f syncs()s when 
22ba0 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72  writing the jour
22bb0 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 72 65 20 61  nals..** There a
22bc0 72 65 20 66 6f 75 72 20 6c 65 76 65 6c 73 3a 0a  re four levels:.
22bd0 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20  **.**    OFF    
22be0 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63     sqlite3OsSync
22bf0 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
22c00 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
22c10 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20   default.**     
22c20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d           for tem
22c30 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73  porary and trans
22c40 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  ient files..**.*
22c50 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54  *    NORMAL    T
22c60 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
22c70 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  nced once before
22c80 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
22c90 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
22ca0 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20       database.  
22cb0 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
22cc0 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63   adequate protec
22cd0 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20  tion, but.**    
22ce0 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20            it is 
22cf0 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f  theoretically po
22d00 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76  ssible, though v
22d10 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a  ery unlikely,.**
22d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
22d30 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65  at an inopertune
22d40 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
22d50 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a  ould leave the j
22d60 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
22d70 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74         in a stat
22d80 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61  e which would ca
22d90 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68  use damage to th
22da0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
22db0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20             when 
22dc0 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  it is rolled bac
22dd0 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c  k..**.**    FULL
22de0 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61        The journa
22df0 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63  l is synced twic
22e00 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
22e10 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
22e20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
22e30 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65  abase (with some
22e40 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
22e50 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52  rmation - the nR
22e60 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20  ec field.**     
22e70 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
22e80 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d  journal header -
22e90 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69   being written i
22ea0 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  n between the tw
22eb0 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
22ec0 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65    syncs).  If we
22ed0 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69   assume that wri
22ee0 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ting a.**       
22ef0 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69         single di
22f00 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f  sk sector is ato
22f10 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  mic, then this m
22f20 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20  ode provides.** 
22f30 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
22f40 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  urance that the 
22f50 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74  journal will not
22f60 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f   be corrupted to
22f70 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
22f80 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61       point of ca
22f90 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20  using damage to 
22fa0 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72  the database dur
22fb0 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ing rollback..**
22fc0 0a 2a 2a 20 20 20 20 45 58 54 52 41 20 20 20 20  .**    EXTRA    
22fd0 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20 46 55   This is like FU
22fe0 4c 4c 20 65 78 63 65 70 74 20 74 68 61 74 20 69  LL except that i
22ff0 73 20 61 6c 73 6f 20 73 79 6e 63 73 20 74 68 65  s also syncs the
23000 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 20 20   directory.**   
23010 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20             that 
23020 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 72 6f 6c  contains the rol
23030 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 66  lback journal af
23040 74 65 72 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ter the rollback
23050 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
23060 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75 6e 6c 69   journal is unli
23070 6e 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nked..**.** The 
23080 61 62 6f 76 65 20 69 73 20 66 6f 72 20 61 20 72  above is for a r
23090 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 20  ollback-journal 
230a0 6d 6f 64 65 2e 20 20 46 6f 72 20 57 41 4c 20 6d  mode.  For WAL m
230b0 6f 64 65 2c 20 4f 46 46 20 63 6f 6e 74 69 6e 75  ode, OFF continu
230c0 65 73 0a 2a 2a 20 74 6f 20 6d 65 61 6e 20 74 68  es.** to mean th
230d0 61 74 20 6e 6f 20 73 79 6e 63 73 20 65 76 65 72  at no syncs ever
230e0 20 6f 63 63 75 72 2e 20 20 4e 4f 52 4d 41 4c 20   occur.  NORMAL 
230f0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 57  means that the W
23100 41 4c 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20  AL is synced.** 
23110 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61  prior to the sta
23120 72 74 20 6f 66 20 63 68 65 63 6b 70 6f 69 6e 74  rt of checkpoint
23130 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64 61   and that the da
23140 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 73  tabase file is s
23150 79 6e 63 65 64 0a 2a 2a 20 61 74 20 74 68 65 20  ynced.** at the 
23160 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 74 68  conclusion of th
23170 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 66 20  e checkpoint if 
23180 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
23190 6e 74 20 6f 66 20 74 68 65 20 57 41 4c 0a 2a 2a  nt of the WAL.**
231a0 20 77 61 73 20 77 72 69 74 74 65 6e 20 62 61 63   was written bac
231b0 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
231c0 61 73 65 2e 20 20 42 75 74 20 6e 6f 20 73 79 6e  ase.  But no syn
231d0 63 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 63 63  c operations occ
231e0 75 72 20 66 6f 72 0a 2a 2a 20 61 6e 20 6f 72 64  ur for.** an ord
231f0 69 6e 61 72 79 20 63 6f 6d 6d 69 74 20 69 6e 20  inary commit in 
23200 4e 4f 52 4d 41 4c 20 6d 6f 64 65 20 77 69 74 68  NORMAL mode with
23210 20 57 41 4c 2e 20 20 46 55 4c 4c 20 6d 65 61 6e   WAL.  FULL mean
23220 73 20 74 68 61 74 20 74 68 65 20 57 41 4c 0a 2a  s that the WAL.*
23230 2a 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  * file is synced
23240 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 20   following each 
23250 63 6f 6d 6d 69 74 20 6f 70 65 72 61 74 69 6f 6e  commit operation
23260 2c 20 69 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f  , in addition to
23270 20 74 68 65 0a 2a 2a 20 73 79 6e 63 73 20 61 73   the.** syncs as
23280 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 4e 4f  sociated with NO
23290 52 4d 41 4c 2e 20 20 54 68 65 72 65 20 69 73 20  RMAL.  There is 
232a0 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  no difference be
232b0 74 77 65 65 6e 20 46 55 4c 4c 0a 2a 2a 20 61 6e  tween FULL.** an
232c0 64 20 45 58 54 52 41 20 66 6f 72 20 57 41 4c 20  d EXTRA for WAL 
232d0 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e  mode..**.** Do n
232e0 6f 74 20 63 6f 6e 66 75 73 65 20 73 79 6e 63 68  ot confuse synch
232f0 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 77 69 74 68  ronous=FULL with
23300 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
23310 4c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54  L.  The.** SQLIT
23320 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 6d 61 63 72  E_SYNC_FULL macr
23330 6f 20 6d 65 61 6e 73 20 74 6f 20 75 73 65 20 74  o means to use t
23340 68 65 20 4d 61 63 4f 53 58 2d 73 74 79 6c 65 20  he MacOSX-style 
23350 66 75 6c 6c 2d 66 73 79 6e 63 0a 2a 2a 20 75 73  full-fsync.** us
23360 69 6e 67 20 66 63 6e 74 6c 28 46 5f 46 55 4c 4c  ing fcntl(F_FULL
23370 46 53 59 4e 43 29 2e 20 20 53 51 4c 49 54 45 5f  FSYNC).  SQLITE_
23380 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6d 65 61 6e  SYNC_NORMAL mean
23390 73 20 74 6f 20 64 6f 20 61 6e 0a 2a 2a 20 6f 72  s to do an.** or
233a0 64 69 6e 61 72 79 20 66 73 79 6e 63 28 29 20 63  dinary fsync() c
233b0 61 6c 6c 2e 20 20 54 68 65 72 65 20 69 73 20 6e  all.  There is n
233c0 6f 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  o difference bet
233d0 77 65 65 6e 20 53 51 4c 49 54 45 5f 53 59 4e 43  ween SQLITE_SYNC
233e0 5f 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 53 51 4c  _FULL.** and SQL
233f0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
23400 6f 6e 20 70 6c 61 74 66 6f 72 6d 73 20 6f 74 68  on platforms oth
23410 65 72 20 74 68 61 6e 20 4d 61 63 4f 53 58 2e 20  er than MacOSX. 
23420 20 42 75 74 20 74 68 65 0a 2a 2a 20 73 79 6e 63   But the.** sync
23430 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 76 65 72  hronous=FULL ver
23440 73 75 73 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  sus synchronous=
23450 4e 4f 52 4d 41 4c 20 73 65 74 74 69 6e 67 20 64  NORMAL setting d
23460 65 74 65 72 6d 69 6e 65 73 20 77 68 65 6e 0a 2a  etermines when.*
23470 2a 20 74 68 65 20 78 53 79 6e 63 20 70 72 69 6d  * the xSync prim
23480 69 74 69 76 65 20 69 73 20 63 61 6c 6c 65 64 20  itive is called 
23490 61 6e 64 20 69 73 20 72 65 6c 65 76 61 6e 74 20  and is relevant 
234a0 74 6f 20 61 6c 6c 20 70 6c 61 74 66 6f 72 6d 73  to all platforms
234b0 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20  ..**.** Numeric 
234c0 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65  values associate
234d0 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61  d with these sta
234e0 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20  tes are OFF==1, 
234f0 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64  NORMAL=2,.** and
23500 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e   FULL=3..*/.#ifn
23510 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
23520 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f  PAGER_PRAGMAS.vo
23530 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
23540 65 74 46 6c 61 67 73 28 0a 20 20 50 61 67 65 72  etFlags(.  Pager
23550 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
23560 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f   /* The pager to
23570 20 73 65 74 20 73 61 66 65 74 79 20 6c 65 76 65   set safety leve
23580 6c 20 66 6f 72 20 2a 2f 0a 20 20 75 6e 73 69 67  l for */.  unsig
23590 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20 20 20  ned pgFlags     
235a0 20 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c 61 67   /* Various flag
235b0 73 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  s */.){.  unsign
235c0 65 64 20 6c 65 76 65 6c 20 3d 20 70 67 46 6c 61  ed level = pgFla
235d0 67 73 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48  gs & PAGER_SYNCH
235e0 52 4f 4e 4f 55 53 5f 4d 41 53 4b 3b 0a 20 20 69  RONOUS_MASK;.  i
235f0 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
23600 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ile ){.    pPage
23610 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b 0a 20  r->noSync = 1;. 
23620 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53     pPager->fullS
23630 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ync = 0;.    pPa
23640 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d  ger->extraSync =
23650 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
23660 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
23670 3d 20 20 6c 65 76 65 6c 3d 3d 50 41 47 45 52 5f  =  level==PAGER_
23680 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46 20  SYNCHRONOUS_OFF 
23690 3f 31 3a 30 3b 0a 20 20 20 20 70 50 61 67 65 72  ?1:0;.    pPager
236a0 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76  ->fullSync = lev
236b0 65 6c 3e 3d 50 41 47 45 52 5f 53 59 4e 43 48 52  el>=PAGER_SYNCHR
236c0 4f 4e 4f 55 53 5f 46 55 4c 4c 20 3f 31 3a 30 3b  ONOUS_FULL ?1:0;
236d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 74  .    pPager->ext
236e0 72 61 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d  raSync = level==
236f0 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
23700 53 5f 45 58 54 52 41 20 3f 31 3a 30 3b 0a 20 20  S_EXTRA ?1:0;.  
23710 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
23720 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50  noSync ){.    pP
23730 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
23740 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
23750 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d  >ckptSyncFlags =
23760 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
23770 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f  pgFlags & PAGER_
23780 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20 20 20  FULLFSYNC ){.   
23790 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
237a0 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
237b0 5f 46 55 4c 4c 3b 0a 20 20 20 20 70 50 61 67 65  _FULL;.    pPage
237c0 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
237d0 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46   = SQLITE_SYNC_F
237e0 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ULL;.  }else if(
237f0 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52   pgFlags & PAGER
23800 5f 43 4b 50 54 5f 46 55 4c 4c 46 53 59 4e 43 20  _CKPT_FULLFSYNC 
23810 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
23820 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
23830 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
23840 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53     pPager->ckptS
23850 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
23860 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d  E_SYNC_FULL;.  }
23870 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
23880 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
23890 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
238a0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
238b0 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
238c0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
238d0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
238e0 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 70  walSyncFlags = p
238f0 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
23900 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
23910 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
23920 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
23930 6c 61 67 73 20 7c 3d 20 57 41 4c 5f 53 59 4e 43  lags |= WAL_SYNC
23940 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53 3b 0a 20  _TRANSACTIONS;. 
23950 20 7d 0a 20 20 69 66 28 20 70 67 46 6c 61 67 73   }.  if( pgFlags
23960 20 26 20 50 41 47 45 52 5f 43 41 43 48 45 53 50   & PAGER_CACHESP
23970 49 4c 4c 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ILL ){.    pPage
23980 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d  r->doNotSpill &=
23990 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b   ~SPILLFLAG_OFF;
239a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
239b0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
239c0 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46   |= SPILLFLAG_OF
239d0 46 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  F;.  }.}.#endif.
239e0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
239f0 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
23a00 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e  able is incremen
23a10 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65  ted whenever the
23a20 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65   library.** atte
23a30 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74  mpts to open a t
23a40 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20  emporary file.  
23a50 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
23a60 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20   is used for.** 
23a70 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
23a80 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a  ysis only.  .*/.
23a90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
23aa0 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  ST.int sqlite3_o
23ab0 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20  pentemp_count = 
23ac0 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
23ad0 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   Open a temporar
23ae0 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72  y file..**.** Wr
23af0 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ite the file des
23b00 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 70 46  criptor into *pF
23b10 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ile. Return SQLI
23b20 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
23b30 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68   .** or some oth
23b40 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  er error code if
23b50 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53   we fail. The OS
23b60 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61   will automatica
23b70 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74  lly .** delete t
23b80 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
23b90 65 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  e when it is clo
23ba0 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  sed..**.** The f
23bb0 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f 20 74  lags passed to t
23bc0 68 65 20 56 46 53 20 6c 61 79 65 72 20 78 4f 70  he VFS layer xOp
23bd0 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20 74 68  en() call are th
23be0 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  ose specified.**
23bf0 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 76 66   by parameter vf
23c00 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69 74 68  sFlags ORed with
23c10 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
23c20 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  **.**     SQLITE
23c30 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a  _OPEN_READWRITE.
23c40 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
23c50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20 20 20  EN_CREATE.**    
23c60 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
23c70 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 53 51  LUSIVE.**     SQ
23c80 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
23c90 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61 74 69  ONCLOSE.*/.stati
23ca0 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65 6e 74  c int pagerOpent
23cb0 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50  emp(.  Pager *pP
23cc0 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  ager,        /* 
23cd0 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  The pager object
23ce0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
23cf0 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57  le *pFile,  /* W
23d00 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65  rite the file de
23d10 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f  scriptor here */
23d20 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  .  int vfsFlags 
23d30 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
23d40 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
23d50 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29   to the VFS */.)
23d60 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
23d70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
23d80 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66  urn code */..#if
23d90 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
23da0 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65    sqlite3_opente
23db0 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20  mp_count++;  /* 
23dc0 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  Used for testing
23dd0 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
23de0 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ly */.#endif..  
23df0 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c  vfsFlags |=  SQL
23e00 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
23e10 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
23e20 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20  _CREATE |.      
23e30 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
23e40 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51  N_EXCLUSIVE | SQ
23e50 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
23e60 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20  ONCLOSE;.  rc = 
23e70 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50  sqlite3OsOpen(pP
23e80 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70  ager->pVfs, 0, p
23e90 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20  File, vfsFlags, 
23ea0 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  0);.  assert( rc
23eb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
23ec0 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29 3b 0a  sOpen(pFile) );.
23ed0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
23ee0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75  /*.** Set the bu
23ef0 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy handler funct
23f00 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ion..**.** The p
23f10 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74 68 65  ager invokes the
23f20 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69 66   busy-handler if
23f30 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29   sqlite3OsLock()
23f40 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c   returns .** SQL
23f50 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20 74 72  ITE_BUSY when tr
23f60 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20  ying to upgrade 
23f70 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20  from no-lock to 
23f80 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a  a SHARED lock,.*
23f90 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69 6e 67  * or when trying
23fa0 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d   to upgrade from
23fb0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
23fc0 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45   to an EXCLUSIVE
23fd0 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20 64 6f   .** lock. It do
23fe0 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20  es *not* invoke 
23ff0 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
24000 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
24010 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44 20 74  from.** SHARED t
24020 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72 20 77  o RESERVED, or w
24030 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72  hen upgrading fr
24040 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45 58 43  om SHARED to EXC
24050 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69 63 68  LUSIVE.** (which
24060 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 68   occurs during h
24070 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
24080 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a  ack). Summary:.*
24090 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74 69 6f  *.**   Transitio
240a0 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
240b0 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76 6f 6b           | Invok
240c0 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65 72 0a  es xBusyHandler.
240d0 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
240e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
240f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
24110 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20 20 20     NO_LOCK      
24120 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20   -> SHARED_LOCK 
24130 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20 20 20       | Yes.**   
24140 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e  SHARED_LOCK   ->
24150 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20   RESERVED_LOCK  
24160 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48 41 52    | No.**   SHAR
24170 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45 58 43  ED_LOCK   -> EXC
24180 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20  LUSIVE_LOCK   | 
24190 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56 45 44  No.**   RESERVED
241a0 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55 53 49  _LOCK -> EXCLUSI
241b0 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65 73 0a  VE_LOCK   | Yes.
241c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 75 73  **.** If the bus
241d0 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y-handler callba
241e0 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  ck returns non-z
241f0 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73  ero, the lock is
24200 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 49 66   .** retried. If
24210 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f   it returns zero
24220 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c 49 54  , then the SQLIT
24230 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69 73 0a  E_BUSY error is.
24240 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  ** returned to t
24250 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 65  he caller of the
24260 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74   pager API funct
24270 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
24280 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
24290 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65 72  handler(.  Pager
242a0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
242b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242c0 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
242d0 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79  */.  int (*xBusy
242e0 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a 29  Handler)(void *)
242f0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ,         /* Poi
24300 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68 61 6e  nter to busy-han
24310 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  dler function */
24320 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61  .  void *pBusyHa
24330 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20 20 20  ndlerArg        
24340 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
24350 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78  ent to pass to x
24360 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 29  BusyHandler */.)
24370 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73  {.  pPager->xBus
24380 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79  yHandler = xBusy
24390 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65  Handler;.  pPage
243a0 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
243b0 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65  rg = pBusyHandle
243c0 72 41 72 67 3b 0a 0a 20 20 69 66 28 20 69 73 4f  rArg;..  if( isO
243d0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
243e0 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 2a 61 70  ){.    void **ap
243f0 20 3d 20 28 76 6f 69 64 20 2a 2a 29 26 70 50 61   = (void **)&pPa
24400 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
24410 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  r;.    assert( (
24420 28 69 6e 74 28 2a 29 28 76 6f 69 64 20 2a 29 29  (int(*)(void *))
24430 28 61 70 5b 30 5d 29 29 3d 3d 78 42 75 73 79 48  (ap[0]))==xBusyH
24440 61 6e 64 6c 65 72 20 29 3b 0a 20 20 20 20 61 73  andler );.    as
24450 73 65 72 74 28 20 61 70 5b 31 5d 3d 3d 70 42 75  sert( ap[1]==pBu
24460 73 79 48 61 6e 64 6c 65 72 41 72 67 20 29 3b 0a  syHandlerArg );.
24470 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
24480 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61  eControlHint(pPa
24490 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
244a0 46 43 4e 54 4c 5f 42 55 53 59 48 41 4e 44 4c 45  FCNTL_BUSYHANDLE
244b0 52 2c 20 28 76 6f 69 64 20 2a 29 61 70 29 3b 0a  R, (void *)ap);.
244c0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
244d0 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69 7a  nge the page siz
244e0 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50 61  e used by the Pa
244f0 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20  ger object. The 
24500 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a  new page size .*
24510 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a  * is passed in *
24520 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
24530 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
24540 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
24550 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
24560 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
24570 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  , it.** is a no-
24580 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65  op. The value re
24590 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65 72  turned is the er
245a0 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
245b0 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f  code (i.e. .** o
245c0 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45  ne of SQLITE_IOE
245d0 52 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f  RR, an SQLITE_IO
245e0 45 52 52 5f 78 78 78 20 73 75 62 2d 63 6f 64 65  ERR_xxx sub-code
245f0 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29   or SQLITE_FULL)
24600 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
24610 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  e, if all of the
24620 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
24630 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74  rue:.**.**   * t
24640 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65  he new page size
24650 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67   (value of *pPag
24660 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20  eSize) is valid 
24670 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20  (a power .**    
24680 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20   of two between 
24690 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d  512 and SQLITE_M
246a0 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e  AX_PAGE_SIZE, in
246b0 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a  clusive), and.**
246c0 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72  .**   * there ar
246d0 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
246e0 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73   page references
246f0 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  , and.**.**   * 
24700 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
24710 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e  either not an in
24720 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
24730 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20   or it is.**    
24740 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
24750 74 61 62 61 73 65 20 74 68 61 74 20 63 75 72 72  tabase that curr
24760 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f  ently consists o
24770 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a  f zero pages..**
24780 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67  .** then the pag
24790 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73  er object page s
247a0 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70  ize is set to *p
247b0 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  PageSize..**.** 
247c0 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  If the page size
247d0 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65   is changed, the
247e0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
247f0 75 73 65 73 20 73 71 6c 69 74 65 33 50 61 67 65  uses sqlite3Page
24800 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f  rMalloc() .** to
24810 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61   obtain a new Pa
24820 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75  ger.pTmpSpace bu
24830 66 66 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c  ffer. If this al
24840 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74  location attempt
24850 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49   .** fails, SQLI
24860 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
24870 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67  rned and the pag
24880 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75  e size remains u
24890 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e  nchanged. .** In
248a0 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73   all other cases
248b0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
248c0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
248d0 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
248e0 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20  is not changed, 
248f0 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 6f  either because o
24900 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72  ne of the enumer
24910 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f  ated.** conditio
24920 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20  ns above is not 
24930 74 72 75 65 2c 20 74 68 65 20 70 61 67 65 72 20  true, the pager 
24940 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61  was in error sta
24950 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20  te when this.** 
24960 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
24970 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20  led, or because 
24980 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
24990 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61  ation attempt fa
249a0 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a  iled, .** then *
249b0 70 50 61 67 65 53 69 7a 65 20 69 73 20 73 65 74  pPageSize is set
249c0 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74   to the old, ret
249d0 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20  ained page size 
249e0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
249f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24a00 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
24a10 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
24a20 75 33 32 20 2a 70 50 61 67 65 53 69 7a 65 2c 20  u32 *pPageSize, 
24a30 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20  int nReserve){. 
24a40 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
24a50 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73  _OK;..  /* It is
24a60 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
24a70 20 64 6f 20 61 20 66 75 6c 6c 20 61 73 73 65 72   do a full asser
24a80 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20  t_pager_state() 
24a90 68 65 72 65 2c 20 61 73 20 74 68 69 73 0a 20 20  here, as this.  
24aa0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  ** function may 
24ab0 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77  be called from w
24ac0 69 74 68 69 6e 20 50 61 67 65 72 4f 70 65 6e 28  ithin PagerOpen(
24ad0 29 2c 20 62 65 66 6f 72 65 20 74 68 65 20 73 74  ), before the st
24ae0 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ate.  ** of the 
24af0 50 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20  Pager object is 
24b00 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e 73 69  internally consi
24b10 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  stent..  **.  **
24b20 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68   At one point th
24b30 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
24b40 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66  rned an error if
24b50 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
24b60 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f 45 52  n .  ** PAGER_ER
24b70 52 4f 52 20 73 74 61 74 65 2e 20 42 75 74 20 73  ROR state. But s
24b80 69 6e 63 65 20 50 41 47 45 52 5f 45 52 52 4f 52  ince PAGER_ERROR
24b90 20 73 74 61 74 65 20 67 75 61 72 61 6e 74 65 65   state guarantee
24ba0 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 72  s that.  ** ther
24bb0 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  e is at least on
24bc0 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  e outstanding pa
24bd0 67 65 20 72 65 66 65 72 65 6e 63 65 2c 20 74 68  ge reference, th
24be0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  is function.  **
24bf0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
24c00 74 68 61 74 20 63 61 73 65 20 61 6e 79 68 6f 77  that case anyhow
24c10 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20 70 61  ..  */..  u32 pa
24c20 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53  geSize = *pPageS
24c30 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ize;.  assert( p
24c40 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70  ageSize==0 || (p
24c50 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
24c60 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
24c70 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20  _MAX_PAGE_SIZE) 
24c80 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65 72  );.  if( (pPager
24c90 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50  ->memDb==0 || pP
24ca0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29  ager->dbSize==0)
24cb0 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63  .   && sqlite3Pc
24cc0 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
24cd0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
24ce0 20 0a 20 20 20 26 26 20 70 61 67 65 53 69 7a 65   .   && pageSize
24cf0 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 28 75   && pageSize!=(u
24d00 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  32)pPager->pageS
24d10 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20 63 68  ize .  ){.    ch
24d20 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c 4c 3b  ar *pNew = NULL;
24d30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24d40 4e 65 77 20 74 65 6d 70 20 73 70 61 63 65 20 2a  New temp space *
24d50 2f 0a 20 20 20 20 69 36 34 20 6e 42 79 74 65 20  /.    i64 nByte 
24d60 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 50  = 0;..    if( pP
24d70 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47  ager->eState>PAG
24d80 45 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f 70 65  ER_OPEN && isOpe
24d90 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
24da0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
24db0 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
24dc0 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79 74 65  ager->fd, &nByte
24dd0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
24de0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24df0 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28  {.      pNew = (
24e00 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61  char *)sqlite3Pa
24e10 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a  geMalloc(pageSiz
24e20 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  e);.      if( !p
24e30 4e 65 77 20 29 20 72 63 20 3d 20 53 51 4c 49 54  New ) rc = SQLIT
24e40 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
24e50 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
24e60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24e70 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
24e80 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72  pPager);.      r
24e90 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  c = sqlite3Pcach
24ea0 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 50 61  eSetPageSize(pPa
24eb0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61  ger->pPCache, pa
24ec0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
24ed0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
24ee0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
24ef0 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50  lite3PageFree(pP
24f00 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29  ager->pTmpSpace)
24f10 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
24f20 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77  pTmpSpace = pNew
24f30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
24f40 64 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f 29 28  dbSize = (Pgno)(
24f50 28 6e 42 79 74 65 2b 70 61 67 65 53 69 7a 65 2d  (nByte+pageSize-
24f60 31 29 2f 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  1)/pageSize);.  
24f70 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
24f80 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
24f90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24fa0 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
24fb0 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 7d 0a 20  e(pNew);.    }. 
24fc0 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53 69 7a 65   }..  *pPageSize
24fd0 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
24fe0 69 7a 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ize;.  if( rc==S
24ff0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25000 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
25010 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50 61 67   nReserve = pPag
25020 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20  er->nReserve;.  
25030 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
25040 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76  ve>=0 && nReserv
25050 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 70 50  e<1000 );.    pP
25060 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d  ager->nReserve =
25070 20 28 69 31 36 29 6e 52 65 73 65 72 76 65 3b 0a   (i16)nReserve;.
25080 20 20 20 20 70 61 67 65 72 52 65 70 6f 72 74 53      pagerReportS
25090 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ize(pPager);.   
250a0 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69 6d 69   pagerFixMaplimi
250b0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  t(pPager);.  }. 
250c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
250d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
250e0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74 65  inter to the "te
250f0 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20 62 75  mporary page" bu
25100 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e  ffer held intern
25110 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70  ally.** by the p
25120 61 67 65 72 2e 20 20 54 68 69 73 20 69 73 20 61  ager.  This is a
25130 20 62 75 66 66 65 72 20 74 68 61 74 20 69 73 20   buffer that is 
25140 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  big enough to ho
25150 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65  ld the.** entire
25160 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61   content of a da
25170 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 54 68  tabase page.  Th
25180 69 73 20 62 75 66 66 65 72 20 69 73 20 75 73 65  is buffer is use
25190 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  d internally.** 
251a0 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
251b0 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72  and will be over
251c0 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72  written whenever
251d0 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f   a rollback.** o
251e0 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65  ccurs.  But othe
251f0 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72  r modules are fr
25200 65 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f  ee to use it too
25210 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20  , as long as.** 
25220 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65  no rollbacks are
25230 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76   happening..*/.v
25240 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
25250 72 54 65 6d 70 53 70 61 63 65 28 50 61 67 65 72  rTempSpace(Pager
25260 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
25270 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  urn pPager->pTmp
25280 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Space;.}../*.** 
25290 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74  Attempt to set t
252a0 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62  he maximum datab
252b0 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69  ase page count i
252c0 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69  f mxPage is posi
252d0 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e  tive. .** Make n
252e0 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50  o changes if mxP
252f0 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e  age is zero or n
25300 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65  egative.  And ne
25310 76 65 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a  ver reduce the.*
25320 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  * maximum page c
25330 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63  ount below the c
25340 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
25350 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
25360 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  ** Regardless of
25370 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20   mxPage, return 
25380 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69  the current maxi
25390 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  mum page count..
253a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
253b0 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  gerMaxPageCount(
253c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
253d0 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66  nt mxPage){.  if
253e0 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20  ( mxPage>0 ){.  
253f0 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
25400 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20   = mxPage;.  }. 
25410 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25420 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
25430 50 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a 20 43  PEN );      /* C
25440 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20 4f 50  alled only by OP
25450 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20 20 61  _MaxPgcnt */.  a
25460 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d  ssert( pPager->m
25470 78 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e 64  xPgno>=pPager->d
25480 62 53 69 7a 65 20 29 3b 20 20 2f 2a 20 4f 50 5f  bSize );  /* OP_
25490 4d 61 78 50 67 63 6e 74 20 65 6e 66 6f 72 63 65  MaxPgcnt enforce
254a0 73 20 74 68 69 73 20 2a 2f 0a 20 20 72 65 74 75  s this */.  retu
254b0 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  rn pPager->mxPgn
254c0 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  o;.}../*.** The 
254d0 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66  following set of
254e0 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
254f0 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  ed to disable th
25500 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49  e simulated.** I
25510 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69  /O error mechani
25520 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69  sm.  These routi
25530 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
25540 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a  avoid simulated.
25550 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61  ** errors in pla
25560 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20  ces where we do 
25570 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65  not care about e
25580 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c  rrors..**.** Unl
25590 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53  ess -DSQLITE_TES
255a0 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65  T=1 is used, the
255b0 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
255c0 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e  all no-ops.** an
255d0 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f  d generate no co
255e0 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  de..*/.#ifdef SQ
255f0 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e  LITE_TEST.extern
25600 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
25610 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65  error_pending;.e
25620 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
25630 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a  3_io_error_hit;.
25640 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64  static int saved
25650 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62  _cnt;.void disab
25660 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
25670 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
25680 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69  saved_cnt = sqli
25690 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
256a0 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ding;.  sqlite3_
256b0 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
256c0 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e   = -1;.}.void en
256d0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
256e0 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
256f0 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
25700 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76  or_pending = sav
25710 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a  ed_cnt;.}.#else.
25720 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65  # define disable
25730 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
25740 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20  rors().# define 
25750 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
25760 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e  _io_errors().#en
25770 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
25780 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65  the first N byte
25790 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e  s from the begin
257a0 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65  ning of the file
257b0 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20   into memory.** 
257c0 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74  that pDest point
257d0 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  s to. .**.** If 
257e0 74 68 65 20 70 61 67 65 72 20 77 61 73 20 6f 70  the pager was op
257f0 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69  ened on a transi
25800 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e  ent file (zFilen
25810 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20  ame==""), or.** 
25820 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65  opened on a file
25830 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74   less than N byt
25840 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20  es in size, the 
25850 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73  output buffer is
25860 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53  .** zeroed and S
25870 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
25880 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65  d. The rationale
25890 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61   for this is tha
258a0 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  t this .** funct
258b0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
258c0 65 61 64 20 64 61 74 61 62 61 73 65 20 68 65 61  ead database hea
258d0 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20  ders, and a new 
258e0 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20  transient or.** 
258f0 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62  zero sized datab
25900 61 73 65 20 68 61 73 20 61 20 68 65 61 64 65 72  ase has a header
25910 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65   than consists e
25920 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65  ntirely of zeroe
25930 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  s..**.** If any 
25940 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74 20 66  IO error apart f
25950 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  rom SQLITE_IOERR
25960 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65  _SHORT_READ is e
25970 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74  ncountered,.** t
25980 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
25990 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
259a0 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20   caller and the 
259b0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
259c0 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  ** output buffer
259d0 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69   undefined..*/.i
259e0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
259f0 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 50 61  eadFileheader(Pa
25a00 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
25a10 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61   N, unsigned cha
25a20 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74  r *pDest){.  int
25a30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
25a40 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c  .  memset(pDest,
25a50 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74   0, N);.  assert
25a60 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
25a70 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
25a80 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  tempFile );..  /
25a90 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
25aa0 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  s only called by
25ab0 20 62 74 72 65 65 20 69 6d 6d 65 64 69 61 74 65   btree immediate
25ac0 6c 79 20 61 66 74 65 72 20 63 72 65 61 74 69 6e  ly after creatin
25ad0 67 0a 20 20 2a 2a 20 74 68 65 20 50 61 67 65 72  g.  ** the Pager
25ae0 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 72 65 20   object.  There 
25af0 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6e 20  has not been an 
25b00 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 74  opportunity to t
25b10 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a 20 74  ransition.  ** t
25b20 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65 74 2e 0a  o WAL mode yet..
25b30 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21    */.  assert( !
25b40 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
25b50 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 69 73  er) );..  if( is
25b60 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
25b70 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28   ){.    IOTRACE(
25b80 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c  ("DBHDR %p 0 %d\
25b90 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a  n", pPager, N)).
25ba0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
25bb0 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
25bc0 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b  d, pDest, N, 0);
25bd0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
25be0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
25bf0 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63  READ ){.      rc
25c00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
25c10 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
25c20 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
25c30 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
25c40 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77  only be called w
25c50 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73  hen a read-trans
25c60 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f  action is open o
25c70 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 2e 20  n.** the pager. 
25c80 49 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 74  It returns the t
25c90 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
25ca0 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
25cb0 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f 77 65  base..**.** Howe
25cc0 76 65 72 2c 20 69 66 20 74 68 65 20 66 69 6c 65  ver, if the file
25cd0 20 69 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e   is between 1 an
25ce0 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79  d <page-size> by
25cf0 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65  tes in size, the
25d00 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20 63 6f  n .** this is co
25d10 6e 73 69 64 65 72 65 64 20 61 20 31 20 70 61 67  nsidered a 1 pag
25d20 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e file..*/.void 
25d30 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
25d40 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
25d50 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65  ger, int *pnPage
25d60 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ){.  assert( pPa
25d70 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
25d80 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61  ER_READER );.  a
25d90 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
25da0 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52 49  State!=PAGER_WRI
25db0 54 45 52 5f 46 49 4e 49 53 48 45 44 20 29 3b 0a  TER_FINISHED );.
25dc0 20 20 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e 74    *pnPage = (int
25dd0 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b  )pPager->dbSize;
25de0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  .}.../*.** Try t
25df0 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  o obtain a lock 
25e00 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65  of type locktype
25e10 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
25e20 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73   file. If.** a s
25e30 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65  imilar or greate
25e40 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  r lock is alread
25e50 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e  y held, this fun
25e60 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
25e70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53  .** (returning S
25e80 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61  QLITE_OK immedia
25e90 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  tely)..**.** Oth
25ea0 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20  erwise, attempt 
25eb0 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  to obtain the lo
25ec0 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ck using sqlite3
25ed0 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65  OsLock(). Invoke
25ee0 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61   .** the busy ca
25ef0 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f  llback if the lo
25f00 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ck is currently 
25f10 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52  not available. R
25f20 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20  epeat .** until 
25f30 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
25f40 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20  k returns false 
25f50 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74  or until the att
25f60 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61  empt to .** obta
25f70 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63  in the lock succ
25f80 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  eeds..**.** Retu
25f90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
25fa0 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65  success and an e
25fb0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
25fc0 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a  cannot obtain.**
25fd0 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68   the lock. If th
25fe0 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  e lock is obtain
25ff0 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ed successfully,
26000 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 73   set the Pager.s
26010 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c  tate .** variabl
26020 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65  e to locktype be
26030 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
26040 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
26050 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
26060 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
26070 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
26080 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
26090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
260a0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
260b0 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68  code */..  /* Ch
260c0 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73  eck that this is
260d0 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20   either a no-op 
260e0 28 62 65 63 61 75 73 65 20 74 68 65 20 72 65 71  (because the req
260f0 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a  uested lock is .
26100 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c    ** already hel
26110 64 29 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  d), or one of th
26120 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 68  e transitions th
26130 61 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  at the busy-hand
26140 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  ler.  ** may be 
26150 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20  invoked during, 
26160 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
26170 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20   comment above. 
26180 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
26190 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29  SetBusyhandler()
261a0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
261b0 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e   (pPager->eLock>
261c0 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20  =locktype).     
261d0 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c    || (pPager->eL
261e0 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20  ock==NO_LOCK && 
261f0 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
26200 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 7c 7c  _LOCK).       ||
26210 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d   (pPager->eLock=
26220 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26  =RESERVED_LOCK &
26230 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c  & locktype==EXCL
26240 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b  USIVE_LOCK).  );
26250 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20  ..  do {.    rc 
26260 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
26270 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 3b  ager, locktype);
26280 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53  .  }while( rc==S
26290 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 50  QLITE_BUSY && pP
262a0 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
262b0 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79  er(pPager->pBusy
262c0 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20  HandlerArg) );. 
262d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
262e0 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 61 73  *.** Function as
262f0 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
26300 74 72 61 69 6e 74 28 70 50 61 67 65 72 29 20 63  traint(pPager) c
26310 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65 20 6f  hecks that one o
26320 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  f the .** follow
26330 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f 72 20  ing is true for 
26340 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
26350 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
26360 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a 2a 0a   page-cache:.**.
26370 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61 67 65  **   a) The page
26380 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20   number is less 
26390 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
263a0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
263b0 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72 65 6e   .**      curren
263c0 74 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  t database image
263d0 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52 0a 2a  , in pages, OR.*
263e0 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74 68 65  *.**   b) if the
263f0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 65   page content we
26400 72 65 20 77 72 69 74 74 65 6e 20 61 74 20 74 68  re written at th
26410 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f 75 6c  is time, it woul
26420 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 62 65  d not.**      be
26430 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
26440 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
26450 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f 20 74  content out to t
26460 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  he sub-journal.*
26470 2a 20 20 20 20 20 20 28 61 73 20 64 65 74 65 72  *      (as deter
26480 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74 69 6f  mined by functio
26490 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  n subjRequiresPa
264a0 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ge())..**.** If 
264b0 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 61 73  the condition as
264c0 73 65 72 74 65 64 20 62 79 20 74 68 69 73 20 66  serted by this f
264d0 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74  unction were not
264e0 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65 0a 2a   true, and the.*
264f0 2a 20 64 69 72 74 79 20 70 61 67 65 20 77 65 72  * dirty page wer
26500 65 20 74 6f 20 62 65 20 64 69 73 63 61 72 64 65  e to be discarde
26510 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  d from the cache
26520 20 76 69 61 20 74 68 65 20 70 61 67 65 72 53 74   via the pagerSt
26530 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  ress().** routin
26540 65 2c 20 70 61 67 65 72 53 74 72 65 73 73 28 29  e, pagerStress()
26550 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69 74 65   would not write
26560 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
26570 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a 2a 20  e content to.** 
26580 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26590 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f 69 6e  e. If a savepoin
265a0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 65  t transaction we
265b0 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  re rolled back a
265c0 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68 61 70  fter.** this hap
265d0 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72 72 65  pened, the corre
265e0 63 74 20 62 65 68 61 76 69 6f 72 20 77 6f 75 6c  ct behavior woul
265f0 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72 65 20  d be to restore 
26600 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63  the current.** c
26610 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
26620 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73 69 6e  ge. However, sin
26630 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e 74 20  ce this content 
26640 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69  is not present i
26650 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68 65 20  n either.** the 
26660 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72  database file or
26670 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f 66 20   the portion of 
26680 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
26690 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73 75 62  rnal and .** sub
266a0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65 64 20  -journal rolled 
266b0 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65 6e 74  back the content
266c0 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 72 65   could not be re
266d0 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65 0a 2a  stored and the.*
266e0 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  * database image
266f0 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f   would become co
26700 72 72 75 70 74 2e 20 49 74 20 69 73 20 74 68 65  rrupt. It is the
26710 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61 74 65  refore fortunate
26720 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73 20 63   that .** this c
26730 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61 6e 6e  ircumstance cann
26740 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23 69 66  ot arise..*/.#if
26750 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
26760 44 45 42 55 47 29 0a 73 74 61 74 69 63 20 76 6f  DEBUG).static vo
26770 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  id assertTruncat
26780 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28 50 67  eConstraintCb(Pg
26790 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61 73 73  Hdr *pPg){.  ass
267a0 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26  ert( pPg->flags&
267b0 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20  PGHDR_DIRTY );. 
267c0 20 61 73 73 65 72 74 28 20 21 73 75 62 6a 52 65   assert( !subjRe
267d0 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
267e0 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  || pPg->pgno<=pP
267f0 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  g->pPager->dbSiz
26800 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  e );.}.static vo
26810 69 64 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  id assertTruncat
26820 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61 67 65  eConstraint(Page
26830 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71  r *pPager){.  sq
26840 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61  lite3PcacheItera
26850 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e  teDirty(pPager->
26860 70 50 43 61 63 68 65 2c 20 61 73 73 65 72 74 54  pPCache, assertT
26870 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
26880 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  tCb);.}.#else.# 
26890 64 65 66 69 6e 65 20 61 73 73 65 72 74 54 72 75  define assertTru
268a0 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
268b0 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66 0a 0a  pPager).#endif..
268c0 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74  /*.** Truncate t
268d0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  he in-memory dat
268e0 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65  abase file image
268f0 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e   to nPage pages.
26900 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
26910 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75  on does not actu
26920 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20  ally modify the 
26930 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
26940 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75   disk. It .** ju
26950 73 74 20 73 65 74 73 20 74 68 65 20 69 6e 74 65  st sets the inte
26960 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68  rnal state of th
26970 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73  e pager object s
26980 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 74  o that the .** t
26990 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62  runcation will b
269a0 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20  e done when the 
269b0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
269c0 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
269d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
269e0 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61  ction is only ca
269f0 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66 6f 72  lled right befor
26a00 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  e committing a t
26a10 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 4f  ransaction..** O
26a20 6e 63 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  nce this functio
26a30 6e 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  n has been calle
26a40 64 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  d, the transacti
26a50 6f 6e 20 6d 75 73 74 20 65 69 74 68 65 72 20 62  on must either b
26a60 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b  e.** rolled back
26a70 20 6f 72 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49   or committed. I
26a80 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f  t is not safe to
26a90 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
26aa0 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68 65 6e 20  ion and.** then 
26ab0 63 6f 6e 74 69 6e 75 65 20 77 72 69 74 69 6e 67  continue writing
26ac0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
26ad0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
26ae0 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
26af0 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
26b00 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  r, Pgno nPage){.
26b10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
26b20 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20  ->dbSize>=nPage 
26b30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
26b40 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
26b50 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d  ER_WRITER_CACHEM
26b60 4f 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  OD );.  pPager->
26b70 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
26b80 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69  .  /* At one poi
26b90 6e 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65  nt the code here
26ba0 20 63 61 6c 6c 65 64 20 61 73 73 65 72 74 54 72   called assertTr
26bb0 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
26bc0 28 29 20 74 6f 0a 20 20 2a 2a 20 65 6e 73 75 72  () to.  ** ensur
26bd0 65 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73  e that all pages
26be0 20 62 65 69 6e 67 20 74 72 75 6e 63 61 74 65 64   being truncated
26bf0 20 61 77 61 79 20 62 79 20 74 68 69 73 20 6f 70   away by this op
26c00 65 72 61 74 69 6f 6e 20 61 72 65 2c 0a 20 20 2a  eration are,.  *
26c10 2a 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  * if one or more
26c20 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20   savepoints are 
26c30 6f 70 65 6e 2c 20 70 72 65 73 65 6e 74 20 69 6e  open, present in
26c40 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a   the savepoint .
26c50 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 73 6f 20    ** journal so 
26c60 74 68 61 74 20 74 68 65 79 20 63 61 6e 20 62 65  that they can be
26c70 20 72 65 73 74 6f 72 65 64 20 69 66 20 74 68 65   restored if the
26c80 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 72 6f   savepoint is ro
26c90 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b 2e 20  lled.  ** back. 
26ca0 54 68 69 73 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  This is no longe
26cb0 72 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74  r necessary as t
26cc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
26cd0 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a 20 63 61  now only.  ** ca
26ce0 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66 6f 72  lled right befor
26cf0 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74  e committing a t
26d00 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20 61  ransaction. So a
26d10 6c 74 68 6f 75 67 68 20 74 68 65 20 0a 20 20 2a  lthough the .  *
26d20 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 6d  * Pager object m
26d30 61 79 20 73 74 69 6c 6c 20 68 61 76 65 20 6f 70  ay still have op
26d40 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 28 50  en savepoints (P
26d50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 21  ager.nSavepoint!
26d60 3d 30 29 2c 20 0a 20 20 2a 2a 20 74 68 65 79 20  =0), .  ** they 
26d70 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64  cannot be rolled
26d80 20 62 61 63 6b 2e 20 53 6f 20 74 68 65 20 61 73   back. So the as
26d90 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
26da0 74 72 61 69 6e 74 28 29 20 63 61 6c 6c 0a 20 20  traint() call.  
26db0 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  ** is no longer 
26dc0 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d 0a 0a 0a  correct. */.}...
26dd0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
26de0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65  ion is called be
26df0 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
26e00 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
26e10 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79  llback. It.** sy
26e20 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ncs the journal 
26e30 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20 74 68  file to disk, th
26e40 65 6e 20 73 65 74 73 20 70 50 61 67 65 72 2d 3e  en sets pPager->
26e50 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 74 68  journalHdr to th
26e60 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65  e.** size of the
26e70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f   journal file so
26e80 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 5f   that the pager_
26e90 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69  playback() routi
26ea0 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74  ne knows.** that
26eb0 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72   the entire jour
26ec0 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65  nal file has bee
26ed0 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  n synced..**.** 
26ee0 53 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f  Syncing a hot-jo
26ef0 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20 62 65  urnal to disk be
26f00 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
26f10 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20  to roll it back 
26f20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68 61 74  ensures .** that
26f30 20 69 66 20 61 20 70 6f 77 65 72 2d 66 61 69 6c   if a power-fail
26f40 75 72 65 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ure occurs durin
26f50 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20  g the rollback, 
26f60 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
26f70 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 72 6f 6c  .** attempts rol
26f80 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20  lback following 
26f90 73 79 73 74 65 6d 20 72 65 63 6f 76 65 72 79 20  system recovery 
26fa0 73 65 65 73 20 74 68 65 20 73 61 6d 65 20 6a 6f  sees the same jo
26fb0 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74  urnal.** content
26fc0 20 61 73 20 74 68 69 73 20 70 72 6f 63 65 73 73   as this process
26fd0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79  ..**.** If every
26fe0 74 68 69 6e 67 20 67 6f 65 73 20 61 73 20 70 6c  thing goes as pl
26ff0 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  anned, SQLITE_OK
27000 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
27010 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20  herwise, .** an 
27020 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
27030 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
27040 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75   pagerSyncHotJou
27050 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
27060 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
27070 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
27080 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
27090 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
270a0 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
270b0 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53  r->jfd, SQLITE_S
270c0 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d  YNC_NORMAL);.  }
270d0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
270e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
270f0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
27100 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
27110 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
27120 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Hdr);.  }.  retu
27130 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51  rn rc;.}..#if SQ
27140 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
27150 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69  ZE>0./*.** Obtai
27160 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  n a reference to
27170 20 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64   a memory mapped
27180 20 70 61 67 65 20 6f 62 6a 65 63 74 20 66 6f 72   page object for
27190 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 67 6e   page number pgn
271a0 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f  o. .** The new o
271b0 62 6a 65 63 74 20 77 69 6c 6c 20 75 73 65 20 74  bject will use t
271c0 68 65 20 70 6f 69 6e 74 65 72 20 70 44 61 74 61  he pointer pData
271d0 2c 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  , obtained from 
271e0 78 46 65 74 63 68 28 29 2e 0a 2a 2a 20 49 66 20  xFetch()..** If 
271f0 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
27200 2a 70 70 50 61 67 65 20 74 6f 20 70 6f 69 6e 74  *ppPage to point
27210 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65   to the new page
27220 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20 61 6e   reference.** an
27230 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
27240 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  OK. Otherwise, r
27250 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
27260 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 73  error code and s
27270 65 74 0a 2a 2a 20 2a 70 70 50 61 67 65 20 74 6f  et.** *ppPage to
27280 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 50 61 67   zero..**.** Pag
27290 65 20 72 65 66 65 72 65 6e 63 65 73 20 6f 62 74  e references obt
272a0 61 69 6e 65 64 20 62 79 20 63 61 6c 6c 69 6e 67  ained by calling
272b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
272c0 68 6f 75 6c 64 20 62 65 20 72 65 6c 65 61 73 65  hould be release
272d0 64 0a 2a 2a 20 62 79 20 63 61 6c 6c 69 6e 67 20  d.** by calling 
272e0 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50  pagerReleaseMapP
272f0 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  age()..*/.static
27300 20 69 6e 74 20 70 61 67 65 72 41 63 71 75 69 72   int pagerAcquir
27310 65 4d 61 70 50 61 67 65 28 0a 20 20 50 61 67 65  eMapPage(.  Page
27320 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
27330 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
27340 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
27350 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
27360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27370 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
27380 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61  */.  void *pData
27390 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
273a0 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 28 29       /* xFetch()
273b0 27 64 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  'd data for this
273c0 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72   page */.  PgHdr
273d0 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20 20 20   **ppPage       
273e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
273f0 54 3a 20 41 63 71 75 69 72 65 64 20 70 61 67 65  T: Acquired page
27400 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
27410 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20  PgHdr *p;       
27420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27430 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64  /* Memory mapped
27440 20 70 61 67 65 20 74 6f 20 72 65 74 75 72 6e 20   page to return 
27450 2a 2f 0a 20 20 0a 20 20 69 66 28 20 70 50 61 67  */.  .  if( pPag
27460 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73  er->pMmapFreelis
27470 74 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  t ){.    *ppPage
27480 20 3d 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 70   = p = pPager->p
27490 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20  MmapFreelist;.  
274a0 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46    pPager->pMmapF
274b0 72 65 65 6c 69 73 74 20 3d 20 70 2d 3e 70 44 69  reelist = p->pDi
274c0 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72  rty;.    p->pDir
274d0 74 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  ty = 0;.    asse
274e0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  rt( pPager->nExt
274f0 72 61 3e 3d 38 20 29 3b 0a 20 20 20 20 6d 65 6d  ra>=8 );.    mem
27500 73 65 74 28 70 2d 3e 70 45 78 74 72 61 2c 20 30  set(p->pExtra, 0
27510 2c 20 38 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 8);.  }else{. 
27520 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 20 3d     *ppPage = p =
27530 20 28 50 67 48 64 72 20 2a 29 73 71 6c 69 74 65   (PgHdr *)sqlite
27540 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65  3MallocZero(size
27550 6f 66 28 50 67 48 64 72 29 20 2b 20 70 50 61 67  of(PgHdr) + pPag
27560 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20  er->nExtra);.   
27570 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
27580 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65     sqlite3OsUnfe
27590 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  tch(pPager->fd, 
275a0 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20  (i64)(pgno-1) * 
275b0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
275c0 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  , pData);.      
275d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
275e0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
275f0 20 20 20 20 70 2d 3e 70 45 78 74 72 61 20 3d 20      p->pExtra = 
27600 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 3b 0a 20  (void *)&p[1];. 
27610 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 50 47     p->flags = PG
27620 48 44 52 5f 4d 4d 41 50 3b 0a 20 20 20 20 70 2d  HDR_MMAP;.    p-
27630 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70  >nRef = 1;.    p
27640 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
27650 72 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  r;.  }..  assert
27660 28 20 70 2d 3e 70 45 78 74 72 61 3d 3d 28 76 6f  ( p->pExtra==(vo
27670 69 64 20 2a 29 26 70 5b 31 5d 20 29 3b 0a 20 20  id *)&p[1] );.  
27680 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65  assert( p->pPage
27690 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
276a0 20 70 2d 3e 66 6c 61 67 73 3d 3d 50 47 48 44 52   p->flags==PGHDR
276b0 5f 4d 4d 41 50 20 29 3b 0a 20 20 61 73 73 65 72  _MMAP );.  asser
276c0 74 28 20 70 2d 3e 70 50 61 67 65 72 3d 3d 70 50  t( p->pPager==pP
276d0 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  ager );.  assert
276e0 28 20 70 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a  ( p->nRef==1 );.
276f0 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e  .  p->pgno = pgn
27700 6f 3b 0a 20 20 70 2d 3e 70 44 61 74 61 20 3d 20  o;.  p->pData = 
27710 70 44 61 74 61 3b 0a 20 20 70 50 61 67 65 72 2d  pData;.  pPager-
27720 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a 0a 20 20  >nMmapOut++;..  
27730 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27740 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
27750 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66 65  * Release a refe
27760 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 70 50  rence to page pP
27770 67 2e 20 70 50 67 20 6d 75 73 74 20 68 61 76 65  g. pPg must have
27780 20 62 65 65 6e 20 72 65 74 75 72 6e 65 64 20 62   been returned b
27790 79 20 61 6e 20 0a 2a 2a 20 65 61 72 6c 69 65 72  y an .** earlier
277a0 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 41 63   call to pagerAc
277b0 71 75 69 72 65 4d 61 70 50 61 67 65 28 29 2e 0a  quireMapPage()..
277c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
277d0 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61  agerReleaseMapPa
277e0 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
277f0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
27800 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
27810 20 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75   pPager->nMmapOu
27820 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e 70 44 69 72  t--;.  pPg->pDir
27830 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 4d 6d  ty = pPager->pMm
27840 61 70 46 72 65 65 6c 69 73 74 3b 0a 20 20 70 50  apFreelist;.  pP
27850 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
27860 69 73 74 20 3d 20 70 50 67 3b 0a 0a 20 20 61 73  ist = pPg;..  as
27870 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 64  sert( pPager->fd
27880 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72  ->pMethods->iVer
27890 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20 20 73 71 6c  sion>=3 );.  sql
278a0 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50  ite3OsUnfetch(pP
278b0 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28  ager->fd, (i64)(
278c0 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 2a 70 50 61  pPg->pgno-1)*pPa
278d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
278e0 50 67 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f  Pg->pData);.}../
278f0 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 50 67  *.** Free all Pg
27900 48 64 72 20 6f 62 6a 65 63 74 73 20 73 74 6f 72  Hdr objects stor
27910 65 64 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  ed in the Pager.
27920 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 6c 69  pMmapFreelist li
27930 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
27940 69 64 20 70 61 67 65 72 46 72 65 65 4d 61 70 48  id pagerFreeMapH
27950 64 72 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  drs(Pager *pPage
27960 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a  r){.  PgHdr *p;.
27970 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 3b 0a    PgHdr *pNext;.
27980 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e    for(p=pPager->
27990 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 70  pMmapFreelist; p
279a0 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  ; p=pNext){.    
279b0 70 4e 65 78 74 20 3d 20 70 2d 3e 70 44 69 72 74  pNext = p->pDirt
279c0 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  y;.    sqlite3_f
279d0 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  ree(p);.  }.}...
279e0 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  /*.** Shutdown t
279f0 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
27a00 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
27a10 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69  and close all fi
27a20 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  les..**.** If a 
27a30 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
27a40 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e  in progress when
27a50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
27a60 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a   called, that.**
27a70 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
27a80 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c  rolled back.  Al
27a90 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  l outstanding pa
27aa0 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
27ab0 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72  ted.** and their
27ac0 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64   memory is freed
27ad0 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
27ae0 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73  o use a page ass
27af0 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
27b00 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20  this page cache 
27b10 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
27b20 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c  ion returns will
27b30 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
27b40 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
27b50 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
27b60 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63  tion always succ
27b70 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73  eeds. If a trans
27b80 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
27b90 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69   an attempt.** i
27ba0 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69  s made to roll i
27bb0 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72  t back. If an er
27bc0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
27bd0 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a  g the rollback .
27be0 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ** a hot journal
27bf0 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
27c00 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62  the filesystem b
27c10 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72  ut no error is r
27c20 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68  eturned.** to th
27c30 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74  e caller..*/.int
27c40 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
27c50 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  se(Pager *pPager
27c60 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  , sqlite3 *db){.
27c70 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 28 75 38    u8 *pTmp = (u8
27c80 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   *)pPager->pTmpS
27c90 70 61 63 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  pace;..  assert(
27ca0 20 64 62 20 7c 7c 20 70 61 67 65 72 55 73 65 57   db || pagerUseW
27cb0 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  al(pPager)==0 );
27cc0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
27cd0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
27ce0 61 67 65 72 29 20 29 3b 0a 20 20 64 69 73 61 62  ager) );.  disab
27cf0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
27d00 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69  errors();.  sqli
27d10 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
27d20 6c 6c 6f 63 28 29 3b 0a 20 20 70 61 67 65 72 46  lloc();.  pagerF
27d30 72 65 65 4d 61 70 48 64 72 73 28 70 50 61 67 65  reeMapHdrs(pPage
27d40 72 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  r);.  /* pPager-
27d50 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 20 2a 2f  >errCode = 0; */
27d60 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
27d70 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 23 69  siveMode = 0;.#i
27d80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
27d90 54 5f 57 41 4c 0a 20 20 61 73 73 65 72 74 28 20  T_WAL.  assert( 
27da0 64 62 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 57  db || pPager->pW
27db0 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  al==0 );.  sqlit
27dc0 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61 67 65  e3WalClose(pPage
27dd0 72 2d 3e 70 57 61 6c 2c 20 64 62 2c 20 70 50 61  r->pWal, db, pPa
27de0 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
27df0 67 73 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  gs, pPager->page
27e00 53 69 7a 65 2c 0a 20 20 20 20 20 20 28 64 62 20  Size,.      (db 
27e10 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  && (db->flags & 
27e20 53 51 4c 49 54 45 5f 4e 6f 43 6b 70 74 4f 6e 43  SQLITE_NoCkptOnC
27e30 6c 6f 73 65 29 20 3f 20 30 20 3a 20 70 54 6d 70  lose) ? 0 : pTmp
27e40 29 0a 20 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  ).  );.  pPager-
27e50 3e 70 57 61 6c 20 3d 20 30 3b 0a 23 65 6e 64 69  >pWal = 0;.#endi
27e60 66 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74 28  f.  pager_reset(
27e70 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 4d  pPager);.  if( M
27e80 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65  EMDB ){.    page
27e90 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
27ea0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
27eb0 2a 20 49 66 20 69 74 20 69 73 20 6f 70 65 6e 2c  * If it is open,
27ec0 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
27ed0 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61  l file before ca
27ee0 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64 52  lling UnlockAndR
27ef0 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 2a 2a 20  ollback..    ** 
27f00 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 64  If this is not d
27f10 6f 6e 65 2c 20 74 68 65 6e 20 61 6e 20 75 6e 73  one, then an uns
27f20 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66  ynced portion of
27f30 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61   the open journa
27f40 6c 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6d  l .    ** file m
27f50 61 79 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  ay be played bac
27f60 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
27f70 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20  ase. If a power 
27f80 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 0a  failure occurs .
27f90 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 74 68 69      ** while thi
27fa0 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20  s is happening, 
27fb0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
27fc0 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70  ld become corrup
27fd0 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
27fe0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
27ff0 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
28000 20 74 6f 20 73 79 6e 63 20 74 68 65 20 6a 6f 75   to sync the jou
28010 72 6e 61 6c 2c 20 73 68 69 66 74 20 74 68 65 20  rnal, shift the 
28020 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 69 6e 74  pager.    ** int
28030 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
28040 65 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 55  e. This causes U
28050 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
28060 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 20   to unlock the. 
28070 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
28080 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75  nd close the jou
28090 72 6e 61 6c 20 66 69 6c 65 20 77 69 74 68 6f 75  rnal file withou
280a0 74 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  t attempting to 
280b0 72 6f 6c 6c 20 69 74 0a 20 20 20 20 2a 2a 20 62  roll it.    ** b
280c0 61 63 6b 20 6f 72 20 66 69 6e 61 6c 69 7a 65 20  ack or finalize 
280d0 69 74 2e 20 54 68 65 20 6e 65 78 74 20 64 61 74  it. The next dat
280e0 61 62 61 73 65 20 75 73 65 72 20 77 69 6c 6c 20  abase user will 
280f0 68 61 76 65 20 74 6f 20 64 6f 20 68 6f 74 2d 6a  have to do hot-j
28100 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 72 6f  ournal.    ** ro
28110 6c 6c 62 61 63 6b 20 62 65 66 6f 72 65 20 61 63  llback before ac
28120 63 65 73 73 69 6e 67 20 74 68 65 20 64 61 74 61  cessing the data
28130 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
28140 2f 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  /.    if( isOpen
28150 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
28160 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72  .      pager_err
28170 6f 72 28 70 50 61 67 65 72 2c 20 70 61 67 65 72  or(pPager, pager
28180 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70  SyncHotJournal(p
28190 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20  Pager));.    }. 
281a0 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e     pagerUnlockAn
281b0 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
281c0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
281d0 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
281e0 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  );.  enable_simu
281f0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
28200 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  );.  PAGERTRACE(
28210 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50  ("CLOSE %d\n", P
28220 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
28230 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c  ;.  IOTRACE(("CL
28240 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  OSE %p\n", pPage
28250 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f 73 43  r)).  sqlite3OsC
28260 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
28270 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  );.  sqlite3OsCl
28280 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ose(pPager->fd);
28290 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72  .  sqlite3PageFr
282a0 65 65 28 70 54 6d 70 29 3b 0a 20 20 73 71 6c 69  ee(pTmp);.  sqli
282b0 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70  te3PcacheClose(p
282c0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
282d0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
282e0 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20  HAS_CODEC.  if( 
282f0 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72  pPager->xCodecFr
28300 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43 6f  ee ) pPager->xCo
28310 64 65 63 46 72 65 65 28 70 50 61 67 65 72 2d 3e  decFree(pPager->
28320 70 43 6f 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a  pCodec);.#endif.
28330 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
28340 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 26  er->aSavepoint &
28350 26 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  & !pPager->pInJo
28360 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
28370 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  t( !isOpen(pPage
28380 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70  r->jfd) && !isOp
28390 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
283a0 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66   );..  sqlite3_f
283b0 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ree(pPager);.  r
283c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
283d0 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
283e0 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  (NDEBUG) || defi
283f0 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
28400 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
28410 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
28420 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50  r page pPg..*/.P
28430 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  gno sqlite3Pager
28440 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67  Pagenumber(DbPag
28450 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  e *pPg){.  retur
28460 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23  n pPg->pgno;.}.#
28470 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  endif../*.** Inc
28480 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
28490 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70  ence count for p
284a0 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64  age pPg..*/.void
284b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
284c0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
284d0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
284e0 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  f(pPg);.}../*.**
284f0 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
28500 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  l. In other word
28510 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  s, make sure all
28520 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20   the pages that 
28530 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69  have.** been wri
28540 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
28550 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c  nal have actuall
28560 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75  y reached the su
28570 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20  rface of the.** 
28580 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 65 20  disk and can be 
28590 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  restored in the 
285a0 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a  event of a hot-j
285b0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e  ournal rollback.
285c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 61  .**.** If the Pa
285d0 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20  ger.noSync flag 
285e0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69  is set, then thi
285f0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
28600 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77  no-op..** Otherw
28610 69 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73  ise, the actions
28620 20 72 65 71 75 69 72 65 64 20 64 65 70 65 6e 64   required depend
28630 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   on the journal-
28640 6d 6f 64 65 20 61 6e 64 20 74 68 65 20 0a 2a 2a  mode and the .**
28650 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
28660 72 69 73 74 69 63 73 20 6f 66 20 74 68 65 20 66  ristics of the f
28670 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20 66  ile-system, as f
28680 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
28690 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
286a0 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d   file is an in-m
286b0 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
286c0 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65  le, no action ne
286d0 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61 6b  ed.**     be tak
286e0 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74  en..**.**   * Ot
286f0 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
28700 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20  device does not 
28710 73 75 70 70 6f 72 74 20 74 68 65 20 53 41 46 45  support the SAFE
28720 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
28730 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68  ,.**     then th
28740 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20  e nRec field of 
28750 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
28760 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61  y written journa
28770 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20  l header.**     
28780 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f  is updated to co
28790 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ntain the number
287a0 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f   of journal reco
287b0 72 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a  rds that have.**
287c0 20 20 20 20 20 62 65 65 6e 20 77 72 69 74 74 65       been writte
287d0 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20  n following it. 
287e0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
287f0 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75 6c  operating in ful
28800 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f  l-sync.**     mo
28810 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  de, then the jou
28820 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e  rnal file is syn
28830 63 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20  ced before this 
28840 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
28850 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74  ..**.**   * If t
28860 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e  he device does n
28870 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53  ot support the S
28880 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 72  EQUENTIAL proper
28890 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20  ty, then .**    
288a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
288b0 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f   synced..**.** O
288c0 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64  r, in pseudo-cod
288d0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e  e:.**.**   if( N
288e0 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f  OT <in-memory jo
288f0 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20  urnal> ){.**    
28900 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41 50   if( NOT SAFE_AP
28910 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20  PEND ){.**      
28920 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20   if( <full-sync 
28930 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a  mode> ) xSync(<j
28940 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a  ournal file>);.*
28950 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74 65 20  *       <update 
28960 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20  nRec field>.**  
28970 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28     } .**     if(
28980 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20   NOT SEQUENTIAL 
28990 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c  ) xSync(<journal
289a0 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a   file>);.**   }.
289b0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
289c0 66 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ful, this routin
289d0 65 20 63 6c 65 61 72 73 20 74 68 65 20 50 47 48  e clears the PGH
289e0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
289f0 67 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70  g of every .** p
28a00 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65  age currently he
28a10 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66  ld in memory bef
28a20 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51  ore returning SQ
28a30 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49  LITE_OK. If an I
28a40 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e  O.** error is en
28a50 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
28a60 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
28a70 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
28a80 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
28a90 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
28aa0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
28ab0 61 67 65 72 2c 20 69 6e 74 20 6e 65 77 48 64 72  ager, int newHdr
28ac0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
28ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ae0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
28af0 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ode */..  assert
28b00 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
28b10 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
28b20 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
28b30 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
28b40 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
28b50 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65  BMOD.  );.  asse
28b60 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
28b70 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
28b80 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 61 67  ;.  assert( !pag
28b90 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
28ba0 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   );..  rc = sqli
28bb0 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76  te3PagerExclusiv
28bc0 65 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  eLock(pPager);. 
28bd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28be0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
28bf0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
28c00 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73  noSync ){.    as
28c10 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
28c20 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
28c30 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
28c40 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72  ->jfd) && pPager
28c50 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
28c60 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
28c70 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
28c80 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d   const int iDc =
28c90 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
28ca0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
28cb0 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
28cc0 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
28cd0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
28ce0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ;..      if( 0==
28cf0 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
28d00 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29  P_SAFE_APPEND) )
28d10 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
28d20 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69  s block deals wi
28d30 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70 72  th an obscure pr
28d40 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c 61  oblem. If the la
28d50 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20  st connection.  
28d60 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72        ** that wr
28d70 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61 74 61  ote to this data
28d80 62 61 73 65 20 77 61 73 20 6f 70 65 72 61 74 69  base was operati
28d90 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e 74  ng in persistent
28da0 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20  -journal.       
28db0 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74   ** mode, then t
28dc0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
28dd0 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f 69 6e  may at this poin
28de0 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c 61  t actually be la
28df0 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20  rger.        ** 
28e00 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e  than Pager.journ
28e10 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66 20  alOff bytes. If 
28e20 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20 69  the next thing i
28e30 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  n the journal.  
28e40 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68 61        ** file ha
28e50 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f  ppens to be a jo
28e60 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77 72  urnal-header (wr
28e70 69 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f 66  itten as part of
28e80 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
28e90 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74  previous connect
28ea0 69 6f 6e 27 73 20 74 72 61 6e 73 61 63 74 69 6f  ion's transactio
28eb0 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20  n), and a crash 
28ec0 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  or power-failure
28ed0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63   .        ** occ
28ee0 75 72 73 20 61 66 74 65 72 20 6e 52 65 63 20 69  urs after nRec i
28ef0 73 20 75 70 64 61 74 65 64 20 62 75 74 20 62 65  s updated but be
28f00 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63  fore this connec
28f10 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20  tion writes .   
28f20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67       ** anything
28f30 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75   else to the jou
28f40 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f  rnal file (or co
28f50 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b  mmits/rolls back
28f60 20 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a   its .        **
28f70 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74   transaction), t
28f80 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62  hen SQLite may b
28f90 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77  ecome confused w
28fa0 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20  hen doing the . 
28fb0 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f         ** hot-jo
28fc0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66  urnal rollback f
28fd0 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72  ollowing recover
28fe0 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62  y. It may roll b
28ff0 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20  ack all.        
29000 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65  ** of this conne
29010 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65  ctions data, the
29020 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c  n proceed to rol
29030 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c  ling back the ol
29040 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  d,.        ** ou
29050 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74  t-of-date data t
29060 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20  hat follows it. 
29070 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
29080 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ion..        **.
29090 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f          ** To wo
290a0 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20  rk around this, 
290b0 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  if the journal f
290c0 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72 20  ile does appear 
290d0 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20  to contain.     
290e0 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65     ** a valid he
290f0 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50  ader following P
29100 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ager.journalOff,
29110 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 30 78   then write a 0x
29120 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79  00.        ** by
29130 74 65 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  te to the start 
29140 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74  of it to prevent
29150 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72   it from being r
29160 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20  ecognized..     
29170 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
29180 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48   Variable iNextH
29190 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
291a0 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61 74  to the offset at
291b0 20 77 68 69 63 68 20 74 68 69 73 0a 20 20 20 20   which this.    
291c0 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74      ** problemat
291d0 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f  ic header will o
291e0 63 63 75 72 2c 20 69 66 20 69 74 20 65 78 69 73  ccur, if it exis
291f0 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73  ts. aMagic is us
29200 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ed .        ** a
29210 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75  s a temporary bu
29220 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20  ffer to inspect 
29230 74 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65  the first couple
29240 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20   of bytes of.   
29250 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65       ** the pote
29260 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65  ntial journal he
29270 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ader..        */
29280 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65  .        i64 iNe
29290 78 74 48 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  xtHdrOffset;.   
292a0 20 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38       u8 aMagic[8
292b0 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20 7a 48  ];.        u8 zH
292c0 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
292d0 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a  urnalMagic)+4];.
292e0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
292f0 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61  zHeader, aJourna
29300 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
29310 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
29320 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74          put32bit
29330 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
29340 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
29350 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29  ], pPager->nRec)
29360 3b 0a 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74  ;..        iNext
29370 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72  HdrOffset = jour
29380 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
29390 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ger);.        rc
293a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
293b0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
293c0 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64  agic, 8, iNextHd
293d0 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  rOffset);.      
293e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
293f0 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  _OK && 0==memcmp
29400 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
29410 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20  lMagic, 8) ){.  
29420 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63          static c
29430 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65  onst u8 zerobyte
29440 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
29450 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
29460 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
29470 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69   &zerobyte, 1, i
29480 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a  NextHdrOffset);.
29490 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
294a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
294b0 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
294c0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
294d0 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
294e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
294f0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
29500 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20   Write the nRec 
29510 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a  value into the j
29520 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64  ournal file head
29530 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20  er. If in.      
29540 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72    ** full-synchr
29550 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63  onous mode, sync
29560 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72   the journal fir
29570 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  st. This ensures
29580 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
29590 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65   all data has re
295a0 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73  ally hit the dis
295b0 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73  k before nRec is
295c0 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b   updated to mark
295d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61  .        ** it a
295e0 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
295f0 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20  r rollback..    
29600 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
29610 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  * This is not re
29620 71 75 69 72 65 64 20 69 66 20 74 68 65 20 70 65  quired if the pe
29630 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73  rsistent media s
29640 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20  upports the.    
29650 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45      ** SAFE_APPE
29660 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63  ND property. Bec
29670 61 75 73 65 20 69 6e 20 74 68 69 73 20 63 61 73  ause in this cas
29680 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  e it is not poss
29690 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  ible .        **
296a0 20 66 6f 72 20 67 61 72 62 61 67 65 20 64 61 74   for garbage dat
296b0 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64  a to be appended
296c0 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68   to the file, th
296d0 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20  e nRec field.   
296e0 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c       ** is popul
296f0 61 74 65 64 20 77 69 74 68 20 30 78 46 46 46 46  ated with 0xFFFF
29700 46 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f  FFFF when the jo
29710 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
29720 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20  written.        
29730 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65  ** and never nee
29740 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
29750 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
29760 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
29770 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d  >fullSync && 0==
29780 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
29790 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b  P_SEQUENTIAL) ){
297a0 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52  .          PAGER
297b0 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75  TRACE(("SYNC jou
297c0 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
297d0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
297e0 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52  ;.          IOTR
297f0 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
29800 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
29810 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
29820 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
29830 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
29840 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  ncFlags);.      
29850 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
29860 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
29870 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
29880 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
29890 48 44 52 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20  HDR %p %lld\n", 
298a0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
298b0 6a 6f 75 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20  journalHdr));.  
298c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
298d0 65 33 4f 73 57 72 69 74 65 28 0a 20 20 20 20 20  e3OsWrite(.     
298e0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
298f0 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a  fd, zHeader, siz
29900 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 20 70 50  eof(zHeader), pP
29910 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
29920 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
29930 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
29940 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
29950 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
29960 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c   if( 0==(iDc&SQL
29970 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
29980 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  TIAL) ){.       
29990 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59   PAGERTRACE(("SY
299a0 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
299b0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
299c0 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ger)));.        
299d0 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
299e0 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
299f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
29a00 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
29a10 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
29a20 73 79 6e 63 46 6c 61 67 73 7c 20 0a 20 20 20 20  syncFlags| .    
29a30 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73        (pPager->s
29a40 79 6e 63 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45  yncFlags==SQLITE
29a50 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54  _SYNC_FULL?SQLIT
29a60 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a  E_SYNC_DATAONLY:
29a70 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  0).        );.  
29a80 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
29a90 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
29aa0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
29ab0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
29ac0 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
29ad0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20  >journalOff;.   
29ae0 20 20 20 69 66 28 20 6e 65 77 48 64 72 20 26 26     if( newHdr &&
29af0 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
29b00 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
29b10 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  D) ){.        pP
29b20 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
29b30 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
29b40 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
29b50 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ger);.        if
29b60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29b70 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
29b80 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
29b90 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
29ba0 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
29bb0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
29bc0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55     }.  }..  /* U
29bd0 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20  nless the pager 
29be0 69 73 20 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64  is in noSync mod
29bf0 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  e, the journal f
29c00 69 6c 65 20 77 61 73 20 6a 75 73 74 20 0a 20 20  ile was just .  
29c10 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ** successfully 
29c20 73 79 6e 63 65 64 2e 20 45 69 74 68 65 72 20 77  synced. Either w
29c30 61 79 2c 20 63 6c 65 61 72 20 74 68 65 20 50 47  ay, clear the PG
29c40 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
29c50 61 67 20 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20  ag on .  ** all 
29c60 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  pages..  */.  sq
29c70 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72  lite3PcacheClear
29c80 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72  SyncFlags(pPager
29c90 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 70 50  ->pPCache);.  pP
29ca0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
29cb0 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
29cc0 44 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  D;.  assert( ass
29cd0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
29ce0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
29cf0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
29d00 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75  ../*.** The argu
29d10 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73  ment is the firs
29d20 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69  t in a linked li
29d30 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65  st of dirty page
29d40 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62  s connected.** b
29d50 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72  y the PgHdr.pDir
29d60 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73  ty pointer. This
29d70 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73   function writes
29d80 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65   each one of the
29d90 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  .** in-memory pa
29da0 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ges in the list 
29db0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
29dc0 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65  file. The argume
29dd0 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c  nt may.** be NUL
29de0 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  L, representing 
29df0 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49  an empty list. I
29e00 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73  n this case this
29e10 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
29e20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
29e30 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f  he pager must ho
29e40 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  ld at least a RE
29e50 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e  SERVED lock when
29e60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
29e70 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66  * is called. Bef
29e80 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74  ore writing anyt
29e90 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
29ea0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20  base file, this 
29eb0 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61  lock.** is upgra
29ec0 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  ded to an EXCLUS
29ed0 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65  IVE lock. If the
29ee0 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20   lock cannot be 
29ef0 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c  obtained,.** SQL
29f00 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
29f10 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61  rned and no data
29f20 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
29f30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
29f40 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
29f50 70 61 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d  pager is a temp-
29f60 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74  file pager and t
29f70 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73  he actual file-s
29f80 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73  ystem file.** is
29f90 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69   not yet open, i
29fa0 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
29fb0 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61   opened before a
29fc0 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77  ny data is .** w
29fd0 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a  ritten out..**.*
29fe0 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20  * Once the lock 
29ff0 68 61 73 20 62 65 65 6e 20 75 70 67 72 61 64 65  has been upgrade
2a000 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73  d and, if necess
2a010 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70  ary, the file op
2a020 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67  ened,.** the pag
2a030 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  es are written o
2a040 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
2a050 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20  se file in list 
2a060 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a  order. Writing.*
2a070 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b 69 70  * a page is skip
2a080 70 65 64 20 69 66 20 69 74 20 6d 65 65 74 73 20  ped if it meets 
2a090 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f  either of the fo
2a0a0 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61  llowing criteria
2a0b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
2a0c0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67  page number is g
2a0d0 72 65 61 74 65 72 20 74 68 61 6e 20 50 61 67 65  reater than Page
2a0e0 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20  r.dbSize, or.** 
2a0f0 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f    * The PGHDR_DO
2a100 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73  NT_WRITE flag is
2a110 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65   set on the page
2a120 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69  ..**.** If writi
2a130 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20 63 61  ng out a page ca
2a140 75 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73  uses the databas
2a150 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20  e file to grow, 
2a160 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65  Pager.dbFileSize
2a170 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20 61  .** is updated a
2a180 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70  ccordingly. If p
2a190 61 67 65 20 31 20 69 73 20 77 72 69 74 74 65 6e  age 1 is written
2a1a0 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76   out, then the v
2a1b0 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69  alue cached.** i
2a1c0 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  n Pager.dbFileVe
2a1d0 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20  rs[] is updated 
2a1e0 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77  to match the new
2a1f0 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
2a200 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
2a210 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
2a220 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
2a230 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
2a240 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
2a250 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
2a260 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49  .** occurs, an I
2a270 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
2a280 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66  returned. Or, if
2a290 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c   the EXCLUSIVE l
2a2a0 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65  ock cannot.** be
2a2b0 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54   obtained, SQLIT
2a2c0 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
2a2d0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2a2e0 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  t pager_write_pa
2a2f0 67 65 6c 69 73 74 28 50 61 67 65 72 20 2a 70 50  gelist(Pager *pP
2a300 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 4c 69  ager, PgHdr *pLi
2a310 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  st){.  int rc = 
2a320 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2a330 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2a340 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
2a350 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
2a360 6e 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  n is only called
2a370 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 70 61   for rollback pa
2a380 67 65 72 73 20 69 6e 20 57 52 49 54 45 52 5f 44  gers in WRITER_D
2a390 42 4d 4f 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20  BMOD state. */. 
2a3a0 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
2a3b0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
2a3c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2a3d0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 70  r->tempFile || p
2a3e0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
2a3f0 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
2a400 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
2a410 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58  Pager->eLock==EX
2a420 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
2a430 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
2a440 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
2a450 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30  pList->pDirty==0
2a460 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
2a470 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d   file is a temp-
2a480 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74  file has not yet
2a490 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70   been opened, op
2a4a0 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20  en it now. It.  
2a4b0 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  ** is not possib
2a4c0 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20  le for rc to be 
2a4d0 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
2a4e0 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61  E_OK if this bra
2a4f0 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65  nch.  ** is take
2a500 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69 74  n, as pager_wait
2a510 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20  _on_lock() is a 
2a520 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66  no-op for temp-f
2a530 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  iles..  */.  if(
2a540 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
2a550 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65  >fd) ){.    asse
2a560 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  rt( pPager->temp
2a570 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49  File && rc==SQLI
2a580 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20  TE_OK );.    rc 
2a590 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  = pagerOpentemp(
2a5a0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
2a5b0 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46  fd, pPager->vfsF
2a5c0 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lags);.  }..  /*
2a5d0 20 42 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   Before the firs
2a5e0 74 20 77 72 69 74 65 2c 20 67 69 76 65 20 74 68  t write, give th
2a5f0 65 20 56 46 53 20 61 20 68 69 6e 74 20 6f 66 20  e VFS a hint of 
2a600 77 68 61 74 20 74 68 65 20 66 69 6e 61 6c 0a 20  what the final. 
2a610 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 77 69   ** file size wi
2a620 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  ll be..  */.  as
2a630 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
2a640 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50  _OK || isOpen(pP
2a650 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 69  ager->fd) );.  i
2a660 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a670 20 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e   .   && pPager->
2a680 64 62 48 69 6e 74 53 69 7a 65 3c 70 50 61 67 65  dbHintSize<pPage
2a690 72 2d 3e 64 62 53 69 7a 65 0a 20 20 20 26 26 20  r->dbSize.   && 
2a6a0 28 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 20 7c  (pList->pDirty |
2a6b0 7c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70 50  | pList->pgno>pP
2a6c0 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
2a6d0 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ).  ){.    sqlit
2a6e0 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20  e3_int64 szFile 
2a6f0 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
2a700 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e  ze * (sqlite3_in
2a710 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69  t64)pPager->dbSi
2a720 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  ze;.    sqlite3O
2a730 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
2a740 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
2a750 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48  ITE_FCNTL_SIZE_H
2a760 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20  INT, &szFile);. 
2a770 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e     pPager->dbHin
2a780 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  tSize = pPager->
2a790 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77  dbSize;.  }..  w
2a7a0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
2a7b0 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a  _OK && pList ){.
2a7c0 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20      Pgno pgno = 
2a7d0 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20  pList->pgno;..  
2a7e0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
2a7f0 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e  e dirty pages in
2a800 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
2a810 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
2a820 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a  s greater.    **
2a830 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69   than Pager.dbSi
2a840 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73  ze, this means s
2a850 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
2a860 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20 63  ateImage() was c
2a870 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  alled to.    ** 
2a880 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d  make the file sm
2a890 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c  aller (presumabl
2a8a0 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  y by auto-vacuum
2a8b0 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77   code). Do not w
2a8c0 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20  rite.    ** any 
2a8d0 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68  such pages to th
2a8e0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
2a8f0 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e     ** Also, do n
2a900 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79  ot write out any
2a910 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 74   page that has t
2a920 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  he PGHDR_DONT_WR
2a930 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20  ITE flag.    ** 
2a940 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c 69  set (set by sqli
2a950 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
2a960 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  e())..    */.   
2a970 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65   if( pgno<=pPage
2a980 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d  r->dbSize && 0==
2a990 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47  (pList->flags&PG
2a9a0 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20  HDR_DONT_WRITE) 
2a9b0 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  ){.      i64 off
2a9c0 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
2a9d0 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
2a9e0 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65  Size;   /* Offse
2a9f0 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  t to write */.  
2aa00 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b      char *pData;
2aa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa30 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72     /* Data to wr
2aa40 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20  ite */    ..    
2aa50 20 20 61 73 73 65 72 74 28 20 28 70 4c 69 73 74    assert( (pList
2aa60 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
2aa70 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20  ED_SYNC)==0 );. 
2aa80 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e       if( pList->
2aa90 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f  pgno==1 ) pager_
2aaa0 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e  write_changecoun
2aab0 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20 20  ter(pList);..   
2aac0 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65     /* Encode the
2aad0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
2aae0 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
2aaf0 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20  , pList->pData, 
2ab00 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20  pgno, 6, return 
2ab10 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
2ab20 54 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20  T, pData);..    
2ab30 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74    /* Write out t
2ab40 68 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f  he page data. */
2ab50 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2ab60 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
2ab70 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50  r->fd, pData, pP
2ab80 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
2ab90 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20  offset);..      
2aba0 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77 61 73  /* If page 1 was
2abb0 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75   just written, u
2abc0 70 64 61 74 65 20 50 61 67 65 72 2e 64 62 46 69  pdate Pager.dbFi
2abd0 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a  leVers to match.
2abe0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c        ** the val
2abf0 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e  ue now stored in
2ac00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2ac10 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74  le. If writing t
2ac20 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61  his .      ** pa
2ac30 67 65 20 63 61 75 73 65 64 20 74 68 65 20 64 61  ge caused the da
2ac40 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67  tabase file to g
2ac50 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46 69  row, update dbFi
2ac60 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a  leSize. .      *
2ac70 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  /.      if( pgno
2ac80 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  ==1 ){.        m
2ac90 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
2aca0 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74  bFileVers, &pDat
2acb0 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50  a[24], sizeof(pP
2acc0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
2acd0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
2ace0 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
2acf0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
2ad00 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
2ad10 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67  >dbFileSize = pg
2ad20 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  no;.      }.    
2ad30 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b    pPager->aStat[
2ad40 50 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45  PAGER_STAT_WRITE
2ad50 5d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55  ]++;..      /* U
2ad60 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70  pdate any backup
2ad70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67   objects copying
2ad80 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2ad90 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a   this pager. */.
2ada0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63        sqlite3Bac
2adb0 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
2adc0 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c  ->pBackup, pgno,
2add0 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e 70 44 61   (u8*)pList->pDa
2ade0 74 61 29 3b 0a 0a 20 20 20 20 20 20 50 41 47 45  ta);..      PAGE
2adf0 52 54 52 41 43 45 28 28 22 53 54 4f 52 45 20 25  RTRACE(("STORE %
2ae00 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
2ae10 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
2ae20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
2ae30 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
2ae40 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
2ae50 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20  h(pList)));.    
2ae60 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55    IOTRACE(("PGOU
2ae70 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  T %p %d\n", pPag
2ae80 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  er, pgno));.    
2ae90 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
2aea0 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
2aeb0 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 7d  db_count);.    }
2aec0 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45  else{.      PAGE
2aed0 52 54 52 41 43 45 28 28 22 4e 4f 53 54 4f 52 45  RTRACE(("NOSTORE
2aee0 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
2aef0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
2af00 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20   pgno));.    }. 
2af10 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67     pager_set_pag
2af20 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 20 20  ehash(pList);.  
2af30 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d    pList = pList-
2af40 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20  >pDirty;.  }..  
2af50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2af60 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20  .** Ensure that 
2af70 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
2af80 66 69 6c 65 20 69 73 20 6f 70 65 6e 2e 20 49 66  file is open. If
2af90 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f   it is already o
2afa0 70 65 6e 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75  pen, this .** fu
2afb0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
2afc0 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  p..**.** SQLITE_
2afd0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
2afe0 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65  f everything goe
2aff0 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70  s according to p
2b000 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49  lan. An .** SQLI
2b010 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72  TE_IOERR_XXX err
2b020 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
2b030 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74 6f  ned if a call to
2b040 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29   sqlite3OsOpen()
2b050 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73   .** fails..*/.s
2b060 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75  tatic int openSu
2b070 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  bJournal(Pager *
2b080 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
2b090 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2b0a0 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
2b0b0 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
2b0c0 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
2b0d0 73 20 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s =  SQLITE_OPEN
2b0e0 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 53 51  _SUBJOURNAL | SQ
2b0f0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
2b100 49 54 45 20 0a 20 20 20 20 20 20 7c 20 53 51 4c  ITE .      | SQL
2b110 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
2b120 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58  | SQLITE_OPEN_EX
2b130 43 4c 55 53 49 56 45 20 0a 20 20 20 20 20 20 7c  CLUSIVE .      |
2b140 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
2b150 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 20 20  ETEONCLOSE;.    
2b160 69 6e 74 20 6e 53 74 6d 74 53 70 69 6c 6c 20 3d  int nStmtSpill =
2b170 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 6e   sqlite3Config.n
2b180 53 74 6d 74 53 70 69 6c 6c 3b 0a 20 20 20 20 69  StmtSpill;.    i
2b190 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
2b1a0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
2b1b0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
2b1c0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a   || pPager->subj
2b1d0 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20  InMemory ){.    
2b1e0 20 20 6e 53 74 6d 74 53 70 69 6c 6c 20 3d 20 2d    nStmtSpill = -
2b1f0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  1;.    }.    rc 
2b200 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
2b210 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66  Open(pPager->pVf
2b220 73 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 73 6a  s, 0, pPager->sj
2b230 66 64 2c 20 66 6c 61 67 73 2c 20 6e 53 74 6d 74  fd, flags, nStmt
2b240 53 70 69 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 65  Spill);.  }.  re
2b250 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2b260 2a 20 41 70 70 65 6e 64 20 61 20 72 65 63 6f 72  * Append a recor
2b270 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  d of the current
2b280 20 73 74 61 74 65 20 6f 66 20 70 61 67 65 20 70   state of page p
2b290 50 67 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  Pg to the sub-jo
2b2a0 75 72 6e 61 6c 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  urnal. .**.** If
2b2b0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74   successful, set
2b2c0 20 74 68 65 20 62 69 74 20 63 6f 72 72 65 73 70   the bit corresp
2b2d0 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70  onding to pPg->p
2b2e0 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76 65  gno in the bitve
2b2f0 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70  cs.** for all op
2b300 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62 65  en savepoints be
2b310 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
2b320 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
2b330 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
2b340 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
2b350 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
2b360 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f  l, an IO.** erro
2b370 72 20 63 6f 64 65 20 69 66 20 74 68 65 20 61 74  r code if the at
2b380 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74  tempt to write t
2b390 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
2b3a0 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20  l fails, or .** 
2b3b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
2b3c0 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77  a malloc fails w
2b3d0 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20 62  hile setting a b
2b3e0 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69 6e  it in a savepoin
2b3f0 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a  t.** bitvec..*/.
2b400 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f  static int subjo
2b410 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72 20  urnalPage(PgHdr 
2b420 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pPg){.  int rc 
2b430 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
2b440 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
2b450 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
2b460 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
2b470 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
2b480 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a  RNALMODE_OFF ){.
2b490 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  .    /* Open the
2b4a0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66   sub-journal, if
2b4b0 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65   it has not alre
2b4c0 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ady been opened 
2b4d0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
2b4e0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
2b4f0 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  l );.    assert(
2b500 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2b510 6a 66 64 29 20 7c 7c 20 70 61 67 65 72 55 73 65  jfd) || pagerUse
2b520 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
2b530 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
2b540 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
2b550 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52  || pPager->nSubR
2b560 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ec==0 );.    ass
2b570 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
2b580 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20 20  (pPager) .      
2b590 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a 6f 75 72     || pageInJour
2b5a0 6e 61 6c 28 70 50 61 67 65 72 2c 20 70 50 67 29  nal(pPager, pPg)
2b5b0 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50   .         || pP
2b5c0 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
2b5d0 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20 20 20  dbOrigSize .    
2b5e0 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e  );.    rc = open
2b5f0 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  SubJournal(pPage
2b600 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  r);..    /* If t
2b610 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 77  he sub-journal w
2b620 61 73 20 6f 70 65 6e 65 64 20 73 75 63 63 65 73  as opened succes
2b630 73 66 75 6c 6c 79 20 28 6f 72 20 77 61 73 20 61  sfully (or was a
2b640 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a 20 20  lready open),.  
2b650 20 20 2a 2a 20 77 72 69 74 65 20 74 68 65 20 6a    ** write the j
2b660 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 69 6e  ournal record in
2b670 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 2a 2f  to the file.  */
2b680 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2b690 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b6a0 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50  void *pData = pP
2b6b0 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20  g->pData;.      
2b6c0 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 69 36  i64 offset = (i6
2b6d0 34 29 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  4)pPager->nSubRe
2b6e0 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  c*(4+pPager->pag
2b6f0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 63 68  eSize);.      ch
2b700 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 23 69 66  ar *pData2;..#if
2b710 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
2b720 43 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 21  C   .      if( !
2b730 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65  pPager->subjInMe
2b740 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 20 20  mory ){.        
2b750 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
2b760 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
2b770 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54   7, return SQLIT
2b780 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70 44  E_NOMEM_BKPT, pD
2b790 61 74 61 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ata2);.      }el
2b7a0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
2b7b0 70 44 61 74 61 32 20 3d 20 70 44 61 74 61 3b 0a  pData2 = pData;.
2b7c0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
2b7d0 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  (("STMT-JOURNAL 
2b7e0 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
2b7f0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
2b800 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
2b810 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
2b820 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  its(pPager->sjfd
2b830 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70  , offset, pPg->p
2b840 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
2b850 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2b860 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2b870 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
2b880 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61  ger->sjfd, pData
2b890 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
2b8a0 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a  ize, offset+4);.
2b8b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2b8c0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
2b8d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
2b8e0 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a  ger->nSubRec++;.
2b8f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2b900 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30  er->nSavepoint>0
2b910 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64 64   );.    rc = add
2b920 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
2b930 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  cs(pPager, pPg->
2b940 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
2b950 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
2b960 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50   int subjournalP
2b970 61 67 65 49 66 52 65 71 75 69 72 65 64 28 50 67  ageIfRequired(Pg
2b980 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
2b990 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
2b9a0 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 72 65  e(pPg) ){.    re
2b9b0 74 75 72 6e 20 73 75 62 6a 6f 75 72 6e 61 6c 50  turn subjournalP
2b9c0 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73  age(pPg);.  }els
2b9d0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
2b9e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
2b9f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2ba00 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
2ba10 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79 65   the pcache laye
2ba20 72 20 77 68 65 6e 20 69 74 20 68 61 73 20 72 65  r when it has re
2ba30 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f  ached some.** so
2ba40 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e  ft memory limit.
2ba50 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
2ba60 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
2ba70 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a 65   to a Pager obje
2ba80 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20 61  ct.** (cast as a
2ba90 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61 67   void*). The pag
2baa0 65 72 20 69 73 20 61 6c 77 61 79 73 20 27 70 75  er is always 'pu
2bab0 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e  rgeable' (not an
2bac0 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61   in-memory.** da
2bad0 74 61 62 61 73 65 29 2e 20 54 68 65 20 73 65 63  tabase). The sec
2bae0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
2baf0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
2bb00 20 70 61 67 65 20 74 68 61 74 20 69 73 20 0a 2a   page that is .*
2bb10 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74  * currently dirt
2bb20 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75 74  y but has no out
2bb30 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
2bb40 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a  ces. The page.**
2bb50 20 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f 63   is always assoc
2bb60 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 50  iated with the P
2bb70 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73  ager object pass
2bb80 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
2bb90 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  .** argument..**
2bba0 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  .** The job of t
2bbb0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2bbc0 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65 61  to make pPg clea
2bbd0 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69 74 73  n by writing its
2bbe0 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74   contents.** out
2bbf0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2bc00 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69 62   file, if possib
2bc10 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e 76  le. This may inv
2bc20 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68 65  olve syncing the
2bc30 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
2bc40 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  . .**.** If succ
2bc50 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33 50  essful, sqlite3P
2bc60 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29  cacheMakeClean()
2bc70 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
2bc80 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51  e page and.** SQ
2bc90 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
2bca0 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
2bcb0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
2bcc0 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68 65  ying to make the
2bcd0 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c 20  .** page clean, 
2bce0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
2bcf0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  e is returned. I
2bd00 66 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e 6f  f the page canno
2bd10 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65  t be.** made cle
2bd20 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  an for some othe
2bd30 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f  r reason, but no
2bd40 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
2bd50 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  hen SQLITE_OK.**
2bd60 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20   is returned by 
2bd70 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
2bd80 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74 20  eClean() is not 
2bd90 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
2bda0 63 20 69 6e 74 20 70 61 67 65 72 53 74 72 65 73  c int pagerStres
2bdb0 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64 72  s(void *p, PgHdr
2bdc0 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
2bdd0 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72  *pPager = (Pager
2bde0 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d   *)p;.  int rc =
2bdf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
2be00 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
2be10 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
2be20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
2be30 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
2be40 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f  ;..  /* The doNo
2be50 74 53 70 69 6c 6c 20 4e 4f 53 59 4e 43 20 62 69  tSpill NOSYNC bi
2be60 74 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 20  t is set during 
2be70 74 69 6d 65 73 20 77 68 65 6e 20 64 6f 69 6e 67  times when doing
2be80 20 61 20 73 79 6e 63 20 6f 66 0a 20 20 2a 2a 20   a sync of.  ** 
2be90 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 64 64  journal (and add
2bea0 69 6e 67 20 61 20 6e 65 77 20 68 65 61 64 65 72  ing a new header
2beb0 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  ) is not allowed
2bec0 2e 20 20 54 68 69 73 20 6f 63 63 75 72 73 0a 20  .  This occurs. 
2bed0 20 2a 2a 20 64 75 72 69 6e 67 20 63 61 6c 6c 73   ** during calls
2bee0 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
2bef0 57 72 69 74 65 28 29 20 77 68 69 6c 65 20 74 72  Write() while tr
2bf00 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  ying to journal 
2bf10 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a 20 70 61  multiple.  ** pa
2bf20 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  ges belonging to
2bf30 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72   the same sector
2bf40 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
2bf50 64 6f 4e 6f 74 53 70 69 6c 6c 20 52 4f 4c 4c 42  doNotSpill ROLLB
2bf60 41 43 4b 20 61 6e 64 20 4f 46 46 20 62 69 74 73  ACK and OFF bits
2bf70 20 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63 61   inhibits all ca
2bf80 63 68 65 20 73 70 69 6c 6c 69 6e 67 0a 20 20 2a  che spilling.  *
2bf90 2a 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * regardless of 
2bfa0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
2bfb0 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65   sync is require
2bfc0 64 2e 20 20 54 68 69 73 20 69 73 20 73 65 74 20  d.  This is set 
2bfd0 64 75 72 69 6e 67 0a 20 20 2a 2a 20 61 20 72 6f  during.  ** a ro
2bfe0 6c 6c 62 61 63 6b 20 6f 72 20 62 79 20 75 73 65  llback or by use
2bff0 72 20 72 65 71 75 65 73 74 2c 20 72 65 73 70 65  r request, respe
2c000 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2a 0a 20 20  ctively..  **.  
2c010 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73 20 61  ** Spilling is a
2c020 6c 73 6f 20 70 72 6f 68 69 62 69 74 65 64 20 77  lso prohibited w
2c030 68 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f 72 20  hen in an error 
2c040 73 74 61 74 65 20 73 69 6e 63 65 20 74 68 61 74  state since that
2c050 20 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65 61 64   could.  ** lead
2c060 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
2c070 72 75 70 74 69 6f 6e 2e 20 20 20 49 6e 20 74 68  ruption.   In th
2c080 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
2c090 65 6e 74 61 74 69 6f 6e 20 69 74 20 0a 20 20 2a  entation it .  *
2c0a0 2a 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20  * is impossible 
2c0b0 66 6f 72 20 73 71 6c 69 74 65 33 50 63 61 63 68  for sqlite3Pcach
2c0c0 65 46 65 74 63 68 28 29 20 74 6f 20 62 65 20 63  eFetch() to be c
2c0d0 61 6c 6c 65 64 20 77 69 74 68 20 63 72 65 61 74  alled with creat
2c0e0 65 46 6c 61 67 3d 3d 33 0a 20 20 2a 2a 20 77 68  eFlag==3.  ** wh
2c0f0 69 6c 65 20 69 6e 20 74 68 65 20 65 72 72 6f 72  ile in the error
2c100 20 73 74 61 74 65 2c 20 68 65 6e 63 65 20 69 74   state, hence it
2c110 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66   is impossible f
2c120 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  or this routine 
2c130 74 6f 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65  to.  ** be calle
2c140 64 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  d in the error s
2c150 74 61 74 65 2e 20 20 4e 65 76 65 72 74 68 65 6c  tate.  Neverthel
2c160 65 73 73 2c 20 77 65 20 69 6e 63 6c 75 64 65 20  ess, we include 
2c170 61 20 4e 45 56 45 52 28 29 0a 20 20 2a 2a 20 74  a NEVER().  ** t
2c180 65 73 74 20 66 6f 72 20 74 68 65 20 65 72 72 6f  est for the erro
2c190 72 20 73 74 61 74 65 20 61 73 20 61 20 73 61 66  r state as a saf
2c1a0 65 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 66  eguard against f
2c1b0 75 74 75 72 65 20 63 68 61 6e 67 65 73 2e 0a 20  uture changes.. 
2c1c0 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
2c1d0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
2c1e0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2c1f0 5f 4f 4b 3b 0a 20 20 74 65 73 74 63 61 73 65 28  _OK;.  testcase(
2c200 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
2c210 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f  ill & SPILLFLAG_
2c220 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 74 65  ROLLBACK );.  te
2c230 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e  stcase( pPager->
2c240 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49  doNotSpill & SPI
2c250 4c 4c 46 4c 41 47 5f 4f 46 46 20 29 3b 0a 20 20  LLFLAG_OFF );.  
2c260 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72  testcase( pPager
2c270 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53  ->doNotSpill & S
2c280 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20  PILLFLAG_NOSYNC 
2c290 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
2c2a0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 0a 20 20 20 26  >doNotSpill.   &
2c2b0 26 20 28 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  & ((pPager->doNo
2c2c0 74 53 70 69 6c 6c 20 26 20 28 53 50 49 4c 4c 46  tSpill & (SPILLF
2c2d0 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 7c 53 50 49  LAG_ROLLBACK|SPI
2c2e0 4c 4c 46 4c 41 47 5f 4f 46 46 29 29 21 3d 30 0a  LLFLAG_OFF))!=0.
2c2f0 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e 66        || (pPg->f
2c300 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45  lags & PGHDR_NEE
2c310 44 5f 53 59 4e 43 29 21 3d 30 29 0a 20 20 29 7b  D_SYNC)!=0).  ){
2c320 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2c330 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50  TE_OK;.  }..  pP
2c340 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  g->pDirty = 0;. 
2c350 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
2c360 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
2c370 2f 2a 20 57 72 69 74 65 20 61 20 73 69 6e 67 6c  /* Write a singl
2c380 65 20 66 72 61 6d 65 20 66 6f 72 20 74 68 69 73  e frame for this
2c390 20 70 61 67 65 20 74 6f 20 74 68 65 20 6c 6f 67   page to the log
2c3a0 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 75  . */.    rc = su
2c3b0 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66 52 65  bjournalPageIfRe
2c3c0 71 75 69 72 65 64 28 70 50 67 29 3b 20 0a 20 20  quired(pPg); .  
2c3d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c3e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
2c3f0 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73  = pagerWalFrames
2c400 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20 30 2c  (pPager, pPg, 0,
2c410 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   0);.    }.  }el
2c420 73 65 7b 0a 20 20 20 20 0a 23 69 66 64 65 66 20  se{.    .#ifdef 
2c430 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41  SQLITE_ENABLE_BA
2c440 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  TCH_ATOMIC_WRITE
2c450 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
2c460 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a  >tempFile==0 ){.
2c470 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2c480 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28  e3JournalCreate(
2c490 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
2c4a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2c4b0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 70  TE_OK ) return p
2c4c0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
2c4d0 72 2c 20 72 63 29 3b 0a 20 20 20 20 7d 0a 23 65  r, rc);.    }.#e
2c4e0 6e 64 69 66 0a 20 20 0a 20 20 20 20 2f 2a 20 53  ndif.  .    /* S
2c4f0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
2c500 66 69 6c 65 20 69 66 20 72 65 71 75 69 72 65 64  file if required
2c510 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67  . */.    if( pPg
2c520 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
2c530 45 44 5f 53 59 4e 43 20 0a 20 20 20 20 20 7c 7c  ED_SYNC .     ||
2c540 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
2c550 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
2c560 43 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a 20 20  CHEMOD.    ){.  
2c570 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
2c580 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 31 29 3b  rnal(pPager, 1);
2c590 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
2c5a0 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65   Write the conte
2c5b0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
2c5c0 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
2c5d0 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
2c5e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c5f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
2c600 72 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  rt( (pPg->flags&
2c610 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
2c620 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ==0 );.      rc 
2c630 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
2c640 67 65 6c 69 73 74 28 70 50 61 67 65 72 2c 20 70  gelist(pPager, p
2c650 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
2c660 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
2c670 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a  ge as clean. */.
2c680 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c690 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52  _OK ){.    PAGER
2c6a0 54 52 41 43 45 28 28 22 53 54 52 45 53 53 20 25  TRACE(("STRESS %
2c6b0 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
2c6c0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
2c6d0 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
2c6e0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
2c6f0 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d  eClean(pPg);.  }
2c700 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  ..  return pager
2c710 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
2c720 63 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c  c); .}../*.** Fl
2c730 75 73 68 20 61 6c 6c 20 75 6e 72 65 66 65 72 65  ush all unrefere
2c740 6e 63 65 64 20 64 69 72 74 79 20 70 61 67 65 73  nced dirty pages
2c750 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74   to disk..*/.int
2c760 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 6c 75   sqlite3PagerFlu
2c770 73 68 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  sh(Pager *pPager
2c780 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 50  ){.  int rc = pP
2c790 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
2c7a0 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
2c7b0 20 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 20     PgHdr *pList 
2c7c0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
2c7d0 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
2c7e0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 61  >pPCache);.    a
2c7f0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
2c800 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
2c810 29 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ) );.    while( 
2c820 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2c830 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
2c840 50 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70  PgHdr *pNext = p
2c850 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
2c860 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e      if( pList->n
2c870 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
2c880 20 20 72 63 20 3d 20 70 61 67 65 72 53 74 72 65    rc = pagerStre
2c890 73 73 28 28 76 6f 69 64 2a 29 70 50 61 67 65 72  ss((void*)pPager
2c8a0 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  , pList);.      
2c8b0 7d 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20  }.      pList = 
2c8c0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
2c8d0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2c8e0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
2c8f0 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
2c900 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65  a new Pager obje
2c910 63 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69  ct and put a poi
2c920 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e  nter to it.** in
2c930 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20 70   *ppPager. The p
2c940 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e  ager should even
2c950 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20  tually be freed 
2c960 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a  by passing it.**
2c970 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
2c980 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  Close()..**.** T
2c990 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67  he zFilename arg
2c9a0 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61 74  ument is the pat
2c9b0 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  h to the databas
2c9c0 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a  e file to open..
2c9d0 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
2c9e0 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72  is NULL then a r
2c9f0 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65  andomly-named te
2ca00 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
2ca10 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75  created.** and u
2ca20 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20  sed as the file 
2ca30 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54 65  to be cached. Te
2ca40 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72  mporary files ar
2ca50 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20  e be deleted.** 
2ca60 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68  automatically wh
2ca70 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73  en they are clos
2ca80 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  ed. If zFilename
2ca90 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
2caa0 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f  hen .** all info
2cab0 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20  rmation is held 
2cac0 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73 20  in cache. It is 
2cad0 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f  never written to
2cae0 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20   disk. .** This 
2caf0 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69  can be used to i
2cb00 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d  mplement an in-m
2cb10 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
2cb20 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61  **.** The nExtra
2cb30 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69   parameter speci
2cb40 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  fies the number 
2cb50 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
2cb60 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61  e allocated.** a
2cb70 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20 70  long with each p
2cb80 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54  age reference. T
2cb90 68 69 73 20 73 70 61 63 65 20 69 73 20 61 76 61  his space is ava
2cba0 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73  ilable to the us
2cbb0 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71  er.** via the sq
2cbc0 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
2cbd0 72 61 28 29 20 41 50 49 2e 20 20 57 68 65 6e 20  ra() API.  When 
2cbe0 61 20 6e 65 77 20 70 61 67 65 20 69 73 20 61 6c  a new page is al
2cbf0 6c 6f 63 61 74 65 64 2c 20 74 68 65 0a 2a 2a 20  located, the.** 
2cc00 66 69 72 73 74 20 38 20 62 79 74 65 73 20 6f 66  first 8 bytes of
2cc10 20 74 68 69 73 20 73 70 61 63 65 20 61 72 65 20   this space are 
2cc20 7a 65 72 6f 65 64 20 62 75 74 20 74 68 65 20 72  zeroed but the r
2cc30 65 6d 61 69 6e 64 65 72 20 69 73 20 75 6e 69 6e  emainder is unin
2cc40 69 74 69 61 6c 69 7a 65 64 2e 0a 2a 2a 20 28 54  itialized..** (T
2cc50 68 65 20 65 78 74 72 61 20 73 70 61 63 65 20 69  he extra space i
2cc60 73 20 75 73 65 64 20 62 79 20 62 74 72 65 65 20  s used by btree 
2cc70 61 73 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  as the MemPage o
2cc80 62 6a 65 63 74 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  bject.).**.** Th
2cc90 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74  e flags argument
2cca0 20 69 73 20 75 73 65 64 20 74 6f 20 73 70 65 63   is used to spec
2ccb0 69 66 79 20 70 72 6f 70 65 72 74 69 65 73 20 74  ify properties t
2ccc0 68 61 74 20 61 66 66 65 63 74 20 74 68 65 0a 2a  hat affect the.*
2ccd0 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74  * operation of t
2cce0 68 65 20 70 61 67 65 72 2e 20 49 74 20 73 68 6f  he pager. It sho
2ccf0 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 73 6f  uld be passed so
2cd00 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d 62 69  me bitwise combi
2cd10 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  nation.** of the
2cd20 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 2e 0a   PAGER_* flags..
2cd30 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c 61  **.** The vfsFla
2cd40 67 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  gs parameter is 
2cd50 61 20 62 69 74 6d 61 73 6b 20 74 6f 20 70 61 73  a bitmask to pas
2cd60 73 20 74 6f 20 74 68 65 20 66 6c 61 67 73 20 70  s to the flags p
2cd70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74  arameter.** of t
2cd80 68 65 20 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f  he xOpen() metho
2cd90 64 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  d of the supplie
2cda0 64 20 56 46 53 20 77 68 65 6e 20 6f 70 65 6e 69  d VFS when openi
2cdb0 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a  ng files. .**.**
2cdc0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 6f 62   If the pager ob
2cdd0 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65  ject is allocate
2cde0 64 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 66  d and the specif
2cdf0 69 65 64 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  ied file opened 
2ce00 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79  .** successfully
2ce10 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
2ce20 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50  eturned and *ppP
2ce30 61 67 65 72 20 73 65 74 20 74 6f 20 70 6f 69 6e  ager set to poin
2ce40 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20  t to.** the new 
2ce50 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66  pager object. If
2ce60 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2ce70 2c 20 2a 70 70 50 61 67 65 72 20 69 73 20 73 65  , *ppPager is se
2ce80 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64  t to NULL.** and
2ce90 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75   error code retu
2cea0 72 6e 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74  rned. This funct
2ceb0 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ion may return S
2cec0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28  QLITE_NOMEM.** (
2ced0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20  sqlite3Malloc() 
2cee0 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  is used to alloc
2cef0 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c  ate memory), SQL
2cf00 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20  ITE_CANTOPEN or 
2cf10 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53 51 4c 49  .** various SQLI
2cf20 54 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72 73  TE_IO_XXX errors
2cf30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2cf40 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c  PagerOpen(.  sql
2cf50 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2cf60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72        /* The vir
2cf70 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d  tual file system
2cf80 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67   to use */.  Pag
2cf90 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20  er **ppPager,   
2cfa0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
2cfb0 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73  turn the Pager s
2cfc0 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
2cfd0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2cfe0 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e  Filename,   /* N
2cff0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
2d000 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
2d010 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
2d020 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2d030 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70  * Extra bytes ap
2d040 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d  pend to each in-
2d050 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
2d060 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
2d070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
2d080 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74  gs controlling t
2d090 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  his file */.  in
2d0a0 74 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20  t vfsFlags,     
2d0b0 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
2d0c0 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
2d0d0 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  o sqlite3_vfs.xO
2d0e0 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20  pen() */.  void 
2d0f0 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67  (*xReinit)(DbPag
2d100 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20  e*) /* Function 
2d110 74 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 20  to reinitialize 
2d120 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38  pages */.){.  u8
2d130 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20   *pPtr;.  Pager 
2d140 2a 70 50 61 67 65 72 20 3d 20 30 3b 20 20 20 20  *pPager = 0;    
2d150 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
2d160 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ct to allocate a
2d170 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  nd return */.  i
2d180 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2d190 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  K;      /* Retur
2d1a0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
2d1b0 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20 20  tempFile = 0;   
2d1c0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
2d1d0 20 74 65 6d 70 20 66 69 6c 65 73 20 28 69 6e 63   temp files (inc
2d1e0 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  l. in-memory fil
2d1f0 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d  es) */.  int mem
2d200 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Db = 0;         
2d210 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
2d220 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  s is an in-memor
2d230 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  y file */.  int 
2d240 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20 20  readOnly = 0;   
2d250 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2d260 74 68 69 73 20 69 73 20 61 20 72 65 61 64 2d 6f  this is a read-o
2d270 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  nly file */.  in
2d280 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  t journalFileSiz
2d290 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20  e;     /* Bytes 
2d2a0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20  to allocate for 
2d2b0 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64 20  each journal fd 
2d2c0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74 68  */.  char *zPath
2d2d0 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  name = 0;     /*
2d2e0 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64 61   Full path to da
2d2f0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2d300 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d   int nPathname =
2d310 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d   0;       /* Num
2d320 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
2d330 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 69  zPathname */.  i
2d340 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  nt useJournal = 
2d350 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f  (flags & PAGER_O
2d360 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b  MIT_JOURNAL)==0;
2d370 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d 69   /* False to omi
2d380 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  t journal */.  i
2d390 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d 20  nt pcacheSize = 
2d3a0 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69 7a  sqlite3PcacheSiz
2d3b0 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42 79  e();       /* By
2d3c0 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
2d3d0 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20 20  for PCache */.  
2d3e0 75 33 32 20 73 7a 50 61 67 65 44 66 6c 74 20 3d  u32 szPageDflt =
2d3f0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2d400 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44  PAGE_SIZE;  /* D
2d410 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2d420 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2d430 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20 20 2f   *zUri = 0;    /
2d440 2a 20 55 52 49 20 61 72 67 73 20 74 6f 20 63 6f  * URI args to co
2d450 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72 69  py */.  int nUri
2d460 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2d470 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
2d480 74 65 73 20 6f 66 20 55 52 49 20 61 72 67 73 20  tes of URI args 
2d490 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20 2f  at *zUri */..  /
2d4a0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
2d4b0 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20 72   much space is r
2d4c0 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68  equired for each
2d4d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61   journal file-ha
2d4e0 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65  ndle.  ** (there
2d4f0 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d   are two of them
2d500 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  , the main journ
2d510 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a  al and the sub-j
2d520 6f 75 72 6e 61 6c 29 2e 20 20 2a 2f 0a 20 20 6a  ournal).  */.  j
2d530 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d  ournalFileSize =
2d540 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a   ROUND8(sqlite3J
2d550 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
2d560 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
2d570 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
2d580 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65   to NULL in case
2d590 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2d5a0 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20  . */.  *ppPager 
2d5b0 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  = 0;..#ifndef SQ
2d5c0 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
2d5d0 44 42 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  DB.  if( flags &
2d5e0 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20 29 7b   PAGER_MEMORY ){
2d5f0 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a  .    memDb = 1;.
2d600 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
2d610 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
2d620 5d 20 29 7b 0a 20 20 20 20 20 20 7a 50 61 74 68  ] ){.      zPath
2d630 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  name = sqlite3Db
2d640 53 74 72 44 75 70 28 30 2c 20 7a 46 69 6c 65 6e  StrDup(0, zFilen
2d650 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
2d660 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 20 29 20  zPathname==0  ) 
2d670 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2d680 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
2d690 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  nPathname = sqli
2d6a0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74  te3Strlen30(zPat
2d6b0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 46  hname);.      zF
2d6c0 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ilename = 0;.   
2d6d0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
2d6e0 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20   /* Compute and 
2d6f0 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70  store the full p
2d700 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c  athname in an al
2d710 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70  located buffer p
2d720 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62  ointed.  ** to b
2d730 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e  y zPathname, len
2d740 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f  gth nPathname. O
2d750 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20  r, if this is a 
2d760 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a  temporary file,.
2d770 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20    ** leave both 
2d780 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50  nPathname and zP
2d790 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30  athname set to 0
2d7a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
2d7b0 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
2d7c0 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63 6f  ame[0] ){.    co
2d7d0 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20  nst char *z;.   
2d7e0 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66   nPathname = pVf
2d7f0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
2d800 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d  .    zPathname =
2d810 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
2d820 52 61 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d 65  Raw(0, nPathname
2d830 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61  *2);.    if( zPa
2d840 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  thname==0 ){.   
2d850 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2d860 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
2d870 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65   }.    zPathname
2d880 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b 65  [0] = 0; /* Make
2d890 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65   sure initialize
2d8a0 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50 61  d even if FullPa
2d8b0 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20 2a  thname() fails *
2d8c0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2d8d0 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
2d8e0 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
2d8f0 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61  , nPathname, zPa
2d900 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50 61  thname);.    nPa
2d910 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
2d920 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61  Strlen30(zPathna
2d930 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55 72  me);.    z = zUr
2d940 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b 73  i = &zFilename[s
2d950 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2d960 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20 20  Filename)+1];.  
2d970 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
2d980 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74 65       z += sqlite
2d990 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b 0a  3Strlen30(z)+1;.
2d9a0 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74        z += sqlit
2d9b0 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b  e3Strlen30(z)+1;
2d9c0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 72 69 20  .    }.    nUri 
2d9d0 3d 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20 2d 20  = (int)(&z[1] - 
2d9e0 7a 55 72 69 29 3b 0a 20 20 20 20 61 73 73 65 72  zUri);.    asser
2d9f0 74 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a 20 20  t( nUri>=0 );.  
2da00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2da10 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d 65  _OK && nPathname
2da20 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  +8>pVfs->mxPathn
2da30 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ame ){.      /* 
2da40 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
2da50 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f  aken when the jo
2da60 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75 69  urnal path requi
2da70 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20  red by.      ** 
2da80 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69  the database bei
2da90 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62  ng opened will b
2daa0 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66 73  e more than pVfs
2dab0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20 20  ->mxPathname.   
2dac0 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c     ** bytes in l
2dad0 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61 6e  ength. This mean
2dae0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  s the database c
2daf0 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c  annot be opened,
2db00 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74 20  .      ** as it 
2db10 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73  will not be poss
2db20 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65  ible to open the
2db30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
2db40 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63   even.      ** c
2db50 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a  heck for a hot-j
2db60 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72 65  ournal before re
2db70 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a  ading..      */.
2db80 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2db90 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b  E_CANTOPEN_BKPT;
2dba0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2dbb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2dbc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
2dbd0 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65  ree(0, zPathname
2dbe0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2dbf0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rc;.    }.  }.. 
2dc00 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d   /* Allocate mem
2dc10 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61 67 65  ory for the Page
2dc20 72 20 73 74 72 75 63 74 75 72 65 2c 20 50 43 61  r structure, PCa
2dc30 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a  che object, the.
2dc40 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65 20    ** three file 
2dc50 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68 65  descriptors, the
2dc60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
2dc70 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75 72  ame and the jour
2dc80 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e  nal .  ** file n
2dc90 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74 20  ame. The layout 
2dca0 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73 20  in memory is as 
2dcb0 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
2dcc0 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62 6a  **     Pager obj
2dcd0 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ect             
2dce0 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 50         (sizeof(P
2dcf0 61 67 65 72 29 20 62 79 74 65 73 29 0a 20 20 2a  ager) bytes).  *
2dd00 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f 62 6a  *     PCache obj
2dd10 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ect             
2dd20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 50 63        (sqlite3Pc
2dd30 61 63 68 65 53 69 7a 65 28 29 20 62 79 74 65 73  acheSize() bytes
2dd40 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62  ).  **     Datab
2dd50 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  ase file handle 
2dd60 20 20 20 20 20 20 20 20 20 20 20 28 70 56 66 73             (pVfs
2dd70 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65 73  ->szOsFile bytes
2dd80 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a  ).  **     Sub-j
2dd90 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
2dda0 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75 72  le         (jour
2ddb0 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65  nalFileSize byte
2ddc0 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e  s).  **     Main
2ddd0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
2dde0 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f 75  ndle        (jou
2ddf0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74  rnalFileSize byt
2de00 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74  es).  **     Dat
2de10 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
2de20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50               (nP
2de30 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73 29  athname+1 bytes)
2de40 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61  .  **     Journa
2de50 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20  l file name     
2de60 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68            (nPath
2de70 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29 0a  name+8+1 bytes).
2de80 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28 75    */.  pPtr = (u
2de90 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  8 *)sqlite3Mallo
2dea0 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44  cZero(.    ROUND
2deb0 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72  8(sizeof(*pPager
2dec0 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61 67  )) +      /* Pag
2ded0 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  er structure */.
2dee0 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63 68      ROUND8(pcach
2def0 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20 20  eSize) +        
2df00 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a     /* PCache obj
2df10 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44  ect */.    ROUND
2df20 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  8(pVfs->szOsFile
2df30 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ) +       /* The
2df40 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f   main db file */
2df50 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
2df60 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20 20  Size * 2 +      
2df70 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a      /* The two j
2df80 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20  ournal files */ 
2df90 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b  .    nPathname +
2dfa0 20 31 20 2b 20 6e 55 72 69 20 2b 20 20 20 20 20   1 + nUri +     
2dfb0 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
2dfc0 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d   */.    nPathnam
2dfd0 65 20 2b 20 38 20 2b 20 32 20 20 20 20 20 20 20  e + 8 + 2       
2dfe0 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e         /* zJourn
2dff0 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  al */.#ifndef SQ
2e000 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
2e010 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20    + nPathname + 
2e020 34 20 2b 20 32 20 20 20 20 20 20 20 20 20 20 20  4 + 2           
2e030 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e 64   /* zWal */.#end
2e040 69 66 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  if.  );.  assert
2e050 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
2e060 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e  GNMENT(SQLITE_IN
2e070 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c  T_TO_PTR(journal
2e080 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20  FileSize)) );.  
2e090 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20  if( !pPtr ){.   
2e0a0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
2e0b0 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
2e0c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e0d0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
2e0e0 20 20 70 50 61 67 65 72 20 3d 20 20 20 20 20 20    pPager =      
2e0f0 20 20 20 20 20 20 20 20 28 50 61 67 65 72 2a 29          (Pager*)
2e100 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72  (pPtr);.  pPager
2e110 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20 28  ->pPCache =    (
2e120 50 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d  PCache*)(pPtr +=
2e130 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a   ROUND8(sizeof(*
2e140 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61  pPager)));.  pPa
2e150 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c  ger->fd =   (sql
2e160 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72  ite3_file*)(pPtr
2e170 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68   += ROUND8(pcach
2e180 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65  eSize));.  pPage
2e190 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74  r->sjfd = (sqlit
2e1a0 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b  e3_file*)(pPtr +
2e1b0 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73  = ROUND8(pVfs->s
2e1c0 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61  zOsFile));.  pPa
2e1d0 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c  ger->jfd =  (sql
2e1e0 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72  ite3_file*)(pPtr
2e1f0 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53   += journalFileS
2e200 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ize);.  pPager->
2e210 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28  zFilename =    (
2e220 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a  char*)(pPtr += j
2e230 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b  ournalFileSize);
2e240 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
2e250 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
2e260 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
2e270 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
2e280 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d  e Pager.zFilenam
2e290 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75  e and Pager.zJou
2e2a0 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66  rnal buffers, if
2e2b0 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
2e2c0 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b  if( zPathname ){
2e2d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 61  .    assert( nPa
2e2e0 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20 20 20  thname>0 );.    
2e2f0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2e300 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50 74   =   (char*)(pPt
2e310 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b  r += nPathname +
2e320 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20 20 20 20   1 + nUri);.    
2e330 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
2e340 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e  Filename, zPathn
2e350 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b  ame, nPathname);
2e360 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20 29 20  .    if( nUri ) 
2e370 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
2e380 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e  zFilename[nPathn
2e390 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e 55  ame+1], zUri, nU
2e3a0 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ri);.    memcpy(
2e3b0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2e3c0 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
2e3d0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
2e3e0 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  cpy(&pPager->zJo
2e3f0 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d  urnal[nPathname]
2e400 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30 30 22  , "-journal\000"
2e410 2c 20 38 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69  , 8+2);.    sqli
2e420 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70  te3FileSuffix3(p
2e430 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2e440 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
2e450 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  al);.#ifndef SQL
2e460 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
2e470 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d 20   pPager->zWal = 
2e480 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
2e490 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 5d  l[nPathname+8+1]
2e4a0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  ;.    memcpy(pPa
2e4b0 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74 68  ger->zWal, zPath
2e4c0 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
2e4d0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50  ;.    memcpy(&pP
2e4e0 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68  ager->zWal[nPath
2e4f0 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30 30 30  name], "-wal\000
2e500 22 2c 20 34 2b 31 29 3b 0a 20 20 20 20 73 71 6c  ", 4+1);.    sql
2e510 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
2e520 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2e530 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 29  e, pPager->zWal)
2e540 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
2e550 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50  ite3DbFree(0, zP
2e560 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  athname);.  }.  
2e570 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70  pPager->pVfs = p
2e580 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76  Vfs;.  pPager->v
2e590 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61  fsFlags = vfsFla
2e5a0 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74  gs;..  /* Open t
2e5b0 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20  he pager file.. 
2e5c0 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
2e5d0 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
2e5e0 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  [0] ){.    int f
2e5f0 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  out = 0;        
2e600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
2e610 46 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65  FS flags returne
2e620 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a  d by xOpen() */.
2e630 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e640 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
2e650 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
2e660 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73 46  pPager->fd, vfsF
2e670 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20  lags, &fout);.  
2e680 20 20 61 73 73 65 72 74 28 20 21 6d 65 6d 44 62    assert( !memDb
2e690 20 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79   );.    readOnly
2e6a0 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f   = (fout&SQLITE_
2e6b0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
2e6c0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
2e6d0 69 6c 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ile was successf
2e6e0 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20  ully opened for 
2e6f0 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
2e700 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65  s,.    ** choose
2e710 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65 20   a default page 
2e720 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20  size in case we 
2e730 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20 74  have to create t
2e740 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
2e750 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66  se file. The def
2e760 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
2e770 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66  s the maximum of
2e780 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
2e790 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41     + SQLITE_DEFA
2e7a0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20  ULT_PAGE_SIZE,. 
2e7b0 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76     **    + The v
2e7c0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
2e7d0 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
2e7e0 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20 20  Size().    **   
2e7f0 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20 70   + The largest p
2e800 61 67 65 20 73 69 7a 65 20 74 68 61 74 20 63 61  age size that ca
2e810 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f  n be written ato
2e820 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a  mically..    */.
2e830 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2e840 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
2e850 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33  nt iDc = sqlite3
2e860 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
2e870 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
2e880 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  fd);.      if( !
2e890 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
2e8a0 20 20 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a      setSectorSiz
2e8b0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
2e8c0 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2e8d0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2e8e0 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ZE<=SQLITE_MAX_D
2e8f0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2e900 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
2e910 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72  zPageDflt<pPager
2e920 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a  ->sectorSize ){.
2e930 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
2e940 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
2e950 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  >SQLITE_MAX_DEFA
2e960 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b  ULT_PAGE_SIZE ){
2e970 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50  .            szP
2e980 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45  ageDflt = SQLITE
2e990 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2e9a0 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20  E_SIZE;.        
2e9b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2e9c0 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20       szPageDflt 
2e9d0 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e 73  = (u32)pPager->s
2e9e0 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20  ectorSize;.     
2e9f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2ea00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
2ea10 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
2ea20 54 45 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  TE.        {.   
2ea30 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20         int ii;. 
2ea40 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2ea50 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
2ea60 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
2ea70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
2ea80 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
2ea90 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35  _ATOMIC64K==(655
2eaa0 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  36>>8));.       
2eab0 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
2eac0 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2ead0 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a  E_SIZE<=65536);.
2eae0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 69            for(ii
2eaf0 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c  =szPageDflt; ii<
2eb00 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  =SQLITE_MAX_DEFA
2eb10 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69  ULT_PAGE_SIZE; i
2eb20 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20  i=ii*2){.       
2eb30 20 20 20 20 20 69 66 28 20 69 44 63 26 28 53 51       if( iDc&(SQ
2eb40 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
2eb50 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20 20  C|(ii>>8)) ){.  
2eb60 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61              szPa
2eb70 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20  geDflt = ii;.   
2eb80 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2eb90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2eba0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a  .#endif.      }.
2ebb0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f        pPager->no
2ebc0 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f 75  Lock = sqlite3_u
2ebd0 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c 65  ri_boolean(zFile
2ebe0 6e 61 6d 65 2c 20 22 6e 6f 6c 6f 63 6b 22 2c 20  name, "nolock", 
2ebf0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69  0);.      if( (i
2ec00 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41  Dc & SQLITE_IOCA
2ec10 50 5f 49 4d 4d 55 54 41 42 4c 45 29 21 3d 30 0a  P_IMMUTABLE)!=0.
2ec20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
2ec30 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46  3_uri_boolean(zF
2ec40 69 6c 65 6e 61 6d 65 2c 20 22 69 6d 6d 75 74 61  ilename, "immuta
2ec50 62 6c 65 22 2c 20 30 29 20 29 7b 0a 20 20 20 20  ble", 0) ){.    
2ec60 20 20 20 20 20 20 76 66 73 46 6c 61 67 73 20 7c        vfsFlags |
2ec70 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
2ec80 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20  ADONLY;.        
2ec90 20 20 67 6f 74 6f 20 61 63 74 5f 6c 69 6b 65 5f    goto act_like_
2eca0 74 65 6d 70 5f 66 69 6c 65 3b 0a 20 20 20 20 20  temp_file;.     
2ecb0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
2ecc0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74 65  {.    /* If a te
2ecd0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
2ece0 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73  requested, it is
2ecf0 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65   not opened imme
2ed00 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20  diately..    ** 
2ed10 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20  In this case we 
2ed20 61 63 63 65 70 74 20 74 68 65 20 64 65 66 61 75  accept the defau
2ed30 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64  lt page size and
2ed40 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a   delay actually.
2ed50 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74      ** opening t
2ed60 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68  he file until th
2ed70 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
2ed80 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20 2a  OsWrite()..    *
2ed90 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72  *.    ** This br
2eda0 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75 6e  anch is also run
2edb0 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
2edc0 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20 69  y database. An i
2edd0 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20  n-memory.    ** 
2ede0 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65 20  database is the 
2edf0 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d 66  same as a temp-f
2ee00 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76 65  ile that is neve
2ee10 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  r written out to
2ee20 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64  .    ** disk and
2ee30 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f   uses an in-memo
2ee40 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ry rollback jour
2ee50 6e 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nal..    **.    
2ee60 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 61  ** This branch a
2ee70 6c 73 6f 20 72 75 6e 73 20 66 6f 72 20 66 69 6c  lso runs for fil
2ee80 65 73 20 6d 61 72 6b 65 64 20 61 73 20 69 6d 6d  es marked as imm
2ee90 75 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 20 0a  utable..    */ .
2eea0 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69  act_like_temp_fi
2eeb0 6c 65 3a 0a 20 20 20 20 74 65 6d 70 46 69 6c 65  le:.    tempFile
2eec0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
2eed0 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
2eee0 5f 52 45 41 44 45 52 3b 20 20 20 20 20 2f 2a 20  _READER;     /* 
2eef0 50 72 65 74 65 6e 64 20 77 65 20 61 6c 72 65 61  Pretend we alrea
2ef00 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 20 2a  dy have a lock *
2ef10 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c  /.    pPager->eL
2ef20 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49 56 45 5f  ock = EXCLUSIVE_
2ef30 4c 4f 43 4b 3b 20 20 20 20 2f 2a 20 50 72 65 74  LOCK;    /* Pret
2ef40 65 6e 64 20 77 65 20 61 72 65 20 69 6e 20 45 58  end we are in EX
2ef50 43 4c 55 53 49 56 45 20 6d 6f 64 65 20 2a 2f 0a  CLUSIVE mode */.
2ef60 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f      pPager->noLo
2ef70 63 6b 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  ck = 1;         
2ef80 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 20         /* Do no 
2ef90 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20 72  locking */.    r
2efa0 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c  eadOnly = (vfsFl
2efb0 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
2efc0 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a  READONLY);.  }..
2efd0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
2efe0 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72  ng call to Pager
2eff0 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 73 65  SetPagesize() se
2f000 72 76 65 73 20 74 6f 20 73 65 74 20 74 68 65 20  rves to set the 
2f010 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50  value of .  ** P
2f020 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e  ager.pageSize an
2f030 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  d to allocate th
2f040 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  e Pager.pTmpSpac
2f050 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20  e buffer..  */. 
2f060 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f070 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
2f080 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d  ( pPager->memDb=
2f090 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  =0 );.    rc = s
2f0a0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
2f0b0 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26  gesize(pPager, &
2f0c0 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b  szPageDflt, -1);
2f0d0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
2f0e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
2f0f0 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
2f100 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68 65 20  lize the PCache 
2f110 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 69 66 28  object. */.  if(
2f120 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2f130 7b 0a 20 20 20 20 6e 45 78 74 72 61 20 3d 20 52  {.    nExtra = R
2f140 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a 20  OUND8(nExtra);. 
2f150 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72     assert( nExtr
2f160 61 3e 3d 38 20 26 26 20 6e 45 78 74 72 61 3c 31  a>=8 && nExtra<1
2f170 30 30 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  000 );.    rc = 
2f180 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65  sqlite3PcacheOpe
2f190 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45  n(szPageDflt, nE
2f1a0 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20  xtra, !memDb,.  
2f1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f1c0 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65       !memDb?page
2f1d0 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64  rStress:0, (void
2f1e0 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67 65   *)pPager, pPage
2f1f0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 7d  r->pPCache);.  }
2f200 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
2f210 6f 72 20 6f 63 63 75 72 72 65 64 20 61 62 6f 76  or occurred abov
2f220 65 2c 20 66 72 65 65 20 74 68 65 20 20 50 61 67  e, free the  Pag
2f230 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
2f240 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e   close the file.
2f250 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d  .  */.  if( rc!=
2f260 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f270 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
2f280 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
2f290 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
2f2a0 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  (pPager->pTmpSpa
2f2b0 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ce);.    sqlite3
2f2c0 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
2f2d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2f2e0 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  }..  PAGERTRACE(
2f2f0 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c  ("OPEN %d %s\n",
2f300 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50   FILEHANDLEID(pP
2f310 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65  ager->fd), pPage
2f320 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a  r->zFilename));.
2f330 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e    IOTRACE(("OPEN
2f340 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65   %p %s\n", pPage
2f350 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  r, pPager->zFile
2f360 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65 72  name))..  pPager
2f370 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  ->useJournal = (
2f380 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20  u8)useJournal;. 
2f390 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
2f3a0 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Open = 0; */.  /
2f3b0 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  * pPager->stmtIn
2f3c0 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  Use = 0; */.  /*
2f3d0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20   pPager->nRef = 
2f3e0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
2f3f0 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b  r->stmtSize = 0;
2f400 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2f410 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20  >stmtJSize = 0; 
2f420 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2f430 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  nPage = 0; */.  
2f440 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
2f450 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
2f460 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61  _COUNT;.  /* pPa
2f470 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
2f480 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20  ER_UNLOCK; */.  
2f490 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  /* pPager->errMa
2f4a0 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  sk = 0; */.  pPa
2f4b0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
2f4c0 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20  (u8)tempFile;.  
2f4d0 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65  assert( tempFile
2f4e0 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
2f4f0 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20  ODE_NORMAL .    
2f500 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c        || tempFil
2f510 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
2f520 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29  MODE_EXCLUSIVE )
2f530 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
2f540 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
2f550 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20  CLUSIVE==1 );.  
2f560 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
2f570 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70  eMode = (u8)temp
2f580 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d  File; .  pPager-
2f590 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
2f5a0 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
2f5b0 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ile;.  pPager->m
2f5c0 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62  emDb = (u8)memDb
2f5d0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64  ;.  pPager->read
2f5e0 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f  Only = (u8)readO
2f5f0 6e 6c 79 3b 0a 20 20 61 73 73 65 72 74 28 20 75  nly;.  assert( u
2f600 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 50 61  seJournal || pPa
2f610 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
2f620 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
2f630 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  c = pPager->temp
2f640 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 50 61 67  File;.  if( pPag
2f650 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
2f660 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2f670 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d 30 20 29 3b  ->fullSync==0 );
2f680 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2f690 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 3d 3d  ger->extraSync==
2f6a0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2f6b0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
2f6c0 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  gs==0 );.    ass
2f6d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 77 61 6c  ert( pPager->wal
2f6e0 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a  SyncFlags==0 );.
2f6f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2f700 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67  er->ckptSyncFlag
2f710 73 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  s==0 );.  }else{
2f720 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  .    pPager->ful
2f730 6c 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70  lSync = 1;.    p
2f740 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63  Pager->extraSync
2f750 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
2f760 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
2f770 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
2f780 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61  ;.    pPager->wa
2f790 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  lSyncFlags = SQL
2f7a0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20  ITE_SYNC_NORMAL 
2f7b0 7c 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53  | WAL_SYNC_TRANS
2f7c0 41 43 54 49 4f 4e 53 3b 0a 20 20 20 20 70 50 61  ACTIONS;.    pPa
2f7d0 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
2f7e0 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
2f7f0 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f  _NORMAL;.  }.  /
2f800 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
2f810 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2f820 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
2f830 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ed = 0; */.  /* 
2f840 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
2f850 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
2f860 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45  nExtra = (u16)nE
2f870 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e  xtra;.  pPager->
2f880 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
2f890 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
2f8a0 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c  T_JOURNAL_SIZE_L
2f8b0 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20  IMIT;.  assert( 
2f8c0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
2f8d0 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29  d) || tempFile )
2f8e0 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  ;.  setSectorSiz
2f8f0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  e(pPager);.  if(
2f900 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a   !useJournal ){.
2f910 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2f920 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
2f930 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b  JOURNALMODE_OFF;
2f940 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d  .  }else if( mem
2f950 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  Db ){.    pPager
2f960 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
2f970 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2f980 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20  E_MEMORY;.  }.  
2f990 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  /* pPager->xBusy
2f9a0 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a  Handler = 0; */.
2f9b0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75    /* pPager->pBu
2f9c0 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30  syHandlerArg = 0
2f9d0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78  ; */.  pPager->x
2f9e0 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e  Reiniter = xRein
2f9f0 69 74 3b 0a 20 20 73 65 74 47 65 74 74 65 72 4d  it;.  setGetterM
2fa00 65 74 68 6f 64 28 70 50 61 67 65 72 29 3b 0a 20  ethod(pPager);. 
2fa10 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65   /* memset(pPage
2fa20 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
2fa30 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
2fa40 68 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  h)); */.  /* pPa
2fa50 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 53 51  ger->szMmap = SQ
2fa60 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41  LITE_DEFAULT_MMA
2fa70 50 5f 53 49 5a 45 20 2f 2f 20 77 69 6c 6c 20 62  P_SIZE // will b
2fa80 65 20 73 65 74 20 62 79 20 62 74 72 65 65 2e 63  e set by btree.c
2fa90 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72 20   */..  *ppPager 
2faa0 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  = pPager;.  retu
2fab0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2fac0 0a 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74  ../* Verify that
2fad0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2fae0 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 20 64 65  le has not be de
2faf0 6c 65 74 65 64 20 6f 72 20 72 65 6e 61 6d 65 64  leted or renamed
2fb00 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64   out from.** und
2fb10 65 72 20 74 68 65 20 70 61 67 65 72 2e 20 20 52  er the pager.  R
2fb20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
2fb30 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
2fb40 69 73 20 73 74 69 6c 6c 20 77 65 72 65 20 69 74  is still were it
2fb50 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 62 65 20   ought.** to be 
2fb60 6f 6e 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  on disk.  Return
2fb70 20 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c 49 54   non-zero (SQLIT
2fb80 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56  E_READONLY_DBMOV
2fb90 45 44 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ED or some other
2fba0 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 66   error.** code f
2fbb0 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  rom sqlite3OsAcc
2fbc0 65 73 73 28 29 29 20 69 66 20 74 68 65 20 64 61  ess()) if the da
2fbd0 74 61 62 61 73 65 20 68 61 73 20 67 6f 6e 65 20  tabase has gone 
2fbe0 6d 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  missing..*/.stat
2fbf0 69 63 20 69 6e 74 20 64 61 74 61 62 61 73 65 49  ic int databaseI
2fc00 73 55 6e 6d 6f 76 65 64 28 50 61 67 65 72 20 2a  sUnmoved(Pager *
2fc10 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 62  pPager){.  int b
2fc20 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20  HasMoved = 0;.  
2fc30 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70  int rc;..  if( p
2fc40 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2fc50 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2fc60 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
2fc70 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 29 20 72 65  ->dbSize==0 ) re
2fc80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2fc90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2fca0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 70  ->zFilename && p
2fcb0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2fcc0 5b 30 5d 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  [0] );.  rc = sq
2fcd0 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
2fce0 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ol(pPager->fd, S
2fcf0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f  QLITE_FCNTL_HAS_
2fd00 4d 4f 56 45 44 2c 20 26 62 48 61 73 4d 6f 76 65  MOVED, &bHasMove
2fd10 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  d);.  if( rc==SQ
2fd20 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b  LITE_NOTFOUND ){
2fd30 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 48  .    /* If the H
2fd40 41 53 5f 4d 4f 56 45 44 20 66 69 6c 65 2d 63 6f  AS_MOVED file-co
2fd50 6e 74 72 6f 6c 20 69 73 20 75 6e 69 6d 70 6c 65  ntrol is unimple
2fd60 6d 65 6e 74 65 64 2c 20 61 73 73 75 6d 65 20 74  mented, assume t
2fd70 68 61 74 20 74 68 65 20 66 69 6c 65 0a 20 20 20  hat the file.   
2fd80 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e   ** has not been
2fd90 20 6d 6f 76 65 64 2e 20 20 54 68 61 74 20 69 73   moved.  That is
2fda0 20 74 68 65 20 68 69 73 74 6f 72 69 63 61 6c 20   the historical 
2fdb0 62 65 68 61 76 69 6f 72 20 6f 66 20 53 51 4c 69  behavior of SQLi
2fdc0 74 65 3a 20 70 72 69 6f 72 20 74 6f 0a 20 20 20  te: prior to.   
2fdd0 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 38 2e   ** version 3.8.
2fde0 33 2c 20 69 74 20 6e 65 76 65 72 20 63 68 65 63  3, it never chec
2fdf0 6b 65 64 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ked */.    rc = 
2fe00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
2fe10 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
2fe20 45 5f 4f 4b 20 26 26 20 62 48 61 73 4d 6f 76 65  E_OK && bHasMove
2fe30 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  d ){.    rc = SQ
2fe40 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42  LITE_READONLY_DB
2fe50 4d 4f 56 45 44 3b 0a 20 20 7d 0a 20 20 72 65 74  MOVED;.  }.  ret
2fe60 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
2fe70 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2fe80 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
2fe90 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72  transitioning fr
2fea0 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  om PAGER_UNLOCK 
2feb0 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52  to.** PAGER_SHAR
2fec0 45 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73  ED state. It tes
2fed0 74 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ts if there is a
2fee0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65   hot journal pre
2fef0 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66  sent in.** the f
2ff00 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74  ile-system for t
2ff10 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20  he given pager. 
2ff20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73  A hot journal is
2ff30 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65   one that .** ne
2ff40 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
2ff50 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67   back. According
2ff60 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
2ff70 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  n, a hot-journal
2ff80 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20  .** file exists 
2ff90 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
2ffa0 20 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65   criteria are me
2ffb0 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  t:.**.**   * The
2ffc0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
2ffd0 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ists in the file
2ffe0 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20   system, and.** 
2fff0 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68    * No process h
30000 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20  olds a RESERVED 
30010 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
30020 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
30030 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  file, and.**   *
30040 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
30050 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65  le itself is gre
30060 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65  ater than 0 byte
30070 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a  s in size, and.*
30080 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20  *   * The first 
30090 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  byte of the jour
300a0 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
300b0 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e  and is not 0x00.
300c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
300d0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
300e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
300f0 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
30100 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
30110 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
30120 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
30130 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
30140 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
30150 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
30160 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ame name. In thi
30170 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e  s case the journ
30180 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75  al file is.** ju
30190 73 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  st deleted using
301a0 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69   OsDelete, *pExi
301b0 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20  sts is set to 0 
301c0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  and SQLITE_OK.**
301d0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
301e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
301f0 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20   does not check 
30200 69 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61  if there is a ma
30210 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
30220 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20  ename.** at the 
30230 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  end of the file.
30240 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e   If there is, an
30250 64 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f  d that master jo
30260 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f  urnal file.** do
30270 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
30280 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
30290 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  ile is not reall
302a0 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a  y hot. In this.*
302b0 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74  * case this rout
302c0 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
302d0 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  a false-positive
302e0 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79  . The pager_play
302f0 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  back().** routin
30300 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20  e will discover 
30310 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
30320 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
30330 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20  lly hot and .** 
30340 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74  will not roll it
30350 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   back. .**.** If
30360 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
30370 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20  ile is found to 
30380 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20  exist, *pExists 
30390 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20  is set to 1 and 
303a0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
303b0 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f  turned. If no ho
303c0 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t-journal file i
303d0 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69  s present, *pExi
303e0 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  sts is.** set to
303f0 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
30400 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
30410 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
30420 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a   while trying.**
30430 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
30440 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68  ether or not a h
30450 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
30460 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65  exists, the IO e
30470 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20  rror.** code is 
30480 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
30490 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73   value of *pExis
304a0 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ts is undefined.
304b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
304c0 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  asHotJournal(Pag
304d0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
304e0 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c  *pExists){.  sql
304f0 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
30500 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
30510 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pVfs;.  int rc =
30520 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
30530 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
30540 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78  code */.  int ex
30550 69 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20  ists = 1;       
30560 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
30570 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  if a journal fil
30580 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  e is present */.
30590 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d    int jrnlOpen =
305a0 20 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72   !!isOpen(pPager
305b0 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72  ->jfd);..  asser
305c0 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
305d0 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
305e0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
305f0 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  ->fd) );.  asser
30600 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
30610 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
30620 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 72 6e 6c  ..  assert( jrnl
30630 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c  Open==0 || ( sql
30640 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
30650 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
30660 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20 53  er->jfd) &.    S
30670 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45  QLITE_IOCAP_UNDE
30680 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45  LETABLE_WHEN_OPE
30690 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69  N.  ));..  *pExi
306a0 73 74 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 21  sts = 0;.  if( !
306b0 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  jrnlOpen ){.    
306c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
306d0 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65  cess(pVfs, pPage
306e0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  r->zJournal, SQL
306f0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
30700 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 7d  S, &exists);.  }
30710 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
30720 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29  E_OK && exists )
30730 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64  {.    int locked
30740 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
30750 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d    /* True if som
30760 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  e process holds 
30770 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
30780 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20  */..    /* Race 
30790 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20  condition here: 
307a0 20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   Another process
307b0 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e   might have been
307c0 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20   holding the.   
307d0 20 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45 44   ** the RESERVED
307e0 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61   lock and have a
307f0 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74   journal open at
30800 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63   the sqlite3OsAc
30810 63 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63  cess() .    ** c
30820 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74  all above, but t
30830 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a  hen delete the j
30840 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20  ournal and drop 
30850 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a  the lock before.
30860 20 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f      ** we get to
30870 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
30880 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
30890 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c  ervedLock() call
308a0 2e 20 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a  .  If that.    *
308b0 2a 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  * is the case, t
308c0 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
308d0 74 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73  t think there is
308e0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77   a hot journal w
308f0 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61  hen.    ** in fa
30900 63 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65  ct there is none
30910 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74 73 20  .  This results 
30920 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74  in a false-posit
30930 69 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20  ive which will. 
30940 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77     ** be dealt w
30950 69 74 68 20 62 79 20 74 68 65 20 70 6c 61 79 62  ith by the playb
30960 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69  ack routine.  Ti
30970 63 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20  cket #3883..    
30980 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
30990 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
309a0 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  edLock(pPager->f
309b0 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20  d, &locked);.   
309c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
309d0 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b  OK && !locked ){
309e0 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  .      Pgno nPag
309f0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
30a00 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
30a10 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
30a20 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20  e file */..     
30a30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
30a40 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 3b 0a  >tempFile==0 );.
30a50 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
30a60 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
30a70 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
30a80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30a90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
30aa0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
30ab0 20 69 73 20 7a 65 72 6f 20 70 61 67 65 73 20 69   is zero pages i
30ac0 6e 20 73 69 7a 65 2c 20 74 68 61 74 20 6d 65 61  n size, that mea
30ad0 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20 28  ns that either (
30ae0 31 29 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  1) the.        *
30af0 2a 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 20 72  * journal is a r
30b00 65 6d 6e 61 6e 74 20 66 72 6f 6d 20 61 20 70 72  emnant from a pr
30b10 69 6f 72 20 64 61 74 61 62 61 73 65 20 77 69 74  ior database wit
30b20 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  h the same name 
30b30 77 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a  where.        **
30b40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30b50 6c 65 20 62 75 74 20 6e 6f 74 20 74 68 65 20 6a  le but not the j
30b60 6f 75 72 6e 61 6c 20 77 61 73 20 64 65 6c 65 74  ournal was delet
30b70 65 64 2c 20 6f 72 20 28 32 29 20 74 68 65 20 69  ed, or (2) the i
30b80 6e 69 74 69 61 6c 0a 20 20 20 20 20 20 20 20 2a  nitial.        *
30b90 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  * transaction th
30ba0 61 74 20 70 6f 70 75 6c 61 74 65 73 20 61 20 6e  at populates a n
30bb0 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20 62  ew database is b
30bc0 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
30bd0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  ..        ** In 
30be0 65 69 74 68 65 72 20 63 61 73 65 2c 20 74 68 65  either case, the
30bf0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61   journal file ca
30c00 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 20 20 48  n be deleted.  H
30c10 6f 77 65 76 65 72 2c 20 74 61 6b 65 20 63 61 72  owever, take car
30c20 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74  e.        ** not
30c30 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
30c40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69  ournal file if i
30c50 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  t is already ope
30c60 6e 20 64 75 65 20 74 6f 0a 20 20 20 20 20 20 20  n due to.       
30c70 20 2a 2a 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   ** journal_mode
30c80 3d 50 45 52 53 49 53 54 2e 0a 20 20 20 20 20 20  =PERSIST..      
30c90 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
30ca0 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 21 6a 72   nPage==0 && !jr
30cb0 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  nlOpen ){.      
30cc0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
30cd0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
30ce0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 61            if( pa
30cf0 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
30d00 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
30d10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
30d20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
30d30 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
30d40 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
30d50 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  l, 0);.         
30d60 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
30d70 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 20  exclusiveMode ) 
30d80 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50  pagerUnlockDb(pP
30d90 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
30da0 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  K);.          }.
30db0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
30dc0 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
30dd0 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ();.        }els
30de0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
30df0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
30e00 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f   exists and no o
30e10 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
30e20 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a 20  has a reserved. 
30e30 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67           ** or g
30e40 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
30e50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30e60 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74  . Now check that
30e70 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20   there is.      
30e80 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20      ** at least 
30e90 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74  one non-zero byt
30ea0 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20  es at the start 
30eb0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
30ec0 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ile..          *
30ed0 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 74  * If there is, t
30ee0 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20  hen we consider 
30ef0 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  this journal to 
30f00 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20  be hot. If not, 
30f10 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74  .          ** it
30f20 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e   can be ignored.
30f30 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
30f40 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e          if( !jrn
30f50 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  lOpen ){.       
30f60 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c       int f = SQL
30f70 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
30f80 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
30f90 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20  IN_JOURNAL;.    
30fa0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
30fb0 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
30fc0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
30fd0 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
30fe0 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20  f, &f);.        
30ff0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
31000 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31010 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  ){.            u
31020 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20  8 first = 0;.   
31030 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
31040 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
31050 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a  er->jfd, (void *
31060 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a  )&first, 1, 0);.
31070 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
31080 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
31090 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
310a0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
310b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
310c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
310d0 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c         if( !jrnl
310e0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Open ){.        
310f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
31100 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
31110 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
31120 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45  .            *pE
31130 78 69 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d  xists = (first!=
31140 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  0);.          }e
31150 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
31160 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20  TE_CANTOPEN ){. 
31170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
31180 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20   we cannot open 
31190 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
311a0 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64  rnal file in ord
311b0 65 72 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20  er to see if.   
311c0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 68           ** it h
311d0 61 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72  as a zero header
311e0 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  , that might be 
311f0 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72  due to an I/O er
31200 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20  ror, or.        
31210 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20      ** it might 
31220 62 65 20 64 75 65 20 74 6f 20 74 68 65 20 72 61  be due to the ra
31230 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73  ce condition des
31240 63 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64  cribed above and
31250 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20   in.            
31260 2a 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e  ** ticket #3883.
31270 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 73    Either way, as
31280 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f  sume that the jo
31290 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20  urnal is hot..  
312a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69            ** Thi
312b0 73 20 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c  s might be a fal
312c0 73 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75  se positive.  Bu
312d0 74 20 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e  t if it is, then
312e0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
312f0 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f   ** automatic jo
31300 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61  urnal playback a
31310 6e 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68  nd recovery mech
31320 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a  anism will deal.
31330 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77              ** w
31340 69 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20  ith it under an 
31350 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77  EXCLUSIVE lock w
31360 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e  here we do not n
31370 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20  eed to.         
31380 20 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d     ** worry so m
31390 75 63 68 20 77 69 74 68 20 72 61 63 65 20 63 6f  uch with race co
313a0 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20  nditions..      
313b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
313c0 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20       *pExists = 
313d0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  1;.            r
313e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
313f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31400 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
31410 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
31420 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
31430 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
31440 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20  alled to obtain 
31450 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e  a shared lock on
31460 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31470 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c  le..** It is ill
31480 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c  egal to call sql
31490 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 75  ite3PagerGet() u
314a0 6e 74 69 6c 20 61 66 74 65 72 20 74 68 69 73 20  ntil after this 
314b0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20  function.** has 
314c0 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  been successfull
314d0 79 20 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73  y called. If a s
314e0 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c  hared-lock is al
314f0 72 65 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a  ready held when.
31500 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
31510 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
31520 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
31530 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   The following o
31540 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c  perations are al
31550 73 6f 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20  so performed by 
31560 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
31570 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65  *.**   1) If the
31580 20 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e   pager is curren
31590 74 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f 50 45  tly in PAGER_OPE
315a0 4e 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b  N state (no lock
315b0 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e   held.**      on
315c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
315d0 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74  le), then an att
315e0 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
315f0 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20  obtain a.**     
31600 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20   SHARED lock on 
31610 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
31620 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61  e. Immediately a
31630 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a  fter obtaining.*
31640 2a 20 20 20 20 20 20 74 68 65 20 53 48 41 52 45  *      the SHARE
31650 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65  D lock, the file
31660 2d 73 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b  -system is check
31670 65 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75  ed for a hot-jou
31680 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68  rnal,.**      wh
31690 69 63 68 20 69 73 20 70 6c 61 79 65 64 20 62 61  ich is played ba
316a0 63 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46  ck if present. F
316b0 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74  ollowing any hot
316c0 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20  -journal .**    
316d0 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20    rollback, the 
316e0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
316f0 63 61 63 68 65 20 61 72 65 20 76 61 6c 69 64 61  cache are valida
31700 74 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a  ted by checking.
31710 2a 2a 20 20 20 20 20 20 74 68 65 20 27 63 68 61  **      the 'cha
31720 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65  nge-counter' fie
31730 6c 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ld of the databa
31740 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 20 61  se file header a
31750 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61  nd.**      disca
31760 72 64 65 64 20 69 66 20 74 68 65 79 20 61 72 65  rded if they are
31770 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76   found to be inv
31780 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  alid..**.**   2)
31790 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
317a0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
317b0 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20  usive-mode, and 
317c0 74 68 65 72 65 20 61 72 65 20 63 75 72 72 65 6e  there are curren
317d0 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f  tly.**      no o
317e0 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
317f0 65 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67  ences to any pag
31800 65 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68  es, and is in th
31810 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a  e error state,.*
31820 2a 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61  *      then an a
31830 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
31840 6f 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f  o clear the erro
31850 72 20 73 74 61 74 65 20 62 79 20 64 69 73 63 61  r state by disca
31860 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  rding.**      th
31870 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
31880 65 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64  e page cache and
31890 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e   rolling back an
318a0 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a  y open journal.*
318b0 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a  *      file..**.
318c0 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67  ** If everything
318d0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
318e0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
318f0 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
31900 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73  error .** occurs
31910 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74   while locking t
31920 68 65 20 64 61 74 61 62 61 73 65 2c 20 63 68 65  he database, che
31930 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d  cking for a hot-
31940 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20  journal file or 
31950 0a 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  .** rolling back
31960 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c   a journal file,
31970 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
31980 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
31990 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
319a0 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61  gerSharedLock(Pa
319b0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
319c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
319d0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
319e0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
319f0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  e */..  /* This 
31a00 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
31a10 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72  called from b-tr
31a20 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e  ee and only when
31a30 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20   there are no.  
31a40 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ** outstanding p
31a50 61 67 65 73 2e 20 54 68 69 73 20 69 6d 70 6c 69  ages. This impli
31a60 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  es that the page
31a70 72 20 73 74 61 74 65 20 73 68 6f 75 6c 64 20 65  r state should e
31a80 69 74 68 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50  ither.  ** be OP
31a90 45 4e 20 6f 72 20 52 45 41 44 45 52 2e 20 52 45  EN or READER. RE
31aa0 41 44 45 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73  ADER is only pos
31ab0 73 69 62 6c 65 20 69 66 20 74 68 65 20 70 61 67  sible if the pag
31ac0 65 72 20 69 73 20 6f 72 20 77 61 73 20 69 6e 20  er is or was in 
31ad0 0a 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20  .  ** exclusive 
31ae0 61 63 63 65 73 73 20 6d 6f 64 65 2e 20 20 2a 2f  access mode.  */
31af0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
31b00 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
31b10 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
31b20 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
31b30 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
31b40 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
31b50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
31b60 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
31b70 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e  OPEN || pPager->
31b80 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
31b90 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74  ADER );.  assert
31ba0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
31bb0 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
31bc0 0a 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65  .  if( !pagerUse
31bd0 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70  Wal(pPager) && p
31be0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
31bf0 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20  AGER_OPEN ){.   
31c00 20 69 6e 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c   int bHotJournal
31c10 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 2f   = 1;          /
31c20 2a 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20  * True if there 
31c30 65 78 69 73 74 73 20 61 20 68 6f 74 20 6a 6f 75  exists a hot jou
31c40 72 6e 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20  rnal-file */..  
31c50 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
31c60 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
31c70 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
31c80 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ==0 || pPager->e
31c90 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
31ca0 4c 4f 43 4b 20 29 3b 0a 0a 20 20 20 20 72 63 20  LOCK );..    rc 
31cb0 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
31cc0 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41  lock(pPager, SHA
31cd0 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  RED_LOCK);.    i
31ce0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31cf0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
31d00 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
31d10 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67  =NO_LOCK || pPag
31d20 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f  er->eLock==UNKNO
31d30 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
31d40 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
31d50 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61    }..    /* If a
31d60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
31d70 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20  ists, and there 
31d80 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c  is no RESERVED l
31d90 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
31da0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
31db0 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20   then it either 
31dc0 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
31dd0 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74  ed back or delet
31de0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
31df0 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  f( pPager->eLock
31e00 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  <=SHARED_LOCK ){
31e10 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48  .      rc = hasH
31e20 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
31e30 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b  , &bHotJournal);
31e40 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
31e50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
31e60 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
31e70 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
31e80 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a   bHotJournal ){.
31e90 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
31ea0 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
31eb0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
31ec0 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42  E_READONLY_ROLLB
31ed0 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ACK;.        got
31ee0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
31ef0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20  }..      /* Get 
31f00 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
31f10 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
31f20 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20  e file. At this 
31f30 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20  point it is.    
31f40 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74    ** important t
31f50 68 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c  hat a RESERVED l
31f60 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69  ock is not obtai
31f70 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74  ned on the way t
31f80 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45  o the.      ** E
31f90 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
31fa0 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68  f it were, anoth
31fb0 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74  er process might
31fc0 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20   open the.      
31fd0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
31fe0 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53  , detect the RES
31ff0 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20  ERVED lock, and 
32000 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68  conclude that th
32010 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  e.      ** datab
32020 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72  ase is safe to r
32030 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70  ead while this p
32040 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
32050 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20  rolling the .   
32060 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61     ** hot-journa
32070 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a  l back..      **
32080 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75   .      ** Becau
32090 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69  se the intermedi
320a0 61 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  ate RESERVED loc
320b0 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74  k is not request
320c0 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a  ed, any.      **
320d0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 61   other process a
320e0 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63  ttempting to acc
320f0 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
32100 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74   file will get t
32110 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  o .      ** this
32120 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f   point in the co
32130 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f  de and fail to o
32140 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58  btain its own EX
32150 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20  CLUSIVE lock .  
32160 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61      ** on the da
32170 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
32180 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55     **.      ** U
32190 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20  nless the pager 
321a0 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  is in locking_mo
321b0 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  de=exclusive mod
321c0 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20  e, the lock is. 
321d0 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64       ** downgrad
321e0 65 64 20 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43  ed to SHARED_LOC
321f0 4b 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75  K before this fu
32200 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a  nction returns..
32210 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
32220 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
32230 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
32240 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  E_LOCK);.      i
32250 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
32260 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
32270 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
32280 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69  . .      /* If i
32290 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
322a0 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69   open and the fi
322b0 6c 65 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73  le exists on dis
322c0 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20 20 20  k, open the .   
322d0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f     ** journal fo
322e0 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
322f0 65 73 73 2e 20 57 72 69 74 65 20 61 63 63 65 73  ess. Write acces
32300 73 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  s is required be
32310 63 61 75 73 65 20 0a 20 20 20 20 20 20 2a 2a 20  cause .      ** 
32320 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
32330 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c  ess mode the fil
32340 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
32350 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a  l be kept open .
32360 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73        ** and pos
32370 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61  sibly used for a
32380 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74   transaction lat
32390 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69  er on. Also, wri
323a0 74 65 2d 61 63 63 65 73 73 20 0a 20 20 20 20 20  te-access .     
323b0 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79 20 72   ** is usually r
323c0 65 71 75 69 72 65 64 20 74 6f 20 66 69 6e 61 6c  equired to final
323d0 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
323e0 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  in journal_mode=
323f0 70 65 72 73 69 73 74 20 0a 20 20 20 20 20 20 2a  persist .      *
32400 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f  * mode (and also
32410 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   for journal_mod
32420 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f  e=truncate on so
32430 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a 20 20 20  me systems)..   
32440 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49     **.      ** I
32450 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f  f the journal do
32460 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74  es not exist, it
32470 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74   usually means t
32480 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20  hat some .      
32490 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
324a0 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67  ion managed to g
324b0 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69  et in and roll i
324c0 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20  t back before . 
324d0 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e       ** this con
324e0 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64  nection obtained
324f0 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
32500 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69  ock above. Or, i
32510 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  t .      ** may 
32520 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20 70 61  mean that the pa
32530 67 65 72 20 77 61 73 20 69 6e 20 74 68 65 20 65  ger was in the e
32540 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20  rror-state when 
32550 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75  this.      ** fu
32560 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
32570 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  d and the journa
32580 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  l file does not 
32590 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  exist..      */.
325a0 20 20 20 20 20 20 69 66 28 20 21 69 73 4f 70 65        if( !isOpe
325b0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
325c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
325d0 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56  3_vfs * const pV
325e0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
325f0 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62  s;.        int b
32600 45 78 69 73 74 73 3b 20 20 20 20 20 20 20 20 20  Exists;         
32610 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
32620 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
32630 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  sts */.        r
32640 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
32650 65 73 73 28 0a 20 20 20 20 20 20 20 20 20 20 20  ess(.           
32660 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a   pVfs, pPager->z
32670 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
32680 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
32690 62 45 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20  bExists);.      
326a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
326b0 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73 20 29  _OK && bExists )
326c0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
326d0 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fout = 0;.      
326e0 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49      int f = SQLI
326f0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
32700 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  E|SQLITE_OPEN_MA
32710 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20  IN_JOURNAL;.    
32720 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
32730 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
32740 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
32750 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
32760 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
32770 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
32780 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a  jfd, f, &fout);.
32790 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
327a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
327b0 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
327c0 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20  ->jfd) );.      
327d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
327e0 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51  TE_OK && fout&SQ
327f0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
32800 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LY ){.          
32810 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
32820 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
32830 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
32840 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
32850 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
32860 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
32870 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50    }. .      /* P
32880 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65  layback and dele
32890 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  te the journal. 
328a0 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61   Drop the databa
328b0 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a  se write.      *
328c0 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71  * lock and reacq
328d0 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
328e0 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63 61  ck. Purge the ca
328f0 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20  che before.     
32900 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   ** playing back
32910 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c   the hot-journal
32920 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27   so that we don'
32930 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20  t end up with.  
32940 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73      ** an incons
32950 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53  istent cache.  S
32960 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72  ync the hot jour
32970 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69  nal before playi
32980 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62  ng.      ** it b
32990 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72  ack since the pr
329a0 6f 63 65 73 73 20 74 68 61 74 20 63 72 61 73 68  ocess that crash
329b0 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20  ed and left the 
329c0 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  hot journal.    
329d0 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69    ** probably di
329e0 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e  d not sync it an
329f0 64 20 77 65 20 61 72 65 20 72 65 71 75 69 72 65  d we are require
32a00 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63  d to always sync
32a10 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  .      ** the jo
32a20 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61  urnal before pla
32a30 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20  ying it back..  
32a40 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
32a50 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
32a60 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  jfd) ){.        
32a70 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
32a80 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20  TE_OK );.       
32a90 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48   rc = pagerSyncH
32aa0 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
32ab0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
32ac0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
32ad0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
32ae0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
32af0 61 67 65 72 2c 20 21 70 50 61 67 65 72 2d 3e 74  ager, !pPager->t
32b00 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  empFile);.      
32b10 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61      pPager->eSta
32b20 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b  te = PAGER_OPEN;
32b30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32b40 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67   }else if( !pPag
32b50 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
32b60 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67  e ){.        pag
32b70 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65  erUnlockDb(pPage
32b80 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
32b90 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
32ba0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32bb0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K ){.        /* 
32bc0 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
32bd0 61 6b 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72  aken if an error
32be0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
32bf0 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20  ying to open.   
32c00 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20       ** or roll 
32c10 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  back a hot-journ
32c20 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67  al while holding
32c30 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
32c40 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20  ck. The.        
32c50 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  ** pager_unlock(
32c60 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62  ) routine will b
32c70 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
32c80 72 65 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c  returning to unl
32c90 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ock.        ** t
32ca0 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  he file. If the 
32cb0 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20 66  unlock attempt f
32cc0 61 69 6c 73 2c 20 74 68 65 6e 20 50 61 67 65 72  ails, then Pager
32cd0 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20  .eLock must be. 
32ce0 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f         ** set to
32cf0 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73   UNKNOWN_LOCK (s
32d00 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61  ee the comment a
32d10 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65  bove the #define
32d20 20 66 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a   for .        **
32d30 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62   UNKNOWN_LOCK ab
32d40 6f 76 65 20 66 6f 72 20 61 6e 20 65 78 70 6c 61  ove for an expla
32d50 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20  nation). .      
32d60 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
32d70 49 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  In order to get 
32d80 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74  pager_unlock() t
32d90 6f 20 64 6f 20 74 68 69 73 2c 20 73 65 74 20 50  o do this, set P
32da0 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 0a 20  ager.eState to. 
32db0 20 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f         ** PAGER_
32dc0 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20  ERROR now. This 
32dd0 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  is not actually 
32de0 63 6f 75 6e 74 65 64 20 61 73 20 61 20 74 72 61  counted as a tra
32df0 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  nsition.        
32e00 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74  ** to ERROR stat
32e10 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 20 64  e in the state d
32e20 69 61 67 72 61 6d 20 61 74 20 74 68 65 20 74 6f  iagram at the to
32e30 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2c 0a  p of this file,.
32e40 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 63 65          ** since
32e50 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
32e60 65 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70  e same call to p
32e70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69  ager_unlock() wi
32e80 6c 6c 20 76 65 72 79 0a 20 20 20 20 20 20 20 20  ll very.        
32e90 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72 61 6e 73  ** shortly trans
32ea0 69 74 69 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ition the pager 
32eb0 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 4f 50  object to the OP
32ec0 45 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e  EN state. Callin
32ed0 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 73  g.        ** ass
32ee0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
32ef0 29 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77  ) would fail now
32f00 2c 20 61 73 20 69 74 20 73 68 6f 75 6c 64 20 6e  , as it should n
32f10 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 20  ot be possible. 
32f20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20         ** to be 
32f30 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77  in ERROR state w
32f40 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 7a 65  hen there are ze
32f50 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ro outstanding p
32f60 61 67 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  age .        ** 
32f70 72 65 66 65 72 65 6e 63 65 73 2e 0a 20 20 20 20  references..    
32f80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
32f90 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
32fa0 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
32fb0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
32fc0 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
32fd0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
32fe0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
32ff0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
33000 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  (pPager->eLock==
33010 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20  SHARED_LOCK).   
33020 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67          || (pPag
33030 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
33040 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f  e && pPager->eLo
33050 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a  ck>SHARED_LOCK).
33060 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
33070 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
33080 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 70 50 61  >tempFile && pPa
33090 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72  ger->hasHeldShar
330a0 65 64 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  edLock ){.      
330b0 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f  /* The shared-lo
330c0 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ck has just been
330d0 20 61 63 71 75 69 72 65 64 20 74 68 65 6e 20 63   acquired then c
330e0 68 65 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a  heck to.      **
330f0 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61   see if the data
33100 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  base has been mo
33110 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20  dified.  If the 
33120 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61  database has cha
33130 6e 67 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 66  nged,.      ** f
33140 6c 75 73 68 20 74 68 65 20 63 61 63 68 65 2e 20  lush the cache. 
33150 20 54 68 65 20 68 61 73 48 65 6c 64 53 68 61 72   The hasHeldShar
33160 65 64 4c 6f 63 6b 20 66 6c 61 67 20 70 72 65 76  edLock flag prev
33170 65 6e 74 73 20 74 68 69 73 20 66 72 6f 6d 0a 20  ents this from. 
33180 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 69 6e       ** occurrin
33190 67 20 6f 6e 20 74 68 65 20 76 65 72 79 20 66 69  g on the very fi
331a0 72 73 74 20 61 63 63 65 73 73 20 74 6f 20 61 20  rst access to a 
331b0 66 69 6c 65 2c 20 69 6e 20 6f 72 64 65 72 20 74  file, in order t
331c0 6f 20 73 61 76 65 20 61 0a 20 20 20 20 20 20 2a  o save a.      *
331d0 2a 20 73 69 6e 67 6c 65 20 75 6e 6e 65 63 65 73  * single unneces
331e0 73 61 72 79 20 73 71 6c 69 74 65 33 4f 73 52 65  sary sqlite3OsRe
331f0 61 64 28 29 20 63 61 6c 6c 20 61 74 20 74 68 65  ad() call at the
33200 20 73 74 61 72 74 2d 75 70 2e 0a 20 20 20 20 20   start-up..     
33210 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74   **.      ** Dat
33220 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 61 72  abase changes ar
33230 65 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f  e detected by lo
33240 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65  oking at 15 byte
33250 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20  s beginning.    
33260 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32    ** at offset 2
33270 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  4 into the file.
33280 20 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66    The first 4 of
33290 20 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20   these 16 bytes 
332a0 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33  are.      ** a 3
332b0 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68  2-bit counter th
332c0 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  at is incremente
332d0 64 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e  d with each chan
332e0 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a  ge.  The.      *
332f0 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68  * other bytes ch
33300 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69  ange randomly wi
33310 74 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61  th each file cha
33320 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a  nge when.      *
33330 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20  * a codec is in 
33340 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20  use..      ** . 
33350 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73       ** There is
33360 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73   a vanishingly s
33370 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74  mall chance that
33380 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e   a change will n
33390 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20  ot be .      ** 
333a0 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63  detected.  The c
333b0 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65  hance of an unde
333c0 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73  tected change is
333d0 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20   so small that. 
333e0 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
333f0 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20  e neglected..   
33400 20 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f     */.      Pgno
33410 20 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20   nPage = 0;.    
33420 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72    char dbFileVer
33430 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  s[sizeof(pPager-
33440 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a  >dbFileVers)];..
33450 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
33460 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
33470 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
33480 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66   if( rc ) goto f
33490 61 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20 69 66  ailed;..      if
334a0 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ( nPage>0 ){.   
334b0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43       IOTRACE(("C
334c0 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20  KVERS %p %d\n", 
334d0 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64  pPager, sizeof(d
334e0 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20  bFileVers)));.  
334f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
33500 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
33510 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73  >fd, &dbFileVers
33520 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
33530 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20  ers), 24);.     
33540 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
33550 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
33560 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
33570 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
33580 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
33590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
335a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
335b0 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20  set(dbFileVers, 
335c0 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  0, sizeof(dbFile
335d0 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
335e0 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  .      if( memcm
335f0 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  p(pPager->dbFile
33600 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
33610 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
33620 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ers))!=0 ){.    
33630 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
33640 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20  pPager);..      
33650 20 20 2f 2a 20 55 6e 6d 61 70 20 74 68 65 20 64    /* Unmap the d
33660 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74  atabase file. It
33670 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61   is possible tha
33680 74 20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65  t external proce
33690 73 73 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  sses.        ** 
336a0 6d 61 79 20 68 61 76 65 20 74 72 75 6e 63 61 74  may have truncat
336b0 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
336c0 66 69 6c 65 20 61 6e 64 20 74 68 65 6e 20 65 78  file and then ex
336d0 74 65 6e 64 65 64 20 69 74 20 62 61 63 6b 0a 20  tended it back. 
336e0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 74 73         ** to its
336f0 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20 77   original size w
33700 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
33710 73 20 77 61 73 20 6e 6f 74 20 68 6f 6c 64 69 6e  s was not holdin
33720 67 20 61 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  g a lock..      
33730 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
33740 65 20 74 68 65 72 65 20 6d 61 79 20 65 78 69 73  e there may exis
33750 74 20 61 20 50 61 67 65 72 2e 70 4d 61 70 20 6d  t a Pager.pMap m
33760 61 70 70 69 6e 67 20 74 68 61 74 20 61 70 70 65  apping that appe
33770 61 72 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ars.        ** t
33780 6f 20 62 65 20 74 68 65 20 72 69 67 68 74 20 73  o be the right s
33790 69 7a 65 20 62 75 74 20 69 73 20 6e 6f 74 20 61  ize but is not a
337a0 63 74 75 61 6c 6c 79 20 76 61 6c 69 64 2e 20 41  ctually valid. A
337b0 76 6f 69 64 20 74 68 69 73 0a 20 20 20 20 20 20  void this.      
337c0 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 79    ** possibility
337d0 20 62 79 20 75 6e 6d 61 70 70 69 6e 67 20 74 68   by unmapping th
337e0 65 20 64 62 20 68 65 72 65 2e 20 2a 2f 0a 20 20  e db here. */.  
337f0 20 20 20 20 20 20 69 66 28 20 55 53 45 46 45 54        if( USEFET
33800 43 48 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  CH(pPager) ){.  
33810 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
33820 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
33830 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >fd, 0, 0);.    
33840 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
33850 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
33860 68 65 72 65 20 69 73 20 61 20 57 41 4c 20 66 69  here is a WAL fi
33870 6c 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  le in the file-s
33880 79 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73  ystem, open this
33890 20 64 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c   database in WAL
338a0 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74  .    ** mode. Ot
338b0 68 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c  herwise, the fol
338c0 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lowing function 
338d0 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
338e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
338f0 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
33900 72 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a  resent(pPager);.
33910 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
33920 4d 49 54 5f 57 41 4c 0a 20 20 20 20 61 73 73 65  MIT_WAL.    asse
33930 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  rt( pPager->pWal
33940 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
33950 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20  E_OK );.#endif. 
33960 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55   }..  if( pagerU
33970 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
33980 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
33990 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
339a0 20 20 72 63 20 3d 20 70 61 67 65 72 42 65 67 69    rc = pagerBegi
339b0 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e  nReadTransaction
339c0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
339d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
339e0 70 46 69 6c 65 3d 3d 30 20 26 26 20 70 50 61 67  pFile==0 && pPag
339f0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
33a00 52 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53 51  R_OPEN && rc==SQ
33a10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
33a20 63 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  c = pagerPagecou
33a30 6e 74 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  nt(pPager, &pPag
33a40 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d  er->dbSize);.  }
33a50 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28  .. failed:.  if(
33a60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
33a70 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  {.    assert( !M
33a80 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65  EMDB );.    page
33a90 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
33aa0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
33ab0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
33ac0 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65  GER_OPEN );.  }e
33ad0 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
33ae0 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
33af0 52 45 41 44 45 52 3b 0a 20 20 20 20 70 50 61 67  READER;.    pPag
33b00 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65  er->hasHeldShare
33b10 64 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 20  dLock = 1;.  }. 
33b20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
33b30 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65  *.** If the refe
33b40 72 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20  rence count has 
33b50 72 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f  reached zero, ro
33b60 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
33b70 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
33b80 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
33b90 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63  pager..**.** Exc
33ba0 65 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f  ept, in locking_
33bb0 6d 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77  mode=EXCLUSIVE w
33bc0 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74  hen there is not
33bd0 68 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68  hing to in.** th
33be0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
33bf0 61 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69  al, the unlock i
33c00 73 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20  s not performed 
33c10 61 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  and there is.** 
33c20 6e 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62  nothing to rollb
33c30 61 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75  ack, so this rou
33c40 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
33c50 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
33c60 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
33c70 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67  used(Pager *pPag
33c80 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
33c90 72 2d 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20 26  r->nMmapOut==0 &
33ca0 26 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65  & (sqlite3Pcache
33cb0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
33cc0 3e 70 50 43 61 63 68 65 29 3d 3d 30 29 20 29 7b  >pPCache)==0) ){
33cd0 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
33ce0 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
33cf0 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
33d00 2a 20 54 68 65 20 70 61 67 65 20 67 65 74 74 65  * The page gette
33d10 72 20 6d 65 74 68 6f 64 73 20 65 61 63 68 20 74  r methods each t
33d20 72 79 20 74 6f 20 61 63 71 75 69 72 65 20 61 20  ry to acquire a 
33d30 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 0a 2a  reference to a.*
33d40 2a 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65  * page with page
33d50 20 6e 75 6d 62 65 72 20 70 67 6e 6f 2e 20 49 66   number pgno. If
33d60 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72   the requested r
33d70 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a 20  eference is .** 
33d80 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74  successfully obt
33d90 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63 6f 70  ained, it is cop
33da0 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65 20 61  ied to *ppPage a
33db0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
33dc0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urned..**.** The
33dd0 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  re are different
33de0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
33df0 20 6f 66 20 74 68 65 20 67 65 74 74 65 72 20 6d   of the getter m
33e00 65 74 68 6f 64 20 64 65 70 65 6e 64 69 6e 67 0a  ethod depending.
33e10 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ** on the curren
33e20 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  t state of the p
33e30 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ager..**.**     
33e40 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 28 29 20  getPageNormal() 
33e50 20 20 20 20 20 20 20 20 2d 2d 20 20 54 68 65 20          --  The 
33e60 6e 6f 72 6d 61 6c 20 67 65 74 74 65 72 0a 2a 2a  normal getter.**
33e70 20 20 20 20 20 67 65 74 50 61 67 65 45 72 72 6f       getPageErro
33e80 72 28 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20  r()          -- 
33e90 20 55 73 65 64 20 69 66 20 74 68 65 20 70 61 67   Used if the pag
33ea0 65 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f  er is in an erro
33eb0 72 20 73 74 61 74 65 0a 2a 2a 20 20 20 20 20 67  r state.**     g
33ec0 65 74 50 61 67 65 4d 6d 61 70 28 29 20 20 20 20  etPageMmap()    
33ed0 20 20 20 20 20 20 20 2d 2d 20 20 55 73 65 64 20         --  Used 
33ee0 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64  if memory-mapped
33ef0 20 49 2f 4f 20 69 73 20 65 6e 61 62 6c 65 64 0a   I/O is enabled.
33f00 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71  **.** If the req
33f10 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 61  uested page is a
33f20 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61  lready in the ca
33f30 63 68 65 2c 20 69 74 20 69 73 20 72 65 74 75 72  che, it is retur
33f40 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  ned. .** Otherwi
33f50 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f  se, a new page o
33f60 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74  bject is allocat
33f70 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64  ed and populated
33f80 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65   with data.** re
33f90 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
33fa0 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f  base file. In so
33fb0 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 70 63  me cases, the pc
33fc0 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a  ache module may.
33fd0 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f  ** choose not to
33fe0 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
33ff0 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20  page object and 
34000 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65 78 69  may reuse an exi
34010 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20  sting.** object 
34020 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64  with no outstand
34030 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a  ing references..
34040 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20  **.** The extra 
34050 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f  data appended to
34060 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79   a page is alway
34070 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
34080 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66   zeros the .** f
34090 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
340a0 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
340b0 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70  memory. If the p
340c0 61 67 65 20 72 65 71 75 65 73 74 65 64 20 69 73  age requested is
340d0 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20   .** already in 
340e0 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 74  the cache when t
340f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
34100 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  called, then the
34110 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69   extra.** data i
34120 73 20 6c 65 66 74 20 61 73 20 69 74 20 77 61 73  s left as it was
34130 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f   when the page o
34140 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20 75  bject was last u
34150 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
34160 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
34170 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
34180 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
34190 61 67 65 20 6f 72 20 69 66 20 0a 2a 2a 20 74 68  age or if .** th
341a0 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
341b0 72 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 50  r contains the P
341c0 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
341d0 4e 54 20 62 69 74 20 61 6e 64 20 74 68 65 20 0a  NT bit and the .
341e0 2a 2a 20 72 65 71 75 65 73 74 65 64 20 70 61 67  ** requested pag
341f0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
34200 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63   stored in the c
34210 61 63 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a  ache, then no .*
34220 2a 20 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65  * actual disk re
34230 61 64 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68  ad occurs. In th
34240 69 73 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f  is case the memo
34250 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20  ry image of the 
34260 0a 2a 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74  .** page is init
34270 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a  ialized to all z
34280 65 72 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  eros. .**.** If 
34290 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
342a0 45 4e 54 20 69 73 20 74 72 75 65 2c 20 69 74 20  ENT is true, it 
342b0 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
342c0 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 0a   not care about.
342d0 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ** the contents 
342e0 6f 66 20 74 68 65 20 70 61 67 65 2e 20 54 68 69  of the page. Thi
342f0 73 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20  s occurs in two 
34300 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a  scenarios:.**.**
34310 20 20 20 61 29 20 57 68 65 6e 20 72 65 61 64 69     a) When readi
34320 6e 67 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  ng a free-list l
34330 65 61 66 20 70 61 67 65 20 66 72 6f 6d 20 74 68  eaf page from th
34340 65 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64 0a  e database, and.
34350 2a 2a 0a 2a 2a 20 20 20 62 29 20 57 68 65 6e 20  **.**   b) When 
34360 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 62  a savepoint is b
34370 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
34380 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20   and we need to 
34390 6c 6f 61 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e  load.**      a n
343a0 65 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ew page into the
343b0 20 63 61 63 68 65 20 74 6f 20 62 65 20 66 69 6c   cache to be fil
343c0 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  led with the dat
343d0 61 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66  a read.**      f
343e0 72 6f 6d 20 74 68 65 20 73 61 76 65 70 6f 69 6e  rom the savepoin
343f0 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
34400 20 49 66 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f   If PAGER_GET_NO
34410 43 4f 4e 54 45 4e 54 20 69 73 20 74 72 75 65 2c  CONTENT is true,
34420 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 20 72   then the data r
34430 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65  eturned is zeroe
34440 64 20 69 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20  d instead.** of 
34450 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20  being read from 
34460 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64  the database. Ad
34470 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20  ditionally, the 
34480 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69  bits correspondi
34490 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e  ng.** to pgno in
344a0 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
344b0 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70 61 67  l (bitvec of pag
344c0 65 73 20 61 6c 72 65 61 64 79 20 77 72 69 74 74  es already writt
344d0 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75  en to the.** jou
344e0 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74  rnal file) and t
344f0 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
34500 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62  t.pInSavepoint b
34510 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70  itvecs of any op
34520 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73  en.** savepoints
34530 20 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d   are set. This m
34540 65 61 6e 73 20 69 66 20 74 68 65 20 70 61 67 65  eans if the page
34550 20 69 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c   is made writabl
34560 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e  e at any.** poin
34570 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c  t in the future,
34580 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f   using a call to
34590 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
345a0 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e  te(), its conten
345b0 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  ts.** will not b
345c0 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69  e journaled. Thi
345d0 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a  s saves IO..**.*
345e0 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f  * The acquisitio
345f0 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72  n might fail for
34600 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73   several reasons
34610 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  .  In all cases,
34620 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61  .** an appropria
34630 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
34640 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
34650 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
34660 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  NULL..**.** See 
34670 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
34680 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68  rLookup().  Both
34690 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
346a0 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d  d Lookup() attem
346b0 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20  pt.** to find a 
346c0 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d  page in the in-m
346d0 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73  emory cache firs
346e0 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  t.  If the page 
346f0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
34700 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69  * in memory, thi
34710 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  s routine goes t
34720 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69  o disk to read i
34730 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f  t in whereas Loo
34740 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65  kup().** just re
34750 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72  turns 0.  This r
34760 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20  outine acquires 
34770 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20  a read-lock the 
34780 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a  first time it.**
34790 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69   has to go to di
347a0 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c  sk, and could al
347b0 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f  so playback an o
347c0 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ld journal if ne
347d0 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63  cessary..** Sinc
347e0 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72  e Lookup() never
347f0 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69   goes to disk, i
34800 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64  t never has to d
34810 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a  eal with locks.*
34820 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  * or journal fil
34830 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
34840 74 20 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 28  t getPageNormal(
34850 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
34860 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
34870 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ger open on the 
34880 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
34890 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
348a0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
348b0 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a  umber to fetch *
348c0 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50  /.  DbPage **ppP
348d0 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
348e0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
348f0 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  e page here */. 
34900 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
34910 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45       /* PAGER_GE
34920 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29  T_XXX flags */.)
34930 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
34940 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20  ITE_OK;.  PgHdr 
34950 2a 70 50 67 3b 0a 20 20 75 38 20 6e 6f 43 6f 6e  *pPg;.  u8 noCon
34960 74 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  tent;           
34970 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
34980 69 66 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  if PAGER_GET_NOC
34990 4f 4e 54 45 4e 54 20 69 73 20 73 65 74 20 2a 2f  ONTENT is set */
349a0 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68  .  sqlite3_pcach
349b0 65 5f 70 61 67 65 20 2a 70 42 61 73 65 3b 0a 0a  e_page *pBase;..
349c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
349d0 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
349e0 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  E_OK );.  assert
349f0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
34a00 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  >=PAGER_READER )
34a10 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
34a20 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
34a30 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
34a40 72 74 28 20 70 50 61 67 65 72 2d 3e 68 61 73 48  rt( pPager->hasH
34a50 65 6c 64 53 68 61 72 65 64 4c 6f 63 6b 3d 3d 31  eldSharedLock==1
34a60 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d   );..  if( pgno=
34a70 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
34a80 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
34a90 0a 20 20 70 42 61 73 65 20 3d 20 73 71 6c 69 74  .  pBase = sqlit
34aa0 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
34ab0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
34ac0 67 6e 6f 2c 20 33 29 3b 0a 20 20 69 66 28 20 70  gno, 3);.  if( p
34ad0 42 61 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Base==0 ){.    p
34ae0 50 67 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  Pg = 0;.    rc =
34af0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
34b00 74 63 68 53 74 72 65 73 73 28 70 50 61 67 65 72  tchStress(pPager
34b10 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
34b20 20 26 70 42 61 73 65 29 3b 0a 20 20 20 20 69 66   &pBase);.    if
34b30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34b40 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71  ) goto pager_acq
34b50 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 69 66  uire_err;.    if
34b60 28 20 70 42 61 73 65 3d 3d 30 20 29 7b 0a 20 20  ( pBase==0 ){.  
34b70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
34b80 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
34b90 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
34ba0 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  uire_err;.    }.
34bb0 20 20 7d 0a 20 20 70 50 67 20 3d 20 2a 70 70 50    }.  pPg = *ppP
34bc0 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61  age = sqlite3Pca
34bd0 63 68 65 46 65 74 63 68 46 69 6e 69 73 68 28 70  cheFetchFinish(p
34be0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
34bf0 70 67 6e 6f 2c 20 70 42 61 73 65 29 3b 0a 20 20  pgno, pBase);.  
34c00 61 73 73 65 72 74 28 20 70 50 67 3d 3d 28 2a 70  assert( pPg==(*p
34c10 70 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  pPage) );.  asse
34c20 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 70  rt( pPg->pgno==p
34c30 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
34c40 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
34c50 61 67 65 72 20 7c 7c 20 70 50 67 2d 3e 70 50 61  ager || pPg->pPa
34c60 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 6e 6f 43  ger==0 );..  noC
34c70 6f 6e 74 65 6e 74 20 3d 20 28 66 6c 61 67 73 20  ontent = (flags 
34c80 26 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  & PAGER_GET_NOCO
34c90 4e 54 45 4e 54 29 21 3d 30 3b 0a 20 20 69 66 28  NTENT)!=0;.  if(
34ca0 20 70 50 67 2d 3e 70 50 61 67 65 72 20 26 26 20   pPg->pPager && 
34cb0 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  !noContent ){.  
34cc0 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
34cd0 65 20 74 68 65 20 70 63 61 63 68 65 20 61 6c 72  e the pcache alr
34ce0 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e  eady contains an
34cf0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f 70   initialized cop
34d00 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  y of.    ** the 
34d10 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69 74  page. Return wit
34d20 68 6f 75 74 20 66 75 72 74 68 65 72 20 61 64 6f  hout further ado
34d30 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
34d40 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41  ( pgno<=PAGER_MA
34d50 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d  X_PGNO && pgno!=
34d60 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
34d70 61 67 65 72 29 20 29 3b 0a 20 20 20 20 70 50 61  ager) );.    pPa
34d80 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52  ger->aStat[PAGER
34d90 5f 53 54 41 54 5f 48 49 54 5d 2b 2b 3b 0a 20 20  _STAT_HIT]++;.  
34da0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
34db0 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  OK;..  }else{.  
34dc0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63    /* The pager c
34dd0 61 63 68 65 20 68 61 73 20 63 72 65 61 74 65 64  ache has created
34de0 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73   a new page. Its
34df0 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74   content needs t
34e00 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69  o .    ** be ini
34e10 74 69 61 6c 69 7a 65 64 2e 20 42 75 74 20 66 69  tialized. But fi
34e20 72 73 74 20 73 6f 6d 65 20 65 72 72 6f 72 20 63  rst some error c
34e30 68 65 63 6b 73 3a 0a 20 20 20 20 2a 2a 0a 20 20  hecks:.    **.  
34e40 20 20 2a 2a 20 28 31 29 20 54 68 65 20 6d 61 78    ** (1) The max
34e50 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72  imum page number
34e60 20 69 73 20 32 5e 33 31 0a 20 20 20 20 2a 2a 20   is 2^31.    ** 
34e70 28 32 29 20 4e 65 76 65 72 20 74 72 79 20 74 6f  (2) Never try to
34e80 20 66 65 74 63 68 20 74 68 65 20 6c 6f 63 6b 69   fetch the locki
34e90 6e 67 20 70 61 67 65 0a 20 20 20 20 2a 2f 0a 20  ng page.    */. 
34ea0 20 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45     if( pgno>PAGE
34eb0 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67  R_MAX_PGNO || pg
34ec0 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
34ed0 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
34ee0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
34ef0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
34f00 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
34f10 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d  quire_err;.    }
34f20 0a 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  ..    pPg->pPage
34f30 72 20 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20  r = pPager;..   
34f40 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
34f50 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
34f60 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 69 66  !MEMDB );.    if
34f70 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
34f80 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
34f90 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20  >dbSize<pgno || 
34fa0 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
34fb0 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67     if( pgno>pPag
34fc0 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
34fd0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
34fe0 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20  E_FULL;.        
34ff0 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69  goto pager_acqui
35000 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a  re_err;.      }.
35010 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f 6e 74        if( noCont
35020 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ent ){.        /
35030 2a 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65 74  * Failure to set
35040 20 74 68 65 20 62 69 74 73 20 69 6e 20 74 68 65   the bits in the
35050 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76   InJournal bit-v
35060 65 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67 6e  ectors is benign
35070 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 74 20  ..        ** It 
35080 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61  merely means tha
35090 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f  t we might do so
350a0 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f  me extra work to
350b0 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20 20 20 20   journal a .    
350c0 20 20 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74      ** page that
350d0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
350e0 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20  o be journaled. 
350f0 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 62   Nevertheless, b
35100 65 20 73 75 72 65 20 0a 20 20 20 20 20 20 20 20  e sure .        
35110 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 63  ** to test the c
35120 61 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c 6c  ase where a mall
35130 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  oc error occurs 
35140 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
35150 73 65 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  set .        ** 
35160 61 20 62 69 74 20 69 6e 20 61 20 62 69 74 20 76  a bit in a bit v
35170 65 63 74 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a  ector..        *
35180 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
35190 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
351a0 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66  oc();.        if
351b0 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ( pgno<=pPager->
351c0 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20  dbOrigSize ){.  
351d0 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59          TESTONLY
351e0 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33  ( rc = ) sqlite3
351f0 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72  BitvecSet(pPager
35200 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
35210 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  no);.          t
35220 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
35230 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
35240 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 54       }.        T
35250 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20  ESTONLY( rc = ) 
35260 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
35270 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 67  tvecs(pPager, pg
35280 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  no);.        tes
35290 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
352a0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
352b0 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
352c0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
352d0 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
352e0 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c  t(pPg->pData, 0,
352f0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
35300 65 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  e);.      IOTRAC
35310 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e  E(("ZERO %p %d\n
35320 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
35330 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
35340 20 20 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d      u32 iFrame =
35350 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
35360 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74 6f 20      /* Frame to 
35370 72 65 61 64 20 66 72 6f 6d 20 57 41 4c 20 66 69  read from WAL fi
35380 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  le */.      if( 
35390 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
353a0 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  er) ){.        r
353b0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69  c = sqlite3WalFi
353c0 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e  ndFrame(pPager->
353d0 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72  pWal, pgno, &iFr
353e0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
353f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
35400 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71  ) goto pager_acq
35410 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
35420 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
35430 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  pPg->pPager==pPa
35440 67 65 72 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ger );.      pPa
35450 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52  ger->aStat[PAGER
35460 5f 53 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a 20  _STAT_MISS]++;. 
35470 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62       rc = readDb
35480 50 61 67 65 28 70 50 67 2c 20 69 46 72 61 6d 65  Page(pPg, iFrame
35490 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
354a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
354b0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
354c0 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
354d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
354e0 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
354f0 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72  sh(pPg);.  }.  r
35500 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
35510 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  ..pager_acquire_
35520 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28 20 72  err:.  assert( r
35530 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
35540 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
35550 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
35560 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  op(pPg);.  }.  p
35570 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
35580 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 2a 70  ed(pPager);.  *p
35590 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74  pPage = 0;.  ret
355a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53  urn rc;.}..#if S
355b0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
355c0 49 5a 45 3e 30 0a 2f 2a 20 54 68 65 20 70 61 67  IZE>0./* The pag
355d0 65 20 67 65 74 74 65 72 20 66 6f 72 20 77 68 65  e getter for whe
355e0 6e 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20  n memory-mapped 
355f0 49 2f 4f 20 69 73 20 65 6e 61 62 6c 65 64 20 2a  I/O is enabled *
35600 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
35610 50 61 67 65 4d 4d 61 70 28 0a 20 20 50 61 67 65  PageMMap(.  Page
35620 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
35630 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65  /* The pager ope
35640 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
35650 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
35660 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
35670 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
35680 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50  o fetch */.  DbP
35690 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
356a0 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e   /* Write a poin
356b0 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
356c0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
356d0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ags           /*
356e0 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66   PAGER_GET_XXX f
356f0 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  lags */.){.  int
35700 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
35710 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
35720 30 3b 0a 20 20 75 33 32 20 69 46 72 61 6d 65 20  0;.  u32 iFrame 
35730 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
35740 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74 6f       /* Frame to
35750 20 72 65 61 64 20 66 72 6f 6d 20 57 41 4c 20 66   read from WAL f
35760 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20  ile */..  /* It 
35770 69 73 20 61 63 63 65 70 74 61 62 6c 65 20 74 6f  is acceptable to
35780 20 75 73 65 20 61 20 72 65 61 64 2d 6f 6e 6c 79   use a read-only
35790 20 28 6d 6d 61 70 29 20 70 61 67 65 20 66 6f 72   (mmap) page for
357a0 20 61 6e 79 20 70 61 67 65 20 65 78 63 65 70 74   any page except
357b0 0a 20 20 2a 2a 20 70 61 67 65 20 31 20 69 66 20  .  ** page 1 if 
357c0 74 68 65 72 65 20 69 73 20 6e 6f 20 77 72 69 74  there is no writ
357d0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  e-transaction op
357e0 65 6e 20 6f 72 20 74 68 65 20 41 43 51 55 49 52  en or the ACQUIR
357f0 45 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20  E_READONLY.  ** 
35800 66 6c 61 67 20 77 61 73 20 73 70 65 63 69 66 69  flag was specifi
35810 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
35820 2e 20 41 6e 64 20 73 6f 20 6c 6f 6e 67 20 61 73  . And so long as
35830 20 74 68 65 20 64 62 20 69 73 20 6e 6f 74 20 61   the db is not a
35840 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79   .  ** temporary
35850 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   or in-memory da
35860 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 63 6f  tabase.  */.  co
35870 6e 73 74 20 69 6e 74 20 62 4d 6d 61 70 4f 6b 20  nst int bMmapOk 
35880 3d 20 28 70 67 6e 6f 3e 31 0a 20 20 20 26 26 20  = (pgno>1.   && 
35890 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d  (pPager->eState=
358a0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 7c 7c  =PAGER_READER ||
358b0 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
358c0 47 45 54 5f 52 45 41 44 4f 4e 4c 59 29 29 0a 20  GET_READONLY)). 
358d0 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 55   );..  assert( U
358e0 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20  SEFETCH(pPager) 
358f0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
35900 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 61 73 73  _HAS_CODEC.  ass
35910 65 72 74 28 20 70 50 61 67 65 72 2d 3e 78 43 6f  ert( pPager->xCo
35920 64 65 63 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66  dec==0 );.#endif
35930 0a 0a 20 20 2f 2a 20 4f 70 74 69 6d 69 7a 61 74  ..  /* Optimizat
35940 69 6f 6e 20 6e 6f 74 65 3a 20 20 41 64 64 69 6e  ion note:  Addin
35950 67 20 74 68 65 20 22 70 67 6e 6f 3c 3d 31 22 20  g the "pgno<=1" 
35960 74 65 72 6d 20 62 65 66 6f 72 65 20 22 70 67 6e  term before "pgn
35970 6f 3d 3d 30 22 20 68 65 72 65 0a 20 20 2a 2a 20  o==0" here.  ** 
35980 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 6d 70 69  allows the compi
35990 6c 65 72 20 6f 70 74 69 6d 69 7a 65 72 20 74 6f  ler optimizer to
359a0 20 72 65 75 73 65 20 74 68 65 20 72 65 73 75 6c   reuse the resul
359b0 74 73 20 6f 66 20 74 68 65 20 22 70 67 6e 6f 3e  ts of the "pgno>
359c0 31 22 0a 20 20 2a 2a 20 74 65 73 74 20 69 6e 20  1".  ** test in 
359d0 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 74 61  the previous sta
359e0 74 65 6d 65 6e 74 2c 20 61 6e 64 20 61 76 6f 69  tement, and avoi
359f0 64 20 74 65 73 74 69 6e 67 20 70 67 6e 6f 3d 3d  d testing pgno==
35a00 30 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f  0 in the.  ** co
35a10 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
35a20 70 67 6e 6f 20 69 73 20 6c 61 72 67 65 2e 20 2a  pgno is large. *
35a30 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3c 3d 31 20  /.  if( pgno<=1 
35a40 26 26 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  && pgno==0 ){.  
35a50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
35a60 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
35a70 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
35a80 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
35a90 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73  R_READER );.  as
35aa0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
35ab0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
35ac0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
35ad0 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61  ager->hasHeldSha
35ae0 72 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20  redLock==1 );.  
35af0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
35b00 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
35b10 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 62 4d 6d  OK );..  if( bMm
35b20 61 70 4f 6b 20 26 26 20 70 61 67 65 72 55 73 65  apOk && pagerUse
35b30 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
35b40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
35b50 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67  alFindFrame(pPag
35b60 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20  er->pWal, pgno, 
35b70 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 69 66  &iFrame);.    if
35b80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
35b90 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65  ){.      *ppPage
35ba0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
35bb0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
35bc0 0a 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26  .  if( bMmapOk &
35bd0 26 20 69 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20  & iFrame==0 ){. 
35be0 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d     void *pData =
35bf0 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
35c00 69 74 65 33 4f 73 46 65 74 63 68 28 70 50 61 67  ite3OsFetch(pPag
35c10 65 72 2d 3e 66 64 2c 20 0a 20 20 20 20 20 20 20  er->fd, .       
35c20 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a   (i64)(pgno-1) *
35c30 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
35c40 65 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  e, pPager->pageS
35c50 69 7a 65 2c 20 26 70 44 61 74 61 0a 20 20 20 20  ize, &pData.    
35c60 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
35c70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74  QLITE_OK && pDat
35c80 61 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  a ){.      if( p
35c90 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41  Pager->eState>PA
35ca0 47 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 70 50  GER_READER || pP
35cb0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
35cc0 7b 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d 20  {.        pPg = 
35cd0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
35ce0 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
35cf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
35d00 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
35d10 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
35d20 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 70  AcquireMapPage(p
35d30 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 44 61  Pager, pgno, pDa
35d40 74 61 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20  ta, &pPg);.     
35d50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
35d60 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
35d70 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36 34  pPager->fd, (i64
35d80 29 28 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72  )(pgno-1)*pPager
35d90 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61 74  ->pageSize, pDat
35da0 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  a);.      }.    
35db0 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
35dc0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
35dd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
35de0 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
35df0 70 50 67 3b 0a 20 20 20 20 20 20 20 20 72 65 74  pPg;.        ret
35e00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
35e10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
35e20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
35e30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 50  OK ){.      *ppP
35e40 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  age = 0;.      r
35e50 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
35e60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 67 65 74    }.  return get
35e70 50 61 67 65 4e 6f 72 6d 61 6c 28 70 50 61 67 65  PageNormal(pPage
35e80 72 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  r, pgno, ppPage,
35e90 20 66 6c 61 67 73 29 3b 0a 7d 0a 23 65 6e 64 69   flags);.}.#endi
35ea0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f  f /* SQLITE_MAX_
35eb0 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a  MMAP_SIZE>0 */..
35ec0 2f 2a 20 54 68 65 20 70 61 67 65 20 67 65 74 74  /* The page gett
35ed0 65 72 20 6d 65 74 68 6f 64 20 66 6f 72 20 77 68  er method for wh
35ee0 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20  en the pager is 
35ef0 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 2a  an error state *
35f00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
35f10 50 61 67 65 45 72 72 6f 72 28 0a 20 20 50 61 67  PageError(.  Pag
35f20 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
35f30 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70   /* The pager op
35f40 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
35f50 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
35f60 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
35f70 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
35f80 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62  to fetch */.  Db
35f90 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
35fa0 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69    /* Write a poi
35fb0 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
35fc0 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
35fd0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f  lags           /
35fe0 2a 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20  * PAGER_GET_XXX 
35ff0 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 55 4e  flags */.){.  UN
36000 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
36010 67 6e 6f 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  gno);.  UNUSED_P
36020 41 52 41 4d 45 54 45 52 28 66 6c 61 67 73 29 3b  ARAMETER(flags);
36030 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
36040 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
36050 54 45 5f 4f 4b 20 29 3b 0a 20 20 2a 70 70 50 61  TE_OK );.  *ppPa
36060 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ge = 0;.  return
36070 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
36080 3b 0a 7d 0a 0a 0a 2f 2a 20 44 69 73 70 61 74 63  ;.}.../* Dispatc
36090 68 20 61 6c 6c 20 70 61 67 65 20 66 65 74 63 68  h all page fetch
360a0 20 72 65 71 75 65 73 74 73 20 74 6f 20 74 68 65   requests to the
360b0 20 61 70 70 72 6f 70 72 69 61 74 65 20 67 65 74   appropriate get
360c0 74 65 72 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 69  ter method..*/.i
360d0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  nt sqlite3PagerG
360e0 65 74 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  et(.  Pager *pPa
360f0 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ger,      /* The
36100 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74   pager open on t
36110 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
36120 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
36130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
36140 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63  e number to fetc
36150 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a  h */.  DbPage **
36160 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72  ppPage,    /* Wr
36170 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ite a pointer to
36180 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a   the page here *
36190 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
361a0 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
361b0 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20 2a  _GET_XXX flags *
361c0 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  /.){.  return pP
361d0 61 67 65 72 2d 3e 78 47 65 74 28 70 50 61 67 65  ager->xGet(pPage
361e0 72 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  r, pgno, ppPage,
361f0 20 66 6c 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   flags);.}../*.*
36200 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
36210 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
36220 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  y in the in-memo
36230 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a  ry cache.  Do.**
36240 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61   not read the pa
36250 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52  ge from disk.  R
36260 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
36270 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20  to the page,.** 
36280 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65  or 0 if the page
36290 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
362a0 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  . .**.** See als
362b0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
362c0 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72  t().  The differ
362d0 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
362e0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64  s routine.** and
362f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
36300 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28  () is that _get(
36310 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65  ) will go to the
36320 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a   disk and read.*
36330 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66  * in the page if
36340 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
36350 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68   already in cach
36360 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
36370 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  .** returns NULL
36380 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
36390 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
363a0 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72  if a disk I/O er
363b0 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72  ror .** has ever
363c0 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62   happened..*/.Db
363d0 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67  Page *sqlite3Pag
363e0 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  erLookup(Pager *
363f0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
36400 6f 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 70 63  o){.  sqlite3_pc
36410 61 63 68 65 5f 70 61 67 65 20 2a 70 50 61 67 65  ache_page *pPage
36420 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
36430 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
36440 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20  t( pgno!=0 );.  
36450 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
36460 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20  pPCache!=0 );.  
36470 70 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  pPage = sqlite3P
36480 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
36490 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
364a0 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
364b0 70 50 61 67 65 3d 3d 30 20 7c 7c 20 70 50 61 67  pPage==0 || pPag
364c0 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65  er->hasHeldShare
364d0 64 4c 6f 63 6b 20 29 3b 0a 20 20 69 66 28 20 70  dLock );.  if( p
364e0 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Page==0 ) return
364f0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   0;.  return sql
36500 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 46  ite3PcacheFetchF
36510 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70 50  inish(pPager->pP
36520 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 50 61  Cache, pgno, pPa
36530 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ge);.}../*.** Re
36540 6c 65 61 73 65 20 61 20 70 61 67 65 20 72 65 66  lease a page ref
36550 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  erence..**.** If
36560 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
36570 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
36580 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65   page drop to ze
36590 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ro, then the.** 
365a0 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f  page is added to
365b0 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20   the LRU list.  
365c0 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e  When all referen
365d0 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73  ces to all pages
365e0 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64  .** are released
365f0 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  , a rollback occ
36600 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  urs and the lock
36610 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
36620 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a   is.** removed..
36630 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
36640 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
36650 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
36660 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
36670 20 20 61 73 73 65 72 74 28 20 70 50 67 21 3d 30    assert( pPg!=0
36680 20 29 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70   );.  pPager = p
36690 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
366a0 28 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50  ( pPg->flags & P
366b0 47 48 44 52 5f 4d 4d 41 50 20 29 7b 0a 20 20 20  GHDR_MMAP ){.   
366c0 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61 70   pagerReleaseMap
366d0 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c  Page(pPg);.  }el
366e0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  se{.    sqlite3P
366f0 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67  cacheRelease(pPg
36700 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 55 6e  );.  }.  pagerUn
36710 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61  lockIfUnused(pPa
36720 67 65 72 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c  ger);.}.void sql
36730 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44  ite3PagerUnref(D
36740 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69  bPage *pPg){.  i
36750 66 28 20 70 50 67 20 29 20 73 71 6c 69 74 65 33  f( pPg ) sqlite3
36760 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
36770 6c 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  l(pPg);.}../*.**
36780 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
36790 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20  s called at the 
367a0 73 74 61 72 74 20 6f 66 20 65 76 65 72 79 20 77  start of every w
367b0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
367c0 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20  ..** There must 
367d0 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53  already be a RES
367e0 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
367f0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
36800 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65  atabase .** file
36810 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
36820 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
36830 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75  .** Open the jou
36840 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
36850 67 65 72 20 70 50 61 67 65 72 20 61 6e 64 20 77  ger pPager and w
36860 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68  rite a journal h
36870 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  eader.** to the 
36880 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49 66 20  start of it. If 
36890 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
368a0 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65   savepoints, ope
368b0 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  n the sub-journa
368c0 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68  l.** as well. Th
368d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
368e0 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 74 68  nly used when th
368f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
36900 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e  s being .** open
36910 65 64 20 74 6f 20 77 72 69 74 65 20 61 20 72 6f  ed to write a ro
36920 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61  llback log for a
36930 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74   transaction. It
36940 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a   is not used .**
36950 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   when opening a 
36960 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot journal file
36970 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
36980 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
36990 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61  ournal file is a
369a0 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61 73 20  lready open (as 
369b0 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65 78 63  it may be in exc
369c0 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a  lusive mode),.**
369d0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
369e0 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65 73 20  ion just writes 
369f0 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  a journal header
36a00 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
36a10 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20   the.** already 
36a20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  open file. .**.*
36a30 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * Whether or not
36a40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
36a50 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20 74  e is opened by t
36a60 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  his function, th
36a70 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f  e.** Pager.pInJo
36a80 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73 74 72  urnal bitvec str
36a90 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61  ucture is alloca
36aa0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ted..**.** Retur
36ab0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
36ac0 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
36ad0 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72 77 69  cessful. Otherwi
36ae0 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  se, return .** S
36af0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74  QLITE_NOMEM if t
36b00 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c  he attempt to al
36b10 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70 49 6e  locate Pager.pIn
36b20 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f  Journal fails, o
36b30 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f  r .** an IO erro
36b40 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e  r code if openin
36b50 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  g or writing the
36b60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 61   journal file fa
36b70 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
36b80 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f  nt pager_open_jo
36b90 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
36ba0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
36bb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
36bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36bd0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
36be0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  e */.  sqlite3_v
36bf0 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
36c00 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 20  = pPager->pVfs; 
36c10 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
36c20 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72 20   of vfs pointer 
36c30 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
36c40 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
36c50 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
36c60 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  D );.  assert( a
36c70 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
36c80 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
36c90 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
36ca0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
36cb0 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61    .  /* If alrea
36cc0 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  dy in the error 
36cd0 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63  state, this func
36ce0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
36cf0 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68    But on.  ** th
36d00 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 74 68  e other hand, th
36d10 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
36d20 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20 77 65  ver called if we
36d30 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a   are already in.
36d40 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 73 74    ** an error st
36d50 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ate. */.  if( NE
36d60 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43  VER(pPager->errC
36d70 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 70 50  ode) ) return pP
36d80 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a  ager->errCode;..
36d90 20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57    if( !pagerUseW
36da0 61 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50  al(pPager) && pP
36db0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
36dc0 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
36dd0 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20  MODE_OFF ){.    
36de0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
36df0 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  al = sqlite3Bitv
36e00 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d  ecCreate(pPager-
36e10 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  >dbSize);.    if
36e20 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
36e30 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rnal==0 ){.     
36e40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
36e50 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
36e60 0a 20 20 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20  .  .    /* Open 
36e70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
36e80 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   if it is not al
36e90 72 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20  ready open. */. 
36ea0 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70     if( !isOpen(p
36eb0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
36ec0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
36ed0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
36ee0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
36ef0 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
36f00 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72    sqlite3MemJour
36f10 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  nalOpen(pPager->
36f20 6a 66 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  jfd);.      }els
36f30 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  e{.        int f
36f40 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
36f50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
36f60 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b  ITE_OPEN_CREATE;
36f70 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 70  .        int nSp
36f80 69 6c 6c 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  ill;..        if
36f90 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
36fa0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  le ){.          
36fb0 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45  flags |= (SQLITE
36fc0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
36fd0 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  OSE|SQLITE_OPEN_
36fe0 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  TEMP_JOURNAL);. 
36ff0 20 20 20 20 20 20 20 20 20 6e 53 70 69 6c 6c 20           nSpill 
37000 3d 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e  = sqlite3Config.
37010 6e 53 74 6d 74 53 70 69 6c 6c 3b 0a 20 20 20 20  nStmtSpill;.    
37020 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
37030 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51       flags |= SQ
37040 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
37050 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20  OURNAL;.        
37060 20 20 6e 53 70 69 6c 6c 20 3d 20 6a 72 6e 6c 42    nSpill = jrnlB
37070 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
37080 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
37090 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
370a0 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
370b0 68 65 20 64 61 74 61 62 61 73 65 20 73 74 69 6c  he database stil
370c0 6c 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e  l has the same n
370d0 61 6d 65 20 61 73 20 69 74 20 64 69 64 20 77 68  ame as it did wh
370e0 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74  en.        ** it
370f0 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20   was originally 
37100 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 20  opened. */.     
37110 20 20 20 72 63 20 3d 20 64 61 74 61 62 61 73 65     rc = database
37120 49 73 55 6e 6d 6f 76 65 64 28 70 50 61 67 65 72  IsUnmoved(pPager
37130 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
37140 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
37150 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
37160 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65  qlite3JournalOpe
37170 6e 20 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  n (.            
37180 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e    pVfs, pPager->
37190 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
371a0 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6e 53  ->jfd, flags, nS
371b0 70 69 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 29  pill.          )
371c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
371d0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
371e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
371f0 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
37200 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 7d 0a  ->jfd) );.    }.
37210 20 20 0a 20 20 0a 20 20 20 20 2f 2a 20 57 72 69    .  .    /* Wri
37220 74 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  te the first jou
37230 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74  rnal header to t
37240 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
37250 61 6e 64 20 6f 70 65 6e 20 0a 20 20 20 20 2a 2a  and open .    **
37260 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
37270 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   if necessary.. 
37280 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
37290 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
372a0 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68       /* TODO: Ch
372b0 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  eck if all of th
372c0 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72  ese are really r
372d0 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
372e0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
372f0 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
37300 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
37310 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
37320 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
37330 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
37340 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20  rnalHdr = 0;.   
37350 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
37360 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
37370 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
37380 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
37390 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  ){.    sqlite3Bi
373a0 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
373b0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
373c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
373d0 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d  Journal = 0;.  }
373e0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
373f0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
37400 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
37410 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 70 50 61  OCKED );.    pPa
37420 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
37430 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
37440 4d 4f 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  MOD;.  }..  retu
37450 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
37460 42 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72  Begin a write-tr
37470 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
37480 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 72   specified pager
37490 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a   object. If a .*
374a0 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  * write-transact
374b0 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
374c0 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69  been opened, thi
374d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
374e0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
374f0 74 68 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d  the exFlag argum
37500 65 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68  ent is false, th
37510 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65  en acquire at le
37520 61 73 74 20 61 20 52 45 53 45 52 56 45 44 0a 2a  ast a RESERVED.*
37530 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  * lock on the da
37540 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
37550 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20  exFlag is true, 
37560 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20  then acquire at 
37570 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c  least.** an EXCL
37580 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73  USIVE lock. If s
37590 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c  uch a lock is al
375a0 72 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c  ready held, no l
375b0 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74  ocking .** funct
375c0 69 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c  ions need be cal
375d0 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  led..**.** If th
375e0 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61  e subjInMemory a
375f0 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a  rgument is non-z
37600 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73 75  ero, then any su
37610 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64  b-journal opened
37620 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20  .** within this 
37630 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
37640 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61 6e   be opened as an
37650 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e   in-memory file.
37660 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20   This.** has no 
37670 65 66 66 65 63 74 20 69 66 20 74 68 65 20 73 75  effect if the su
37680 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72  b-journal is alr
37690 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73 20  eady opened (as 
376a0 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a  it may be when.*
376b0 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  * running in exc
376c0 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72 20  lusive mode) or 
376d0 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
376e0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75  on does not requ
376f0 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75  ire a.** sub-jou
37700 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75 62  rnal. If the sub
37710 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65  jInMemory argume
37720 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e  nt is zero, then
37730 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a 2a   any required.**
37740 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
37750 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d  implemented in-m
37760 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72 20  emory if pPager 
37770 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
37780 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72  database, .** or
37790 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61   using a tempora
377a0 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69 73  ry file otherwis
377b0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
377c0 33 50 61 67 65 72 42 65 67 69 6e 28 50 61 67 65  3PagerBegin(Page
377d0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
377e0 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a 49  xFlag, int subjI
377f0 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20  nMemory){.  int 
37800 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
37810 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
37820 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 20  rrCode ) return 
37830 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
37840 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
37850 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
37860 5f 52 45 41 44 45 52 20 26 26 20 70 50 61 67 65  _READER && pPage
37870 72 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f  r->eState<PAGER_
37880 45 52 52 4f 52 20 29 3b 0a 20 20 70 50 61 67 65  ERROR );.  pPage
37890 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  r->subjInMemory 
378a0 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f  = (u8)subjInMemo
378b0 72 79 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41 59  ry;..  if( ALWAY
378c0 53 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  S(pPager->eState
378d0 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 29 20  ==PAGER_READER) 
378e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
378f0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
37900 6c 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69 66 28  l==0 );..    if(
37910 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
37920 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ger) ){.      /*
37930 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
37940 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75   configured to u
37950 73 65 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  se locking_mode=
37960 65 78 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 61  exclusive, and a
37970 6e 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75  n.      ** exclu
37980 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  sive lock on the
37990 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
379a0 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f   already held, o
379b0 62 74 61 69 6e 20 69 74 20 6e 6f 77 2e 0a 20 20  btain it now..  
379c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
379d0 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
379e0 76 65 4d 6f 64 65 20 26 26 20 73 71 6c 69 74 65  veMode && sqlite
379f0 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64  3WalExclusiveMod
37a00 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20  e(pPager->pWal, 
37a10 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  -1) ){.        r
37a20 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
37a30 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
37a40 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
37a50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
37a60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
37a70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
37a80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 28 76 6f     }.        (vo
37a90 69 64 29 73 71 6c 69 74 65 33 57 61 6c 45 78 63  id)sqlite3WalExc
37aa0 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65  lusiveMode(pPage
37ab0 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a 20 20 20  r->pWal, 1);.   
37ac0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47     }..      /* G
37ad0 72 61 62 20 74 68 65 20 77 72 69 74 65 20 6c 6f  rab the write lo
37ae0 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66 69  ck on the log fi
37af0 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  le. If successfu
37b00 6c 2c 20 75 70 67 72 61 64 65 20 74 6f 0a 20 20  l, upgrade to.  
37b10 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 52 45 53      ** PAGER_RES
37b20 45 52 56 45 44 20 73 74 61 74 65 2e 20 4f 74 68  ERVED state. Oth
37b30 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61  erwise, return a
37b40 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  n error code to 
37b50 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20  the caller..    
37b60 20 20 2a 2a 20 54 68 65 20 62 75 73 79 2d 68 61    ** The busy-ha
37b70 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e 76  ndler is not inv
37b80 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68 65 72 20  oked if another 
37b90 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65 61  connection alrea
37ba0 64 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c 64  dy.      ** hold
37bb0 73 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b  s the write-lock
37bc0 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 74  . If possible, t
37bd0 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77  he upper layer w
37be0 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a 20 20 20  ill call it..   
37bf0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
37c00 20 73 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e   sqlite3WalBegin
37c10 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e  WriteTransaction
37c20 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a  (pPager->pWal);.
37c30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
37c40 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53   /* Obtain a RES
37c50 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
37c60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
37c70 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 70   If the exFlag p
37c80 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20 20 2a  arameter.      *
37c90 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  * is true, then 
37ca0 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70 67 72  immediately upgr
37cb0 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e 20 45  ade this to an E
37cc0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
37cd0 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75 73 79  he.      ** busy
37ce0 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
37cf0 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68  k can be used wh
37d00 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f 20  en upgrading to 
37d10 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a 20 20  the EXCLUSIVE.  
37d20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74      ** lock, but
37d30 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e   not when obtain
37d40 69 6e 67 20 74 68 65 20 52 45 53 45 52 56 45 44  ing the RESERVED
37d50 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a   lock..      */.
37d60 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
37d70 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 52  LockDb(pPager, R
37d80 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20  ESERVED_LOCK);. 
37d90 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
37da0 49 54 45 5f 4f 4b 20 26 26 20 65 78 46 6c 61 67  ITE_OK && exFlag
37db0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
37dc0 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
37dd0 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
37de0 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
37df0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
37e00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
37e10 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 68  K ){.      /* Ch
37e20 61 6e 67 65 20 74 6f 20 57 52 49 54 45 52 5f 4c  ange to WRITER_L
37e30 4f 43 4b 45 44 20 73 74 61 74 65 2e 0a 20 20 20  OCKED state..   
37e40 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57     **.      ** W
37e50 41 4c 20 6d 6f 64 65 20 73 65 74 73 20 50 61 67  AL mode sets Pag
37e60 65 72 2e 65 53 74 61 74 65 20 74 6f 20 50 41 47  er.eState to PAG
37e70 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
37e80 20 6f 72 20 43 41 43 48 45 4d 4f 44 0a 20 20 20   or CACHEMOD.   
37e90 20 20 20 2a 2a 20 77 68 65 6e 20 69 74 20 68 61     ** when it ha
37ea0 73 20 61 6e 20 6f 70 65 6e 20 74 72 61 6e 73 61  s an open transa
37eb0 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65 76 65 72  ction, but never
37ec0 20 74 6f 20 44 42 4d 4f 44 20 6f 72 20 46 49 4e   to DBMOD or FIN
37ed0 49 53 48 45 44 2e 0a 20 20 20 20 20 20 2a 2a 20  ISHED..      ** 
37ee0 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
37ef0 69 6e 20 74 68 6f 73 65 20 73 74 61 74 65 73 20  in those states 
37f00 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c  the code to roll
37f10 20 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20   back savepoint 
37f20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  .      ** transa
37f30 63 74 69 6f 6e 73 20 6d 61 79 20 63 6f 70 79 20  ctions may copy 
37f40 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 73 75  data from the su
37f50 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74  b-journal into t
37f60 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
37f70 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 77 65     ** file as we
37f80 6c 6c 20 61 73 20 69 6e 74 6f 20 74 68 65 20 70  ll as into the p
37f90 61 67 65 20 63 61 63 68 65 2e 20 57 68 69 63 68  age cache. Which
37fa0 20 77 6f 75 6c 64 20 62 65 20 69 6e 63 6f 72 72   would be incorr
37fb0 65 63 74 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a  ect in .      **
37fc0 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20 20 20 20   WAL mode..     
37fd0 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72   */.      pPager
37fe0 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
37ff0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 3b 0a  _WRITER_LOCKED;.
38000 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
38010 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67 65  HintSize = pPage
38020 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
38030 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
38040 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
38050 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Size;.      pPag
38060 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d  er->dbOrigSize =
38070 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
38080 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
38090 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
380a0 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
380b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
380c0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
380d0 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20  e==PAGER_READER 
380e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
380f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
38100 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
38110 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
38120 4b 45 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72  KED );.    asser
38130 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
38140 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
38150 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41  .  }..  PAGERTRA
38160 43 45 28 28 22 54 52 41 4e 53 41 43 54 49 4f 4e  CE(("TRANSACTION
38170 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
38180 70 50 61 67 65 72 29 29 29 3b 0a 20 20 72 65 74  pPager)));.  ret
38190 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
381a0 20 57 72 69 74 65 20 70 61 67 65 20 70 50 67 20   Write page pPg 
381b0 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
381c0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
381d0 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rnal..*/.static 
381e0 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
381f0 69 6e 74 20 70 61 67 65 72 41 64 64 50 61 67 65  int pagerAddPage
38200 54 6f 52 6f 6c 6c 62 61 63 6b 4a 6f 75 72 6e 61  ToRollbackJourna
38210 6c 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  l(PgHdr *pPg){. 
38220 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
38230 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
38240 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 63 6b  int rc;.  u32 ck
38250 73 75 6d 3b 0a 20 20 63 68 61 72 20 2a 70 44 61  sum;.  char *pDa
38260 74 61 32 3b 0a 20 20 69 36 34 20 69 4f 66 66 20  ta2;.  i64 iOff 
38270 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
38280 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 65 20 73  lOff;..  /* We s
38290 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74  hould never writ
382a0 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
382b0 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74   file the page t
382c0 68 61 74 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  hat.  ** contain
382d0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  s the database l
382e0 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  ocks.  The follo
382f0 77 69 6e 67 20 61 73 73 65 72 74 20 76 65 72 69  wing assert veri
38300 66 69 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 77  fies.  ** that w
38310 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 61  e do not. */.  a
38320 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f  ssert( pPg->pgno
38330 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
38340 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 61 73  pPager) );..  as
38350 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
38360 75 72 6e 61 6c 48 64 72 3c 3d 70 50 61 67 65 72  urnalHdr<=pPager
38370 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
38380 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
38390 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50 67   pPg->pData, pPg
383a0 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72  ->pgno, 7, retur
383b0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
383c0 4b 50 54 2c 20 70 44 61 74 61 32 29 3b 0a 20 20  KPT, pData2);.  
383d0 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b  cksum = pager_ck
383e0 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a  sum(pPager, (u8*
383f0 29 70 44 61 74 61 32 29 3b 0a 0a 20 20 2f 2a 20  )pData2);..  /* 
38400 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72  Even if an IO or
38410 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20   diskfull error 
38420 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6a 6f 75  occurs while jou
38430 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 2a  rnalling the.  *
38440 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c  * page in the bl
38450 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74  ock above, set t
38460 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61  he need-sync fla
38470 67 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  g for the page..
38480 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
38490 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  when the transac
384a0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
384b0 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69  ack, the logic i
384c0 6e 0a 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f  n.  ** playback_
384d0 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20  one_page() will 
384e0 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70  think that the p
384f0 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  age needs to be 
38500 72 65 73 74 6f 72 65 64 0a 20 20 2a 2a 20 69 6e  restored.  ** in
38510 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
38520 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49 4f  le. And if an IO
38530 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
38540 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20  ile doing so,.  
38550 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69  ** then corrupti
38560 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20  on may follow.. 
38570 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73   */.  pPg->flags
38580 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53   |= PGHDR_NEED_S
38590 59 4e 43 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69  YNC;..  rc = wri
385a0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
385b0 3e 6a 66 64 2c 20 69 4f 66 66 2c 20 70 50 67 2d  >jfd, iOff, pPg-
385c0 3e 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63  >pgno);.  if( rc
385d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
385e0 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
385f0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
38600 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74  Pager->jfd, pDat
38610 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
38620 53 69 7a 65 2c 20 69 4f 66 66 2b 34 29 3b 0a 20  Size, iOff+4);. 
38630 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
38640 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
38650 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
38660 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
38670 69 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70 61 67  iOff+pPager->pag
38680 65 53 69 7a 65 2b 34 2c 20 63 6b 73 75 6d 29 3b  eSize+4, cksum);
38690 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
386a0 45 5f 4f 4b 20 29 20 72 65 74 75 7