/ Hex Artifact Content
Login

Artifact 5111055cd7c85e3b6f8de02fc1ae382397f89a62:


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 23 69 66 64 65 66 20 53 51  ges */.#ifdef SQ
8460: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
8470: 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29   void *(*xCodec)
8480: 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
8490: 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69  o,int); /* Routi
84a0: 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69  ne for en/decodi
84b0: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ng data */.  voi
84c0: 64 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68  d (*xCodecSizeCh
84d0: 6e 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e  ng)(void*,int,in
84e0: 74 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66  t); /* Notify of
84f0: 20 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e 67   page size chang
8500: 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  es */.  void (*x
8510: 43 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a  CodecFree)(void*
8520: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
8530: 2a 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72  * Destructor for
8540: 20 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20   the codec */.  
8550: 76 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20 20  void *pCodec;   
8560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
8570: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
8580: 20 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f   xCodec... metho
8590: 64 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63  ds */.#endif.  c
85a0: 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20  har *pTmpSpace; 
85b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
85c0: 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74  ger.pageSize byt
85d0: 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
85e0: 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50 43 61  tmp use */.  PCa
85f0: 63 68 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20  che *pPCache;   
8600: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
8610: 74 65 72 20 74 6f 20 70 61 67 65 20 63 61 63 68  ter to page cach
8620: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66 6e  e object */.#ifn
8630: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8640: 57 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b  WAL.  Wal *pWal;
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8660: 20 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64    /* Write-ahead
8670: 20 6c 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f   log used by "jo
8680: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20  urnal_mode=wal" 
8690: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b  */.  char *zWal;
86a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86b0: 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f   /* File name fo
86c0: 72 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f  r write-ahead lo
86d0: 67 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  g */.#endif.};..
86e0: 2f 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20 66 6f  /*.** Indexes fo
86f0: 72 20 75 73 65 20 77 69 74 68 20 50 61 67 65 72  r use with Pager
8700: 2e 61 53 74 61 74 5b 5d 2e 20 54 68 65 20 50 61  .aStat[]. The Pa
8710: 67 65 72 2e 61 53 74 61 74 5b 5d 20 61 72 72 61  ger.aStat[] arra
8720: 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68  y contains.** th
8730: 65 20 76 61 6c 75 65 73 20 61 63 63 65 73 73 65  e values accesse
8740: 64 20 62 79 20 70 61 73 73 69 6e 67 20 53 51 4c  d by passing SQL
8750: 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43  ITE_DBSTATUS_CAC
8760: 48 45 5f 48 49 54 2c 20 43 41 43 48 45 5f 4d 49  HE_HIT, CACHE_MI
8770: 53 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48 45 5f  SS .** or CACHE_
8780: 57 52 49 54 45 20 74 6f 20 73 71 6c 69 74 65 33  WRITE to sqlite3
8790: 5f 64 62 5f 73 74 61 74 75 73 28 29 2e 0a 2a 2f  _db_status()..*/
87a0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
87b0: 54 41 54 5f 48 49 54 20 20 20 30 0a 23 64 65 66  TAT_HIT   0.#def
87c0: 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 4d  ine PAGER_STAT_M
87d0: 49 53 53 20 20 31 0a 23 64 65 66 69 6e 65 20 50  ISS  1.#define P
87e0: 41 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 20  AGER_STAT_WRITE 
87f0: 32 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  2../*.** The fol
8800: 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
8810: 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75  riables hold cou
8820: 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a  nters used for.*
8830: 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  * testing purpos
8840: 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20  es only.  These 
8850: 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74  variables do not
8860: 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e   exist in.** a n
8870: 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64  on-testing build
8880: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
8890: 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61  es are not threa
88a0: 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65  d-safe..*/.#ifde
88b0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
88c0: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
88d0: 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30  readdb_count = 0
88e0: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
88f0: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61  f full pages rea
8900: 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74  d from DB */.int
8910: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
8920: 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30  ritedb_count = 0
8930: 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
8940: 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74   full pages writ
8950: 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74  ten to DB */.int
8960: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
8970: 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b  ritej_count = 0;
8980: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8990: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
89a0: 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64  o journal */.# d
89b0: 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52  efine PAGER_INCR
89c0: 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23  (v)  v++.#else.#
89d0: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
89e0: 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a  CR(v).#endif....
89f0: 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69  /*.** Journal fi
8a00: 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74  les begin with t
8a10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67  he following mag
8a20: 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20  ic string.  The 
8a30: 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61  data.** was obta
8a40: 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72  ined from /dev/r
8a50: 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73  andom.  It is us
8a60: 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e  ed only as a san
8a70: 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a  ity check..**.**
8a80: 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32   Since version 2
8a90: 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61  .8.0, the journa
8aa0: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e  l format contain
8ab0: 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e  s additional san
8ac0: 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20  ity.** checking 
8ad0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66  information.  If
8ae0: 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73   the power fails
8af0: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
8b00: 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77  al is being.** w
8b10: 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e  ritten, semi-ran
8b20: 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61  dom garbage data
8b30: 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e   might appear in
8b40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
8b50: 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72  file after power
8b60: 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49   is restored.  I
8b70: 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  f an attempt is 
8b80: 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  then made.** to 
8b90: 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  roll the journal
8ba0: 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62   back, the datab
8bb0: 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72  ase could be cor
8bc0: 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64  rupted.  The add
8bd0: 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74  itional.** sanit
8be0: 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20  y checking data 
8bf0: 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
8c00: 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61   discover the ga
8c10: 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20  rbage in the.** 
8c20: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f  journal and igno
8c30: 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  re it..**.** The
8c40: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
8c50: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
8c60: 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c   the new journal
8c70: 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73   format consists
8c80: 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20  .** of a 32-bit 
8c90: 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68  checksum on each
8ca0: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20   page of data.  
8cb0: 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76  The checksum cov
8cc0: 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20  ers both.** the 
8cd0: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
8ce0: 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65  the pPager->page
8cf0: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
8d00: 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ta for the page.
8d10: 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69  .** This cksum i
8d20: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
8d30: 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d   a 32-bit random
8d40: 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65   value that appe
8d50: 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  ars in the.** jo
8d60: 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74  urnal file right
8d70: 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65   after the heade
8d80: 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69  r.  The random i
8d90: 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d  nitializer is im
8da0: 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61  portant,.** beca
8db0: 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61  use garbage data
8dc0: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74   that appears at
8dd0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f   the end of a jo
8de0: 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a  urnal is likely.
8df0: 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73  ** data that was
8e00: 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66   once in other f
8e10: 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e  iles that have n
8e20: 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e  ow been deleted.
8e30: 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62    If the.** garb
8e40: 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72  age data came fr
8e50: 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a  om an obsolete j
8e60: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
8e70: 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74   checksums might
8e80: 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20  .** be correct. 
8e90: 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69   But by initiali
8ea0: 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  zing the checksu
8eb0: 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75  m to random valu
8ec0: 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69  e which.** is di
8ed0: 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72  fferent for ever
8ee0: 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69  y journal, we mi
8ef0: 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b  nimize that risk
8f00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
8f10: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
8f20: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20  aJournalMagic[] 
8f30: 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35  = {.  0xd9, 0xd5
8f40: 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78  , 0x05, 0xf9, 0x
8f50: 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20  20, 0xa1, 0x63, 
8f60: 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  0xd7,.};../*.** 
8f70: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
8f80: 6f 66 20 65 61 63 68 20 70 61 67 65 20 72 65 63  of each page rec
8f90: 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ord in the journ
8fa0: 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a  al is given by.*
8fb0: 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
8fc0: 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e  macro..*/.#defin
8fd0: 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  e JOURNAL_PG_SZ(
8fe0: 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65  pPager)  ((pPage
8ff0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38  r->pageSize) + 8
9000: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  )../*.** The jou
9010: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  rnal header size
9020: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
9030: 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79   This is usually
9040: 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69   the same .** si
9050: 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65 20 64  ze as a single d
9060: 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65 65 20  isk sector. See 
9070: 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72 53 69  also setSectorSi
9080: 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ze()..*/.#define
9090: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
90a0: 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d  pPager) (pPager-
90b0: 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a  >sectorSize)../*
90c0: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45  .** The macro ME
90d0: 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77  MDB is true if w
90e0: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
90f0: 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  th an in-memory 
9100: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20  database..** We 
9110: 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63  do this as a mac
9120: 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68  ro so that if th
9130: 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  e SQLITE_OMIT_ME
9140: 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20  MORYDB macro is 
9150: 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  set,.** the valu
9160: 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20  e of MEMDB will 
9170: 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e  be a constant an
9180: 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  d the compiler w
9190: 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20  ill optimize.** 
91a0: 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f  out code that wo
91b0: 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74  uld never execut
91c0: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
91d0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
91e0: 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  B.# define MEMDB
91f0: 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   0.#else.# defin
9200: 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e  e MEMDB pPager->
9210: 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a  memDb.#endif../*
9220: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 55 53  .** The macro US
9230: 45 46 45 54 43 48 20 69 73 20 74 72 75 65 20 69  EFETCH is true i
9240: 66 20 77 65 20 61 72 65 20 61 6c 6c 6f 77 65 64  f we are allowed
9250: 20 74 6f 20 75 73 65 20 74 68 65 20 78 46 65 74   to use the xFet
9260: 63 68 20 61 6e 64 20 78 55 6e 66 65 74 63 68 0a  ch and xUnfetch.
9270: 2a 2a 20 69 6e 74 65 72 66 61 63 65 73 20 74 6f  ** interfaces to
9280: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
9290: 62 61 73 65 20 75 73 69 6e 67 20 6d 65 6d 6f 72  base using memor
92a0: 79 2d 6d 61 70 70 65 64 20 49 2f 4f 2e 0a 2a 2f  y-mapped I/O..*/
92b0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
92c0: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 64 65  MMAP_SIZE>0.# de
92d0: 66 69 6e 65 20 55 53 45 46 45 54 43 48 28 78 29  fine USEFETCH(x)
92e0: 20 28 28 78 29 2d 3e 62 55 73 65 46 65 74 63 68   ((x)->bUseFetch
92f0: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
9300: 20 55 53 45 46 45 54 43 48 28 78 29 20 30 0a 23   USEFETCH(x) 0.#
9310: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
9320: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
9330: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
9340: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
9350: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
9360: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
9370: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
9380: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
9390: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
93a0: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
93b0: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
93c0: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
93d0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
93e0: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
93f0: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
9400: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
9410: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
9420: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
9430: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
9440: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
9450: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
9460: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
9470: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
9480: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
9490: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
94a0: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
94b0: 2d 3e 70 4d 65 74 68 6f 64 73 21 3d 30 29 0a 0a  ->pMethods!=0)..
94c0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
94d0: 65 20 69 66 20 74 68 69 73 20 70 61 67 65 72 20  e if this pager 
94e0: 75 73 65 73 20 61 20 77 72 69 74 65 2d 61 68 65  uses a write-ahe
94f0: 61 64 20 6c 6f 67 20 69 6e 73 74 65 61 64 20 6f  ad log instead o
9500: 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 72  f the usual.** r
9510: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
9520: 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 73 65   Otherwise false
9530: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
9540: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 73 74 61  ITE_OMIT_WAL.sta
9550: 74 69 63 20 69 6e 74 20 70 61 67 65 72 55 73 65  tic int pagerUse
9560: 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  Wal(Pager *pPage
9570: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 50  r){.  return (pP
9580: 61 67 65 72 2d 3e 70 57 61 6c 21 3d 30 29 3b 0a  ager->pWal!=0);.
9590: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
95a0: 20 70 61 67 65 72 55 73 65 57 61 6c 28 78 29 20   pagerUseWal(x) 
95b0: 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  0.# define pager
95c0: 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 78 29 20 30  RollbackWal(x) 0
95d0: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 57  .# define pagerW
95e0: 61 6c 46 72 61 6d 65 73 28 76 2c 77 2c 78 2c 79  alFrames(v,w,x,y
95f0: 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61 67  ) 0.# define pag
9600: 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65  erOpenWalIfPrese
9610: 6e 74 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  nt(z) SQLITE_OK.
9620: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 42 65  # define pagerBe
9630: 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
9640: 6f 6e 28 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  on(z) SQLITE_OK.
9650: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
9660: 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73  NDEBUG ./*.** Us
9670: 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73  age:.**.**   ass
9680: 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
9690: 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
96a0: 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  );.**.** This fu
96b0: 6e 63 74 69 6f 6e 20 72 75 6e 73 20 6d 61 6e 79  nction runs many
96c0: 20 61 73 73 65 72 74 73 20 74 6f 20 74 72 79 20   asserts to try 
96d0: 74 6f 20 66 69 6e 64 20 69 6e 63 6f 6e 73 69 73  to find inconsis
96e0: 74 65 6e 63 69 65 73 20 69 6e 0a 2a 2a 20 74 68  tencies in.** th
96f0: 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
9700: 20 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62   of the Pager ob
9710: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
9720: 69 6e 74 20 61 73 73 65 72 74 5f 70 61 67 65 72  int assert_pager
9730: 5f 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 29  _state(Pager *p)
9740: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
9750: 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a 20 53 74 61  r = p;..  /* Sta
9760: 74 65 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64  te must be valid
9770: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
9780: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
9790: 4f 50 45 4e 0a 20 20 20 20 20 20 20 7c 7c 20 70  OPEN.       || p
97a0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
97b0: 52 45 41 44 45 52 0a 20 20 20 20 20 20 20 7c 7c  READER.       ||
97c0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
97d0: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a  R_WRITER_LOCKED.
97e0: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
97f0: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9800: 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20  R_CACHEMOD.     
9810: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9820: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
9830: 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e  OD.       || p->
9840: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
9850: 49 54 45 52 5f 46 49 4e 49 53 48 45 44 0a 20 20  ITER_FINISHED.  
9860: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9870: 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 0a 20  e==PAGER_ERROR. 
9880: 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 67 61 72 64   );..  /* Regard
9890: 6c 65 73 73 20 6f 66 20 74 68 65 20 63 75 72 72  less of the curr
98a0: 65 6e 74 20 73 74 61 74 65 2c 20 61 20 74 65 6d  ent state, a tem
98b0: 70 2d 66 69 6c 65 20 63 6f 6e 6e 65 63 74 69 6f  p-file connectio
98c0: 6e 20 61 6c 77 61 79 73 20 62 65 68 61 76 65 73  n always behaves
98d0: 0a 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 68  .  ** as if it h
98e0: 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  as an exclusive 
98f0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
9900: 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20 6e 65  base file. It ne
9910: 76 65 72 20 75 70 64 61 74 65 73 0a 20 20 2a 2a  ver updates.  **
9920: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
9930: 74 65 72 20 66 69 65 6c 64 2c 20 73 6f 20 74 68  ter field, so th
9940: 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
9950: 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73  e flag is always
9960: 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   set..  */.  ass
9970: 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c 65  ert( p->tempFile
9980: 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c 6f 63 6b 3d  ==0 || p->eLock=
9990: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
99a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
99b0: 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70  tempFile==0 || p
99c0: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
99d0: 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 2f 2a 20  ntDone );..  /* 
99e0: 49 66 20 74 68 65 20 75 73 65 4a 6f 75 72 6e 61  If the useJourna
99f0: 6c 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 2c  l flag is clear,
9a00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
9a10: 65 20 6d 75 73 74 20 62 65 20 22 4f 46 46 22 2e  e must be "OFF".
9a20: 20 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 74 68   .  ** And if th
9a30: 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69  e journal-mode i
9a40: 73 20 22 4f 46 46 22 2c 20 74 68 65 20 6a 6f 75  s "OFF", the jou
9a50: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 6e  rnal file must n
9a60: 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 2a 2f  ot be open..  */
9a70: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f  .  assert( p->jo
9a80: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
9a90: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
9aa0: 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f 75 72 6e 61   || p->useJourna
9ab0: 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
9ac0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
9ad0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
9ae0: 5f 4f 46 46 20 7c 7c 20 21 69 73 4f 70 65 6e 28  _OFF || !isOpen(
9af0: 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a  p->jfd) );..  /*
9b00: 20 43 68 65 63 6b 20 74 68 61 74 20 4d 45 4d 44   Check that MEMD
9b10: 42 20 69 6d 70 6c 69 65 73 20 6e 6f 53 79 6e 63  B implies noSync
9b20: 2e 20 41 6e 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f  . And an in-memo
9b30: 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 53 69 6e 63  ry journal. Sinc
9b40: 65 20 0a 20 20 2a 2a 20 74 68 69 73 20 6d 65 61  e .  ** this mea
9b50: 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  ns an in-memory 
9b60: 70 61 67 65 72 20 70 65 72 66 6f 72 6d 73 20 6e  pager performs n
9b70: 6f 20 49 4f 20 61 74 20 61 6c 6c 2c 20 69 74 20  o IO at all, it 
9b80: 63 61 6e 6e 6f 74 20 65 6e 63 6f 75 6e 74 65 72  cannot encounter
9b90: 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 53 51   .  ** either SQ
9ba0: 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51  LITE_IOERR or SQ
9bb0: 4c 49 54 45 5f 46 55 4c 4c 20 64 75 72 69 6e 67  LITE_FULL during
9bc0: 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 77 68 69   rollback or whi
9bd0: 6c 65 20 66 69 6e 61 6c 69 7a 69 6e 67 20 0a 20  le finalizing . 
9be0: 20 2a 2a 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   ** a journal fi
9bf0: 6c 65 2e 20 28 61 6c 74 68 6f 75 67 68 20 74 68  le. (although th
9c00: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  e in-memory jour
9c10: 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  nal implementati
9c20: 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a 20 72 65 74  on may .  ** ret
9c30: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
9c40: 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65 20 74 68 65  _NOMEM while the
9c50: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
9c60: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 29 2e   being written).
9c70: 20 49 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65   It .  ** is the
9c80: 72 65 66 6f 72 65 20 6e 6f 74 20 70 6f 73 73 69  refore not possi
9c90: 62 6c 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  ble for an in-me
9ca0: 6d 6f 72 79 20 70 61 67 65 72 20 74 6f 20 65 6e  mory pager to en
9cb0: 74 65 72 20 74 68 65 20 45 52 52 4f 52 20 0a 20  ter the ERROR . 
9cc0: 20 2a 2a 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a   ** state..  */.
9cd0: 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
9ce0: 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
9cf0: 65 6e 28 70 2d 3e 66 64 29 20 29 3b 0a 20 20 20  en(p->fd) );.   
9d00: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 6f 53 79   assert( p->noSy
9d10: 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nc );.    assert
9d20: 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ( p->journalMode
9d30: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9d40: 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
9d50: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
9d60: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9d70: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
9d80: 20 20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74     );.    assert
9d90: 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ( p->eState!=PAG
9da0: 45 52 5f 45 52 52 4f 52 20 26 26 20 70 2d 3e 65  ER_ERROR && p->e
9db0: 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45  State!=PAGER_OPE
9dc0: 4e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  N );.    assert(
9dd0: 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 29 3d   pagerUseWal(p)=
9de0: 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  =0 );.  }..  /* 
9df0: 49 66 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  If changeCountDo
9e00: 6e 65 20 69 73 20 73 65 74 2c 20 61 20 52 45 53  ne is set, a RES
9e10: 45 52 56 45 44 20 6c 6f 63 6b 20 6f 72 20 67 72  ERVED lock or gr
9e20: 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65  eater must be he
9e30: 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 66  ld.  ** on the f
9e40: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
9e50: 72 74 28 20 70 50 61 67 65 72 2d 3e 63 68 61 6e  rt( pPager->chan
9e60: 67 65 43 6f 75 6e 74 44 6f 6e 65 3d 3d 30 20 7c  geCountDone==0 |
9e70: 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  | pPager->eLock>
9e80: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
9e90: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
9ea0: 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock!=PENDING_LO
9eb0: 43 4b 20 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  CK );..  switch(
9ec0: 20 70 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20   p->eState ){.  
9ed0: 20 20 63 61 73 65 20 50 41 47 45 52 5f 4f 50 45    case PAGER_OPE
9ee0: 4e 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  N:.      assert(
9ef0: 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 20   !MEMDB );.     
9f00: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9f10: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9f20: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
9f30: 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
9f40: 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
9f50: 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 7c  r->pPCache)==0 |
9f60: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
9f70: 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  le );.      brea
9f80: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
9f90: 45 52 5f 52 45 41 44 45 52 3a 0a 20 20 20 20 20  ER_READER:.     
9fa0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
9fb0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
9fc0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
9fd0: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
9fe0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
9ff0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a000: 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f 4c 4f  eLock>=SHARED_LO
a010: 43 4b 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  CK );.      brea
a020: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a030: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
a040: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
a050: 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  p->eLock!=UNKNOW
a060: 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
a070: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a080: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
a090: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OK );.      if( 
a0a0: 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
a0b0: 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
a0c0: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
a0d0: 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
a0e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a0f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a100: 3e 64 62 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  >dbSize==pPager-
a110: 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20  >dbOrigSize );. 
a120: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a130: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d  ger->dbOrigSize=
a140: 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  =pPager->dbFileS
a150: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ize );.      ass
a160: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f  ert( pPager->dbO
a170: 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d  rigSize==pPager-
a180: 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a 20  >dbHintSize );. 
a190: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a1a0: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d  ger->setMaster==
a1b0: 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
a1c0: 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ;..    case PAGE
a1d0: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
a1e0: 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  D:.      assert(
a1f0: 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f   p->eLock!=UNKNO
a200: 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  WN_LOCK );.     
a210: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a220: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a230: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _OK );.      if(
a240: 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
a250: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
a260: 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62   /* It is possib
a270: 6c 65 20 74 68 61 74 20 69 66 20 6a 6f 75 72 6e  le that if journ
a280: 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20 68 65 72 65  al_mode=wal here
a290: 20 74 68 61 74 20 6e 65 69 74 68 65 72 20 74 68   that neither th
a2a0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
a2b0: 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 72 20 74 68  rnal file nor th
a2c0: 65 20 57 41 4c 20 66 69 6c 65 20 61 72 65 20 6f  e WAL file are o
a2d0: 70 65 6e 2e 20 54 68 69 73 20 68 61 70 70 65 6e  pen. This happen
a2e0: 73 20 64 75 72 69 6e 67 0a 20 20 20 20 20 20 20  s during.       
a2f0: 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 74   ** a rollback t
a300: 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
a310: 73 77 69 74 63 68 65 73 20 66 72 6f 6d 20 6a 6f  switches from jo
a320: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f 66 66 0a 20  urnal_mode=off. 
a330: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6a 6f 75         ** to jou
a340: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 2e 0a 20  rnal_mode=wal.. 
a350: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
a360: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a370: 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck>=RESERVED_LOC
a380: 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  K );.        ass
a390: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
a3a0: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
a3b0: 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d    || p->journalM
a3c0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
a3d0: 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
a3e0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a3f0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a400: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a410: 4c 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  L .        );.  
a420: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
a430: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
a440: 69 67 53 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e  igSize==pPager->
a450: 64 62 46 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20  dbFileSize );.  
a460: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a470: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d  er->dbOrigSize==
a480: 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69  pPager->dbHintSi
a490: 7a 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ze );.      brea
a4a0: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a4b0: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3a  ER_WRITER_DBMOD:
a4c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a4d0: 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
a4e0: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a4f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a500: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
a510: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _OK );.      ass
a520: 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
a530: 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  l(pPager) );.   
a540: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
a550: 6f 63 6b 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock>=EXCLUSIVE_L
a560: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  OCK );.      ass
a570: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a  ert( isOpen(p->j
a580: 66 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  fd) .           
a590: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a5a0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a5b0: 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
a5c0: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a5d0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a5e0: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
a5f0: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
a600: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a610: 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67 65 72  OrigSize<=pPager
a620: 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a  ->dbHintSize );.
a630: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a640: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
a650: 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 20 20  TER_FINISHED:.  
a660: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a670: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
a680: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
a690: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a6a0: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
a6b0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a6c0: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
a6d0: 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
a6e0: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
a6f0: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
a700: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a710: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a720: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
a730: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
a740: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
a750: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
a760: 20 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20   .      );.     
a770: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
a780: 65 20 50 41 47 45 52 5f 45 52 52 4f 52 3a 0a 20  e PAGER_ERROR:. 
a790: 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 6d 75       /* There mu
a7a0: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  st be at least o
a7b0: 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  ne outstanding r
a7c0: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
a7d0: 70 61 67 65 72 20 69 66 0a 20 20 20 20 20 20 2a  pager if.      *
a7e0: 2a 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65  * in ERROR state
a7f0: 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20  . Otherwise the 
a800: 70 61 67 65 72 20 73 68 6f 75 6c 64 20 68 61 76  pager should hav
a810: 65 20 61 6c 72 65 61 64 79 20 64 72 6f 70 70 65  e already droppe
a820: 64 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20  d.      ** back 
a830: 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20  to OPEN state.. 
a840: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
a850: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a860: 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rCode!=SQLITE_OK
a870: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a880: 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
a890: 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
a8a0: 70 50 43 61 63 68 65 29 3e 30 20 7c 7c 20 70 50  pPCache)>0 || pP
a8b0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
a8c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a8d0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   }..  return 1;.
a8e0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64  }.#endif /* ifnd
a8f0: 65 66 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69  ef NDEBUG */..#i
a900: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
a910: 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  G ./*.** Return 
a920: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 68  a pointer to a h
a930: 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 73 74  uman readable st
a940: 72 69 6e 67 20 69 6e 20 61 20 73 74 61 74 69 63  ring in a static
a950: 20 62 75 66 66 65 72 0a 2a 2a 20 63 6f 6e 74 61   buffer.** conta
a960: 69 6e 69 6e 67 20 74 68 65 20 73 74 61 74 65 20  ining the state 
a970: 6f 66 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  of the Pager obj
a980: 65 63 74 20 70 61 73 73 65 64 20 61 73 20 61 6e  ect passed as an
a990: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 69 73 0a   argument. This.
a9a0: 2a 2a 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74  ** is intended t
a9b0: 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e  o be used within
a9c0: 20 64 65 62 75 67 67 65 72 73 2e 20 46 6f 72 20   debuggers. For 
a9d0: 65 78 61 6d 70 6c 65 2c 20 61 73 20 61 6e 20 61  example, as an a
a9e0: 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 74 6f  lternative.** to
a9f0: 20 22 70 72 69 6e 74 20 2a 70 50 61 67 65 72 22   "print *pPager"
aa00: 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a 2a 2a 20 28   in gdb:.**.** (
aa10: 67 64 62 29 20 70 72 69 6e 74 66 20 22 25 73 22  gdb) printf "%s"
aa20: 2c 20 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74  , print_pager_st
aa30: 61 74 65 28 70 50 61 67 65 72 29 0a 2a 2f 0a 73  ate(pPager).*/.s
aa40: 74 61 74 69 63 20 63 68 61 72 20 2a 70 72 69 6e  tatic char *prin
aa50: 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61  t_pager_state(Pa
aa60: 67 65 72 20 2a 70 29 7b 0a 20 20 73 74 61 74 69  ger *p){.  stati
aa70: 63 20 63 68 61 72 20 7a 52 65 74 5b 31 30 32 34  c char zRet[1024
aa80: 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  ];..  sqlite3_sn
aa90: 70 72 69 6e 74 66 28 31 30 32 34 2c 20 7a 52 65  printf(1024, zRe
aaa0: 74 2c 0a 20 20 20 20 20 20 22 46 69 6c 65 6e 61  t,.      "Filena
aab0: 6d 65 3a 20 20 20 20 20 20 25 73 5c 6e 22 0a 20  me:      %s\n". 
aac0: 20 20 20 20 20 22 53 74 61 74 65 3a 20 20 20 20       "State:    
aad0: 20 20 20 20 20 25 73 20 65 72 72 43 6f 64 65 3d       %s errCode=
aae0: 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63  %d\n".      "Loc
aaf0: 6b 3a 20 20 20 20 20 20 20 20 20 20 25 73 5c 6e  k:          %s\n
ab00: 22 0a 20 20 20 20 20 20 22 4c 6f 63 6b 69 6e 67  ".      "Locking
ab10: 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b 69 6e 67 5f   mode:  locking_
ab20: 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20  mode=%s\n".     
ab30: 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f 64 65 3a 20   "Journal mode: 
ab40: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 73   journal_mode=%s
ab50: 5c 6e 22 0a 20 20 20 20 20 20 22 42 61 63 6b 69  \n".      "Backi
ab60: 6e 67 20 73 74 6f 72 65 3a 20 74 65 6d 70 46 69  ng store: tempFi
ab70: 6c 65 3d 25 64 20 6d 65 6d 44 62 3d 25 64 20 75  le=%d memDb=%d u
ab80: 73 65 4a 6f 75 72 6e 61 6c 3d 25 64 5c 6e 22 0a  seJournal=%d\n".
ab90: 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 3a 20        "Journal: 
aba0: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4f 66 66        journalOff
abb0: 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61 6c 48 64 72  =%lld journalHdr
abc0: 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20 20 20 20 22  =%lld\n".      "
abd0: 53 69 7a 65 3a 20 20 20 20 20 20 20 20 20 20 64  Size:          d
abe0: 62 73 69 7a 65 3d 25 64 20 64 62 4f 72 69 67 53  bsize=%d dbOrigS
abf0: 69 7a 65 3d 25 64 20 64 62 46 69 6c 65 53 69 7a  ize=%d dbFileSiz
ac00: 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 2c 20  e=%d\n".      , 
ac10: 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 0a 20 20 20  p->zFilename.   
ac20: 20 20 20 2c 20 70 2d 3e 65 53 74 61 74 65 3d 3d     , p->eState==
ac30: 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20 20  PAGER_OPEN      
ac40: 20 20 20 20 20 20 3f 20 22 4f 50 45 4e 22 20 3a        ? "OPEN" :
ac50: 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
ac60: 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
ac70: 20 20 20 20 20 20 20 20 20 20 3f 20 22 52 45 41            ? "REA
ac80: 44 45 52 22 20 3a 0a 20 20 20 20 20 20 20 20 70  DER" :.        p
ac90: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
aca0: 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20  WRITER_LOCKED   
acb0: 3f 20 22 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ? "WRITER_LOCKED
acc0: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
acd0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
ace0: 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 3f 20 22  TER_CACHEMOD ? "
acf0: 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 22  WRITER_CACHEMOD"
ad00: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
ad10: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
ad20: 45 52 5f 44 42 4d 4f 44 20 20 20 20 3f 20 22 57  ER_DBMOD    ? "W
ad30: 52 49 54 45 52 5f 44 42 4d 4f 44 22 20 3a 0a 20  RITER_DBMOD" :. 
ad40: 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
ad50: 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  ==PAGER_WRITER_F
ad60: 49 4e 49 53 48 45 44 20 3f 20 22 57 52 49 54 45  INISHED ? "WRITE
ad70: 52 5f 46 49 4e 49 53 48 45 44 22 20 3a 0a 20 20  R_FINISHED" :.  
ad80: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
ad90: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 20 20 20  =PAGER_ERROR    
ada0: 20 20 20 20 20 20 20 3f 20 22 45 52 52 4f 52 22         ? "ERROR"
adb0: 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20   : "?error?".   
adc0: 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 65 72 72     , (int)p->err
add0: 43 6f 64 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e  Code.      , p->
ade0: 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 20  eLock==NO_LOCK  
adf0: 20 20 20 20 20 20 20 3f 20 22 4e 4f 5f 4c 4f 43         ? "NO_LOC
ae00: 4b 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  K" :.        p->
ae10: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
ae20: 4c 4f 43 4b 20 20 20 3f 20 22 52 45 53 45 52 56  LOCK   ? "RESERV
ae30: 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  ED" :.        p-
ae40: 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  >eLock==EXCLUSIV
ae50: 45 5f 4c 4f 43 4b 20 20 3f 20 22 45 58 43 4c 55  E_LOCK  ? "EXCLU
ae60: 53 49 56 45 22 20 3a 0a 20 20 20 20 20 20 20 20  SIVE" :.        
ae70: 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  p->eLock==SHARED
ae80: 5f 4c 4f 43 4b 20 20 20 20 20 3f 20 22 53 48 41  _LOCK     ? "SHA
ae90: 52 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  RED" :.        p
aea0: 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e  ->eLock==UNKNOWN
aeb0: 5f 4c 4f 43 4b 20 20 20 20 3f 20 22 55 4e 4b 4e  _LOCK    ? "UNKN
aec0: 4f 57 4e 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  OWN" : "?error?"
aed0: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 78 63 6c  .      , p->excl
aee0: 75 73 69 76 65 4d 6f 64 65 20 3f 20 22 65 78 63  usiveMode ? "exc
aef0: 6c 75 73 69 76 65 22 20 3a 20 22 6e 6f 72 6d 61  lusive" : "norma
af00: 6c 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e 6a 6f  l".      , p->jo
af10: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
af20: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
af30: 4f 52 59 20 20 20 3f 20 22 6d 65 6d 6f 72 79 22  ORY   ? "memory"
af40: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
af50: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
af60: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
af70: 20 20 20 20 20 20 3f 20 22 6f 66 66 22 20 3a 0a        ? "off" :.
af80: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
af90: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
afa0: 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
afb0: 20 20 20 3f 20 22 64 65 6c 65 74 65 22 20 3a 0a     ? "delete" :.
afc0: 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72 6e          p->journ
afd0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
afe0: 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
aff0: 54 20 20 3f 20 22 70 65 72 73 69 73 74 22 20 3a  T  ? "persist" :
b000: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f 75 72  .        p->jour
b010: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
b020: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
b030: 41 54 45 20 3f 20 22 74 72 75 6e 63 61 74 65 22  ATE ? "truncate"
b040: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a 6f   :.        p->jo
b050: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
b060: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
b070: 20 20 20 20 20 20 3f 20 22 77 61 6c 22 20 3a 20        ? "wal" : 
b080: 22 3f 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20  "?error?".      
b090: 2c 20 28 69 6e 74 29 70 2d 3e 74 65 6d 70 46 69  , (int)p->tempFi
b0a0: 6c 65 2c 20 28 69 6e 74 29 70 2d 3e 6d 65 6d 44  le, (int)p->memD
b0b0: 62 2c 20 28 69 6e 74 29 70 2d 3e 75 73 65 4a 6f  b, (int)p->useJo
b0c0: 75 72 6e 61 6c 0a 20 20 20 20 20 20 2c 20 70 2d  urnal.      , p-
b0d0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 2d 3e  >journalOff, p->
b0e0: 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20  journalHdr.     
b0f0: 20 2c 20 28 69 6e 74 29 70 2d 3e 64 62 53 69 7a   , (int)p->dbSiz
b100: 65 2c 20 28 69 6e 74 29 70 2d 3e 64 62 4f 72 69  e, (int)p->dbOri
b110: 67 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64  gSize, (int)p->d
b120: 62 46 69 6c 65 53 69 7a 65 0a 20 20 29 3b 0a 0a  bFileSize.  );..
b130: 20 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d    return zRet;.}
b140: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
b150: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
b160: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
b170: 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67   write page *pPg
b180: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
b190: 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65  urnal..** A page
b1a0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69   needs to be wri
b1b0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75  tten into the su
b1c0: 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65  b-journal if the
b1d0: 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a  re exists one.**
b1e0: 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61   or more open sa
b1f0: 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69  vepoints for whi
b200: 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ch:.**.**   * Th
b210: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
b220: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
b230: 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65  ual to PagerSave
b240: 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64  point.nOrig, and
b250: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20  .**   * The bit 
b260: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
b270: 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
b280: 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a   is not set in.*
b290: 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
b2a0: 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
b2b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
b2c0: 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
b2d0: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
b2e0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
b2f0: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
b300: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
b310: 70 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  p;.  Pgno pgno =
b320: 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e   pPg->pgno;.  in
b330: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
b340: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
b350: 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  oint; i++){.    
b360: 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61  p = &pPager->aSa
b370: 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20  vepoint[i];.    
b380: 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67  if( p->nOrig>=pg
b390: 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  no && 0==sqlite3
b3a0: 42 69 74 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c  BitvecTestNotNul
b3b0: 6c 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  l(p->pInSavepoin
b3c0: 74 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  t, pgno) ){.    
b3d0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
b3e0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
b3f0: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
b400: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  TE_DEBUG./*.** R
b410: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
b420: 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  e page is alread
b430: 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
b440: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
b450: 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e   int pageInJourn
b460: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
b470: 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
b480: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42   return sqlite3B
b490: 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
b4a0: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
b4b0: 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64  g->pgno);.}.#end
b4c0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  if../*.** Read a
b4d0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
b4e0: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66  from the given f
b4f0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
b500: 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67   Store the integ
b510: 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65  er.** that is re
b520: 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65  ad in *pRes.  Re
b530: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
b540: 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
b550: 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72  ked, or an.** er
b560: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
b570: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
b580: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75  ..**.** All valu
b590: 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e  es are stored on
b5a0: 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64   disk as big-end
b5b0: 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ian..*/.static i
b5c0: 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71  nt read32bits(sq
b5d0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
b5e0: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
b5f0: 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e  *pRes){.  unsign
b600: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
b610: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
b620: 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20  3OsRead(fd, ac, 
b630: 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73  sizeof(ac), offs
b640: 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  et);.  if( rc==S
b650: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b660: 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47  *pRes = sqlite3G
b670: 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d  et4byte(ac);.  }
b680: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b690: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
b6a0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
b6b0: 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  to a string buff
b6c0: 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e  er in big-endian
b6d0: 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a   byte order..*/.
b6e0: 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74  #define put32bit
b6f0: 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50  s(A,B)  sqlite3P
b700: 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42  ut4byte((u8*)A,B
b710: 29 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  ).../*.** Write 
b720: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
b730: 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20   into the given 
b740: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
b750: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
b760: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
b770: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
b780: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
b790: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
b7a0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
b7b0: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
b7c0: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
b7d0: 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63  t, u32 val){.  c
b7e0: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74  har ac[4];.  put
b7f0: 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b  32bits(ac, val);
b800: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
b810: 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c  3OsWrite(fd, ac,
b820: 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a   4, offset);.}..
b830: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65  /*.** Unlock the
b840: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
b850: 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77  o level eLock, w
b860: 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74  hich must be eit
b870: 68 65 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f  her NO_LOCK.** o
b880: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52  r SHARED_LOCK. R
b890: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
b8a0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
b8b0: 63 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28  call to xUnlock(
b8c0: 29 0a 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73  ).** succeeds, s
b8d0: 65 74 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f  et the Pager.eLo
b8e0: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d  ck variable to m
b8f0: 61 74 63 68 20 74 68 65 20 28 61 74 74 65 6d 70  atch the (attemp
b900: 74 65 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a  ted) new lock..*
b910: 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20  *.** Except, if 
b920: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
b930: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
b940: 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  CK when this fun
b950: 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c  ction is.** call
b960: 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66  ed, do not modif
b970: 79 20 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f  y it. See the co
b980: 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20  mment above the 
b990: 23 64 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55  #define of .** U
b9a0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20  NKNOWN_LOCK for 
b9b0: 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  an explanation o
b9c0: 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  f this..*/.stati
b9d0: 63 20 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63  c int pagerUnloc
b9e0: 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65  kDb(Pager *pPage
b9f0: 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  r, int eLock){. 
ba00: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
ba10: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
ba20: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
ba30: 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  veMode || pPager
ba40: 2d 3e 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29  ->eLock==eLock )
ba50: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ;.  assert( eLoc
ba60: 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  k==NO_LOCK || eL
ba70: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
ba80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
ba90: 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock!=NO_LOCK || 
baa0: 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
bab0: 65 72 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  er)==0 );.  if( 
bac0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
bad0: 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  d) ){.    assert
bae0: 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e  ( pPager->eLock>
baf0: 3d 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63  =eLock );.    rc
bb00: 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63   = pPager->noLoc
bb10: 6b 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  k ? SQLITE_OK : 
bb20: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
bb30: 70 50 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63  pPager->fd, eLoc
bb40: 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  k);.    if( pPag
bb50: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f  er->eLock!=UNKNO
bb60: 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  WN_LOCK ){.     
bb70: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
bb80: 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20   (u8)eLock;.    
bb90: 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  }.    IOTRACE(("
bba0: 55 4e 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c  UNLOCK %p %d\n",
bbb0: 20 70 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29   pPager, eLock))
bbc0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
bbd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
bbe0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
bbf0: 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b  e to level eLock
bc00: 2c 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20  , which must be 
bc10: 65 69 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f  either SHARED_LO
bc20: 43 4b 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f  CK,.** RESERVED_
bc30: 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56  LOCK or EXCLUSIV
bc40: 45 5f 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63  E_LOCK. If the c
bc50: 61 6c 6c 65 72 20 69 73 20 73 75 63 63 65 73 73  aller is success
bc60: 66 75 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20  ful, set the.** 
bc70: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69  Pager.eLock vari
bc80: 61 62 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20  able to the new 
bc90: 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a  locking state. .
bca0: 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66  **.** Except, if
bcb0: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20   Pager.eLock is 
bcc0: 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
bcd0: 4f 43 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75  OCK when this fu
bce0: 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61  nction is .** ca
bcf0: 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64  lled, do not mod
bd00: 69 66 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68  ify it unless th
bd10: 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74  e new locking st
bd20: 61 74 65 20 69 73 20 45 58 43 4c 55 53 49 56 45  ate is EXCLUSIVE
bd30: 5f 4c 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74  _LOCK. .** See t
bd40: 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
bd50: 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20   the #define of 
bd60: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72  UNKNOWN_LOCK for
bd70: 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20   an explanation 
bd80: 0a 2a 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a  .** of this..*/.
bd90: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
bda0: 4c 6f 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50  LockDb(Pager *pP
bdb0: 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29  ager, int eLock)
bdc0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
bdd0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
bde0: 74 28 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  t( eLock==SHARED
bdf0: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
be00: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
be10: 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56   eLock==EXCLUSIV
be20: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  E_LOCK );.  if( 
be30: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c  pPager->eLock<eL
be40: 6f 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ock || pPager->e
be50: 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock==UNKNOWN_LO
be60: 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  CK ){.    rc = p
be70: 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20  Pager->noLock ? 
be80: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69  SQLITE_OK : sqli
be90: 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
bea0: 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20  ->fd, eLock);.  
beb0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
bec0: 5f 4f 4b 20 26 26 20 28 70 50 61 67 65 72 2d 3e  _OK && (pPager->
bed0: 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c  eLock!=UNKNOWN_L
bee0: 4f 43 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c  OCK||eLock==EXCL
bef0: 55 53 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20  USIVE_LOCK) ){. 
bf00: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f       pPager->eLo
bf10: 63 6b 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a  ck = (u8)eLock;.
bf20: 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
bf30: 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
bf40: 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20  Pager, eLock)). 
bf50: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
bf60: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
bf70: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74  his function det
bf80: 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20  ermines whether 
bf90: 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69  or not the atomi
bfa0: 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
bfb0: 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75  tion.** can be u
bfc0: 73 65 64 20 77 69 74 68 20 74 68 69 73 20 70 61  sed with this pa
bfd0: 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a  ger. The optimiz
bfe0: 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65  ation can be use
bff0: 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29  d if:.**.**  (a)
c000: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
c010: 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63 65 43  ned by OsDeviceC
c020: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 29  haracteristics()
c030: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a   indicates that.
c040: 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61 62 61  **      a databa
c050: 73 65 20 70 61 67 65 20 6d 61 79 20 62 65 20 77  se page may be w
c060: 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
c070: 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74  y, and.**  (b) t
c080: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
c090: 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a  d by OsSectorSiz
c0a0: 65 28 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e  e() is less than
c0b0: 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20   or equal.**    
c0c0: 20 20 74 6f 20 74 68 65 20 70 61 67 65 20 73 69    to the page si
c0d0: 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70  ze..**.** The op
c0e0: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 61 6c  timization is al
c0f0: 73 6f 20 61 6c 77 61 79 73 20 65 6e 61 62 6c 65  so always enable
c100: 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  d for temporary 
c110: 66 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a 2a 20  files. It is.** 
c120: 61 6e 20 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c  an error to call
c130: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
c140: 66 20 70 50 61 67 65 72 20 69 73 20 6f 70 65 6e  f pPager is open
c150: 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ed on an in-memo
c160: 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a  ry.** database..
c170: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74  **.** If the opt
c180: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74  imization cannot
c190: 20 62 65 20 75 73 65 64 2c 20 30 20 69 73 20 72   be used, 0 is r
c1a0: 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63  eturned. If it c
c1b0: 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74  an be used,.** t
c1c0: 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  hen the value re
c1d0: 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 73 69  turned is the si
c1e0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
c1f0: 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a  l file when it.*
c200: 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62  * contains rollb
c210: 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61  ack data for exa
c220: 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a  ctly one page..*
c230: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
c240: 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
c250: 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  ITE.static int j
c260: 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61  rnlBufferSize(Pa
c270: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
c280: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
c290: 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
c2a0: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
c2b0: 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20   int dc;        
c2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2d0: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61     /* Device cha
c2e0: 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a  racteristics */.
c2f0: 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b      int nSector;
c300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c310: 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20        /* Sector 
c320: 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  size */.    int 
c330: 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  szPage;         
c340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c350: 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20   Page size */.. 
c360: 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
c370: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
c380: 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65  .    dc = sqlite
c390: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
c3a0: 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
c3b0: 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f  >fd);.    nSecto
c3c0: 72 20 3d 20 70 50 61 67 65 72 2d 3e 73 65 63 74  r = pPager->sect
c3d0: 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a 50 61  orSize;.    szPa
c3e0: 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ge = pPager->pag
c3f0: 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65  eSize;..    asse
c400: 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
c410: 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e  ATOMIC512==(512>
c420: 3e 38 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >8));.    assert
c430: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
c440: 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e  OMIC64K==(65536>
c450: 3e 38 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d  >8));.    if( 0=
c460: 3d 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43  =(dc&(SQLITE_IOC
c470: 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67  AP_ATOMIC|(szPag
c480: 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f  e>>8)) || nSecto
c490: 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20  r>szPage) ){.   
c4a0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
c4b0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
c4c0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
c4d0: 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41  pPager) + JOURNA
c4e0: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
c4f0: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
c500: 65 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  e jrnlBufferSize
c510: 28 78 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (x) 0.#endif../*
c520: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48  .** If SQLITE_CH
c530: 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66  ECK_PAGES is def
c540: 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20  ined then we do 
c550: 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63  some sanity chec
c560: 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63  king.** on the c
c570: 61 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73  ache using a has
c580: 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69  h function.  Thi
c590: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  s is used for te
c5a0: 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62  sting.** and deb
c5b0: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
c5c0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
c5d0: 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20  ECK_PAGES./*.** 
c5e0: 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20  Return a 32-bit 
c5f0: 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65  hash of the page
c600: 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e   data for pPage.
c610: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
c620: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e  ager_datahash(in
c630: 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65  t nByte, unsigne
c640: 64 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a  d char *pData){.
c650: 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a    u32 hash = 0;.
c660: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
c670: 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b  =0; i<nByte; i++
c680: 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68  ){.    hash = (h
c690: 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74  ash*1039) + pDat
c6a0: 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  a[i];.  }.  retu
c6b0: 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69  rn hash;.}.stati
c6c0: 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65  c u32 pager_page
c6d0: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
c6e0: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67  e){.  return pag
c6f0: 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67  er_datahash(pPag
c700: 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53  e->pPager->pageS
c710: 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  ize, (unsigned c
c720: 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61  har *)pPage->pDa
c730: 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ta);.}.static vo
c740: 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67  id pager_set_pag
c750: 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61  ehash(PgHdr *pPa
c760: 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61  ge){.  pPage->pa
c770: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
c780: 61 67 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a  agehash(pPage);.
c790: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45  }../*.** The CHE
c7a0: 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61  CK_PAGE macro ta
c7b0: 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20  kes a PgHdr* as 
c7c0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  an argument. If 
c7d0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
c7e0: 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  ES.** is defined
c7f0: 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20  , and NDEBUG is 
c800: 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20  not defined, an 
c810: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
c820: 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61  nt checks.** tha
c830: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69  t the page is ei
c840: 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74  ther dirty or st
c850: 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20  ill matches the 
c860: 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d  calculated page-
c870: 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  hash..*/.#define
c880: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63   CHECK_PAGE(x) c
c890: 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74  heckPage(x).stat
c8a0: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67  ic void checkPag
c8b0: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
c8c0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
c8d0: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
c8e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
c8f0: 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
c900: 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ROR );.  assert(
c910: 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
c920: 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67  DR_DIRTY) || pPg
c930: 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65  ->pageHash==page
c940: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20  r_pagehash(pPg) 
c950: 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66  );.}..#else.#def
c960: 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61  ine pager_dataha
c970: 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69  sh(X,Y)  0.#defi
c980: 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ne pager_pagehas
c990: 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20  h(X)  0.#define 
c9a0: 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
c9b0: 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20 43 48  sh(X).#define CH
c9c0: 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64  ECK_PAGE(x).#end
c9d0: 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48  if  /* SQLITE_CH
c9e0: 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a  ECK_PAGES */../*
c9f0: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
ca00: 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72   called the jour
ca10: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
ca20: 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62  er pPager must b
ca30: 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20  e open..** This 
ca40: 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
ca50: 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61 73 74  s to read a mast
ca60: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
ca70: 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a  name from the .*
ca80: 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  * end of the fil
ca90: 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63 65 73  e and, if succes
caa0: 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69 74 20  sful, copies it 
cab0: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70  into memory supp
cac0: 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20  lied .** by the 
cad0: 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d  caller. See comm
cae0: 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69 74 65  ents above write
caf0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20  MasterJournal() 
cb00: 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a  for the format.*
cb10: 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  * used to store 
cb20: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
cb30: 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20 74 68   file name at th
cb40: 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e  e end of a journ
cb50: 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a  al file..**.** z
cb60: 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e  Master must poin
cb70: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  t to a buffer of
cb80: 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65   at least nMaste
cb90: 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  r bytes allocate
cba0: 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  d by.** the call
cbb0: 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20  er. This should 
cbc0: 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d  be sqlite3_vfs.m
cbd0: 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20  xPathname+1 (to 
cbe0: 65 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 0a  ensure there is.
cbf0: 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ** enough space 
cc00: 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61 73  to write the mas
cc10: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
cc20: 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65 72  ). If the master
cc30: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65   journal.** name
cc40: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
cc50: 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e  is longer than n
cc60: 4d 61 73 74 65 72 20 62 79 74 65 73 20 28 69 6e  Master bytes (in
cc70: 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c  cluding a.** nul
cc80: 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68  -terminator), th
cc90: 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c  en this is handl
cca0: 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74  ed as if no mast
ccb0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er journal name.
ccc0: 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 20  ** were present 
ccd0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  in the journal..
cce0: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74 65  **.** If a maste
ccf0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
cd00: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 61  ame is present a
cd10: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
cd20: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
cd30: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70  , then it is cop
cd40: 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66  ied into the buf
cd50: 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
cd60: 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20  y zMaster. A.** 
cd70: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62  nul-terminator b
cd80: 79 74 65 20 69 73 20 61 70 70 65 6e 64 65 64 20  yte is appended 
cd90: 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 66 6f  to the buffer fo
cda0: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61 73 74  llowing the mast
cdb0: 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  er.** journal fi
cdc0: 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49  le name..**.** I
cdd0: 66 20 69 74 20 69 73 20 64 65 74 65 72 6d 69 6e  f it is determin
cde0: 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73 74 65  ed that no maste
cdf0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
ce00: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 0a  ame is present .
ce10: 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73  ** zMaster[0] is
ce20: 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
ce30: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
ce40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
ce50: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
ce60: 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
ce70: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
ce80: 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72  an SQLite.** err
ce90: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
cea0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
ceb0: 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75  nt readMasterJou
cec0: 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  rnal(sqlite3_fil
ced0: 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a  e *pJrnl, char *
cee0: 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61  zMaster, u32 nMa
cef0: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
cf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf10: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
cf20: 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b  de */.  u32 len;
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf40: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20     /* Length in 
cf50: 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65 72 20  bytes of master 
cf60: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
cf70: 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
cf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cf90: 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20 62 79  Total size in by
cfa0: 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66  tes of journal f
cfb0: 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75  ile pJrnl */.  u
cfc0: 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
cfd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20            /* MJ 
cfe0: 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 72  checksum value r
cff0: 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  ead from journal
d000: 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20   */.  u32 u;    
d010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d020: 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
d030: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
d040: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
d050: 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62  gic[8];   /* A b
d060: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
d070: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
d080: 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d  /.  zMaster[0] =
d090: 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53 51   '\0';..  if( SQ
d0a0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
d0b0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
d0c0: 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20  (pJrnl, &szJ)). 
d0d0: 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c    || szJ<16.   |
d0e0: 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
d0f0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
d100: 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65  rnl, szJ-16, &le
d110: 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e  n)).   || len>=n
d120: 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 6c 65  Master .   || le
d130: 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 53 51 4c 49  n==0 .   || SQLI
d140: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
d150: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73  d32bits(pJrnl, s
d160: 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a  zJ-12, &cksum)).
d170: 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
d180: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
d190: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67  Read(pJrnl, aMag
d1a0: 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20  ic, 8, szJ-8)). 
d1b0: 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67    || memcmp(aMag
d1c0: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
d1d0: 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49  c, 8).   || SQLI
d1e0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
d1f0: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
d200: 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20  , zMaster, len, 
d210: 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29  szJ-16-len)).  )
d220: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
d230: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69  .  }..  /* See i
d240: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d  f the checksum m
d250: 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65  atches the maste
d260: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
d270: 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c  /.  for(u=0; u<l
d280: 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; u++){.    ck
d290: 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75  sum -= zMaster[u
d2a0: 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73  ];.  }.  if( cks
d2b0: 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  um ){.    /* If 
d2c0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65  the checksum doe
d2d0: 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65  sn't add up, the
d2e0: 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  n one or more of
d2f0: 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72   the disk sector
d300: 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  s.    ** contain
d310: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
d320: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
d330: 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  is corrupted. Th
d340: 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  is means.    ** 
d350: 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20  definitely roll 
d360: 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65  back, so just re
d370: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
d380: 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c  nd report a (nul
d390: 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d  ).    ** master-
d3a0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
d3b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e  ..    */.    len
d3c0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73   = 0;.  }.  zMas
d3d0: 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  ter[len] = '\0';
d3e0: 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51  .   .  return SQ
d3f0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
d400: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66  * Return the off
d410: 73 65 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f  set of the secto
d420: 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72  r boundary at or
d430: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a   immediately .**
d440: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76   following the v
d450: 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e  alue in pPager->
d460: 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75  journalOff, assu
d470: 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a  ming a sector .*
d480: 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72  * size of pPager
d490: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74  ->sectorSize byt
d4a0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f  es..**.** i.e fo
d4b0: 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20  r a sector size 
d4c0: 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20  of 512:.**.**   
d4d0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
d4e0: 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e            Return
d4f0: 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d   value.**   ----
d500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d520: 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20  ---.**   0      
d530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d540: 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20     0.**   512   
d550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d560: 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30      512.**   100
d570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d580: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20         512.**   
d590: 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20  2000            
d5a0: 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a            2048.*
d5b0: 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  * .*/.static i64
d5c0: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
d5d0: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
d5e0: 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d  {.  i64 offset =
d5f0: 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50   0;.  i64 c = pP
d600: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d610: 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20  ;.  if( c ){.   
d620: 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29   offset = ((c-1)
d630: 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  /JOURNAL_HDR_SZ(
d640: 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a  pPager) + 1) * J
d650: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
d660: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ager);.  }.  ass
d670: 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52  ert( offset%JOUR
d680: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
d690: 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)==0 );.  asser
d6a0: 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a  t( offset>=c );.
d6b0: 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65    assert( (offse
d6c0: 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  t-c)<JOURNAL_HDR
d6d0: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
d6e0: 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a   return offset;.
d6f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
d700: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
d710: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
d720: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
d730: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
d740: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
d750: 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  -op if the journ
d760: 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  al file has not 
d770: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a  been written to.
d780: 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63 75  ** within the cu
d790: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
d7a0: 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72  n (i.e. if Pager
d7b0: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e  .journalOff==0).
d7c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e  .**.** If doTrun
d7d0: 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  cate is non-zero
d7e0: 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f   or the Pager.jo
d7f0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76  urnalSizeLimit v
d800: 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65  ariable is.** se
d810: 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75  t to 0, then tru
d820: 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
d830: 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62  l file to zero b
d840: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74  ytes in size. Ot
d850: 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f  herwise,.** zero
d860: 20 74 68 65 20 32 38 2d 62 79 74 65 20 68 65 61   the 28-byte hea
d870: 64 65 72 20 61 74 20 74 68 65 20 73 74 61 72 74  der at the start
d880: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
d890: 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20  file. In either 
d8a0: 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65  case, .** if the
d8b0: 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
d8c0: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73   no-sync mode, s
d8d0: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
d8e0: 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  file immediately
d8f0: 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69   .** after writi
d900: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
d910: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61   it..**.** If Pa
d920: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
d930: 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20 61  imit is set to a
d940: 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a   positive, non-z
d950: 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a  ero value, and.*
d960: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
d970: 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65  truncation or ze
d980: 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64 20  roing described 
d990: 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f  above the size o
d9a0: 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61  f the .** journa
d9b0: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
d9c0: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
d9d0: 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20  his value, then 
d9e0: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
d9f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
da00: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
da10: 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68  eLimit bytes. Th
da20: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
da30: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20  oes.** not need 
da40: 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c  to be synced fol
da50: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
da60: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ation..**.** If 
da70: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
da80: 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63  rs, abandon proc
da90: 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72  essing and retur
daa0: 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
dab0: 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ode..** Otherwis
dac0: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
dad0: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
dae0: 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64  nt zeroJournalHd
daf0: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
db00: 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29   int doTruncate)
db10: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
db20: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db40: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
db50: 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  code */.  assert
db60: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
db70: 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  >jfd) );.  asser
db80: 74 28 20 21 73 71 6c 69 74 65 33 4a 6f 75 72 6e  t( !sqlite3Journ
db90: 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61  alIsInMemory(pPa
dba0: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69  ger->jfd) );.  i
dbb0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
dbc0: 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f 6e  alOff ){.    con
dbd0: 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20  st i64 iLimit = 
dbe0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
dbf0: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20  izeLimit;    /* 
dc00: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 6a  Local cache of j
dc10: 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52 41  sl */..    IOTRA
dc20: 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70  CE(("JZEROHDR %p
dc30: 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
dc40: 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65    if( doTruncate
dc50: 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b   || iLimit==0 ){
dc60: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
dc70: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
dc80: 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
dc90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
dca0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
dcb0: 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d 20  r zeroHdr[28] = 
dcc0: 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  {0};.      rc = 
dcd0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
dce0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f  Pager->jfd, zero
dcf0: 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f  Hdr, sizeof(zero
dd00: 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Hdr), 0);.    }.
dd10: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
dd20: 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72  TE_OK && !pPager
dd30: 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
dd40: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
dd50: 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
dd60: 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  , SQLITE_SYNC_DA
dd70: 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73  TAONLY|pPager->s
dd80: 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d  yncFlags);.    }
dd90: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
dda0: 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73   point the trans
ddb0: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
ddc0: 74 65 64 20 62 75 74 20 74 68 65 20 77 72 69 74  ted but the writ
ddd0: 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69  e lock .    ** i
dde0: 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20  s still held on 
ddf0: 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
de00: 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d  re is a size lim
de10: 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  it configured fo
de20: 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65  r .    ** the pe
de30: 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
de40: 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
de50: 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
de60: 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20  consumes more.  
de70: 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20    ** space than 
de80: 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77  that limit allow
de90: 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20  s for, truncate 
dea0: 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73  it now. There is
deb0: 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20   no need.    ** 
dec0: 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65  to sync the file
ded0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
dee0: 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  operation..    *
def0: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
df00: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69  LITE_OK && iLimi
df10: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34  t>0 ){.      i64
df20: 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   sz;.      rc = 
df30: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
df40: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
df50: 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  sz);.      if( r
df60: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
df70: 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  sz>iLimit ){.   
df80: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
df90: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
dfa0: 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29  er->jfd, iLimit)
dfb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dfc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
dfd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
dfe0: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
dff0: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
e000: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
e010: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a  led. A journal.*
e020: 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41  * header (JOURNA
e030: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
e040: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
e050: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
e060: 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   at the.** curre
e070: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  nt location..**.
e080: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
e090: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  r the journal he
e0a0: 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ader is as follo
e0b0: 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73  ws:.** - 8 bytes
e0c0: 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79  : Magic identify
e0d0: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ing journal form
e0e0: 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  at..** - 4 bytes
e0f0: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
e100: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
e110: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
e120: 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34  de is on..** - 4
e130: 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e   bytes: Random n
e140: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70  umber used for p
e150: 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34  age hash..** - 4
e160: 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20   bytes: Initial 
e170: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
e180: 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  unt..** - 4 byte
e190: 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75  s: Sector size u
e1a0: 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65  sed by the proce
e1b0: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
e1c0: 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d  is journal..** -
e1d0: 20 34 20 62 79 74 65 73 3a 20 44 61 74 61 62 61   4 bytes: Databa
e1e0: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  se page size..**
e1f0: 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79   .** Followed by
e200: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
e210: 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66 20   - 28) bytes of 
e220: 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f  unused space..*/
e230: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
e240: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  eJournalHdr(Page
e250: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
e260: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e270: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e280: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
e290: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48 65 61   */.  char *zHea
e2a0: 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  der = pPager->pT
e2b0: 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54 65 6d  mpSpace;  /* Tem
e2c0: 70 6f 72 61 72 79 20 73 70 61 63 65 20 75 73 65  porary space use
e2d0: 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61 64 65  d to build heade
e2e0: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65 61 64  r */.  u32 nHead
e2f0: 65 72 20 3d 20 28 75 33 32 29 70 50 61 67 65 72  er = (u32)pPager
e300: 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a 20 53 69  ->pageSize;/* Si
e310: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 6f 69  ze of buffer poi
e320: 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65 61 64  nted to by zHead
e330: 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57 72 69  er */.  u32 nWri
e340: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
e350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
e360: 79 74 65 73 20 6f 66 20 68 65 61 64 65 72 20 73  ytes of header s
e370: 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20 2a 2f  ector written */
e380: 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
e390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3a0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
e3b0: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  ounter */..  ass
e3c0: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
e3d0: 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20 20  er->jfd) );     
e3e0: 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65   /* Journal file
e3f0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20 2a   must be open. *
e400: 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72  /..  if( nHeader
e410: 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  >JOURNAL_HDR_SZ(
e420: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e  pPager) ){.    n
e430: 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c  Header = JOURNAL
e440: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
e450: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
e460: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73  ere are active s
e470: 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e  avepoints and an
e480: 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63  y of them were c
e490: 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73 69 6e  reated .  ** sin
e4a0: 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ce the most rece
e4b0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  nt journal heade
e4c0: 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75  r was written, u
e4d0: 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a 2a 20  pdate the .  ** 
e4e0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
e4f0: 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c 64 73  HdrOffset fields
e500: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72   now..  */.  for
e510: 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
e520: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
e530: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  ++){.    if( pPa
e540: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
e550: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d 3d  ii].iHdrOffset==
e560: 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  0 ){.      pPage
e570: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
e580: 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d 20 70  ].iHdrOffset = p
e590: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
e5a0: 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  f;.    }.  }..  
e5b0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
e5c0: 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
e5d0: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
e5e0: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
e5f0: 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  r);..  /* .  ** 
e600: 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 46  Write the nRec F
e610: 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65  ield - the numbe
e620: 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
e630: 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68  s that follow th
e640: 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  is.  ** journal 
e650: 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79  header. Normally
e660: 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65  , zero is writte
e670: 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  n to this value 
e680: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20  at this time..  
e690: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72 65 63  ** After the rec
e6a0: 6f 72 64 73 20 61 72 65 20 61 64 64 65 64 20 74  ords are added t
e6b0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61  o the journal (a
e6c0: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  nd the journal s
e6d0: 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20  ynced, .  ** if 
e6e0: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
e6f0: 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20  e), the zero is 
e700: 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
e710: 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72   the true number
e720: 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73  .  ** of records
e730: 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61   (see syncJourna
e740: 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  l())..  **.  ** 
e750: 41 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61  A faster alterna
e760: 74 69 76 65 20 69 73 20 74 6f 20 77 72 69 74 65  tive is to write
e770: 20 30 78 46 46 46 46 46 46 46 46 20 74 6f 20 74   0xFFFFFFFF to t
e780: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57  he nRec field. W
e790: 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67  hen.  ** reading
e7a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69   the journal thi
e7b0: 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51  s value tells SQ
e7c0: 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74  Lite to assume t
e7d0: 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73  hat the.  ** res
e7e0: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
e7f0: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76   file contains v
e800: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
e810: 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74 69  s. This assumpti
e820: 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65  on.  ** is dange
e830: 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66 61  rous, as if a fa
e840: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
e850: 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f  hilst writing to
e860: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
e870: 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f  * file it may co
e880: 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61  ntain some garba
e890: 67 65 20 64 61 74 61 2e 20 54 68 65 72 65 20 61  ge data. There a
e8a0: 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  re two scenarios
e8b0: 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73  .  ** where this
e8c0: 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e   risk can be ign
e8d0: 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ored:.  **.  ** 
e8e0: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67    * When the pag
e8f0: 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  er is in no-sync
e900: 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f   mode. Corruptio
e910: 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20  n can follow a. 
e920: 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61   **     power fa
e930: 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63 61  ilure in this ca
e940: 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a  se anyway..  **.
e950: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
e960: 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  e SQLITE_IOCAP_S
e970: 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20  AFE_APPEND flag 
e980: 69 73 20 73 65 74 2e 20 54 68 69 73 20 67 75 61  is set. This gua
e990: 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20  rantees.  **    
e9a0: 20 74 68 61 74 20 67 61 72 62 61 67 65 20 64 61   that garbage da
e9b0: 74 61 20 69 73 20 6e 65 76 65 72 20 61 70 70 65  ta is never appe
e9c0: 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72  nded to the jour
e9d0: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  nal file..  */. 
e9e0: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
e9f0: 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
ea00: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b  Pager->noSync );
ea10: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
ea20: 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61 67 65 72  oSync || (pPager
ea30: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
ea40: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
ea50: 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28  _MEMORY).   || (
ea60: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
ea70: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
ea80: 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54  Pager->fd)&SQLIT
ea90: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
eaa0: 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d  END) .  ){.    m
eab0: 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
eac0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
ead0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
eae0: 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33 32 62  ic));.    put32b
eaf0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
eb00: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
eb10: 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29  c)], 0xffffffff)
eb20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
eb30: 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c 20 30  emset(zHeader, 0
eb40: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
eb50: 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a  lMagic)+4);.  }.
eb60: 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d  .  /* The random
eb70: 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74   check-hash init
eb80: 69 61 6c 69 7a 65 72 20 2a 2f 20 0a 20 20 73 71  ializer */ .  sq
eb90: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
eba0: 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  (sizeof(pPager->
ebb0: 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61  cksumInit), &pPa
ebc0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
ebd0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
ebe0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
ebf0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20  urnalMagic)+4], 
ec00: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
ec10: 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69  t);.  /* The ini
ec20: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  tial database si
ec30: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
ec40: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
ec50: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
ec60: 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f  +8], pPager->dbO
ec70: 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54  rigSize);.  /* T
ec80: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
ec90: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
eca0: 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74  process */.  put
ecb0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
ecc0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
ecd0: 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65  agic)+12], pPage
ece0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
ecf0: 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73  .  /* The page s
ed00: 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ize */.  put32bi
ed10: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
ed20: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
ed30: 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70  )+16], pPager->p
ed40: 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20  ageSize);..  /* 
ed50: 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  Initializing the
ed60: 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66   tail of the buf
ed70: 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  fer is not neces
ed80: 73 61 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e  sary.  Everythin
ed90: 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e  g.  ** works fin
eda0: 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d if the followi
edb0: 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f  ng memset() is o
edc0: 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69  mitted.  But ini
edd0: 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74  tializing.  ** t
ede0: 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e  he memory preven
edf0: 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d  ts valgrind from
ee00: 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f   complaining, so
ee10: 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20   we are willing 
ee20: 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65  to.  ** take the
ee30: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
ee40: 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
ee50: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
ee60: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
ee70: 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  0], 0,.         
ee80: 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28  nHeader-(sizeof(
ee90: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
eea0: 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68  0));..  /* In th
eeb0: 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79  eory, it is only
eec0: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
eed0: 69 74 65 20 74 68 65 20 32 38 20 62 79 74 65 73  ite the 28 bytes
eee0: 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20   that the .  ** 
eef0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63  journal header c
ef00: 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a  onsumes to the j
ef10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65  ournal file here
ef20: 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  . Then increment
ef30: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
ef40: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69  .journalOff vari
ef50: 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f  able by JOURNAL_
ef60: 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74  HDR_SZ so that t
ef70: 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65  he next .  ** re
ef80: 63 6f 72 64 20 69 73 20 77 72 69 74 74 65 6e 20  cord is written 
ef90: 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
efa0: 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67   sector (leaving
efb0: 20 61 20 67 61 70 20 69 6e 20 74 68 65 20 66 69   a gap in the fi
efc0: 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c  le.  ** that wil
efd0: 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20  l be implicitly 
efe0: 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65  filled in by the
eff0: 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   OS)..  **.  ** 
f000: 48 6f 77 65 76 65 72 20 69 74 20 68 61 73 20 62  However it has b
f010: 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74  een discovered t
f020: 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74  hat on some syst
f030: 65 6d 73 20 74 68 69 73 20 70 61 74 74 65 72 6e  ems this pattern
f040: 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69   can .  ** be si
f050: 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77  gnificantly slow
f060: 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f  er than contiguo
f070: 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74  usly writing dat
f080: 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20  a to the file,. 
f090: 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74   ** even if that
f0a0: 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c   means explicitl
f0b0: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
f0c0: 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a  o the block of .
f0d0: 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44    ** (JOURNAL_HD
f0e0: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
f0f0: 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62   that will not b
f100: 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20  e used. So that 
f110: 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20  is what.  ** is 
f120: 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  done. .  **.  **
f130: 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71   The loop is req
f140: 75 69 72 65 64 20 68 65 72 65 20 69 6e 20 63 61  uired here in ca
f150: 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69  se the sector-si
f160: 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ze is larger tha
f170: 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61  n the .  ** data
f180: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20  base page size. 
f190: 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65  Since the zHeade
f1a0: 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79  r buffer is only
f1b0: 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a   Pager.pageSize.
f1c0: 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69    ** bytes in si
f1d0: 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ze, more than on
f1e0: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
f1f0: 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79 20 62  3OsWrite() may b
f200: 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20  e required.  ** 
f210: 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  to populate the 
f220: 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68  entire journal h
f230: 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20  eader sector..  
f240: 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65  */ .  for(nWrite
f250: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
f260: 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41  K&&nWrite<JOURNA
f270: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
f280: 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65  ; nWrite+=nHeade
f290: 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  r){.    IOTRACE(
f2a0: 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
f2b0: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
f2c0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
f2d0: 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20  , nHeader)).    
f2e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
f2f0: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
f300: 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65   zHeader, nHeade
f310: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
f320: 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73 73 65  alOff);.    asse
f330: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
f340: 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72  nalHdr <= pPager
f350: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
f360: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
f370: 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65  nalOff += nHeade
f380: 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  r;.  }..  return
f390: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
f3a0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
f3b0: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
f3c0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e   this is called.
f3d0: 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   A journal heade
f3e0: 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e  r file.** (JOURN
f3f0: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
f400: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
f410: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
f420: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
f430: 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63  l.** file. The c
f440: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
f450: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
f460: 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a  ile is given by.
f470: 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ** pPager->journ
f480: 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65  alOff. See comme
f490: 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69  nts above functi
f4a0: 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  on writeJournalH
f4b0: 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65  dr() for.** a de
f4c0: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
f4d0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f4e0: 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
f4f0: 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72   the header is r
f500: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
f510: 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20  , *pNRec is set 
f520: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
f530: 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73  .** page records
f540: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
f550: 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53  header and *pDbS
f560: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
f570: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
f580: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
f590: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
f5a0: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
f5b0: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
f5c0: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
f5d0: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
f5e0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
f5f0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
f600: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
f610: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
f620: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
f630: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
f640: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
f650: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
f660: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
f670: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
f680: 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69  pNRec and *PDbSi
f690: 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  ze are undefined
f6a0: 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44  .  If JOURNAL_HD
f6b0: 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61  R_SZ bytes.** ca
f6c0: 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f  nnot be read fro
f6d0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
f6e0: 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  le an error code
f6f0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
f700: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
f710: 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61  JournalHdr(.  Pa
f720: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
f730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
f740: 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ger object */.  
f750: 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69 36 34  int isHot,.  i64
f760: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20   journalSize,   
f770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
f780: 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f  e of the open jo
f790: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
f7a0: 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e  tes */.  u32 *pN
f7b0: 52 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rec,            
f7c0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
f7d0: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
f7e0: 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a  e nRec field */.
f7f0: 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20    u32 *pDbSize  
f800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f810: 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20  * OUT: Value of 
f820: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
f830: 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a  e size field */.
f840: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f860: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
f870: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
f880: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20  har aMagic[8];  
f890: 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74     /* A buffer t
f8a0: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
f8b0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
f8c0: 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
f8d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
f8e0: 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  set of journal h
f8f0: 65 61 64 65 72 20 62 65 69 6e 67 20 72 65 61 64  eader being read
f900: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
f910: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
f920: 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f  d) );      /* Jo
f930: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
f940: 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f  be open. */..  /
f950: 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e  * Advance Pager.
f960: 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68  journalOff to th
f970: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
f980: 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74  ext sector. If t
f990: 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
f9a0: 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c  file is too smal
f9b0: 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  l for there to b
f9c0: 65 20 61 20 68 65 61 64 65 72 20 73 74 6f 72 65  e a header store
f9d0: 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70  d at this.  ** p
f9e0: 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c  oint, return SQL
f9f0: 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20  ITE_DONE..  */. 
fa00: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fa10: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
fa20: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
fa30: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
fa40: 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c  urnalOff+JOURNAL
fa50: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
fa60: 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b  > journalSize ){
fa70: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fa80: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
fa90: 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
faa0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
fab0: 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 66  /* Read in the f
fac0: 69 72 73 74 20 38 20 62 79 74 65 73 20 6f 66 20  irst 8 bytes of 
fad0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
fae0: 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e  er. If they do n
faf0: 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68  ot match.  ** th
fb00: 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20  e  magic string 
fb10: 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74 61  found at the sta
fb20: 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e  rt of each journ
fb30: 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75 72  al header, retur
fb40: 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  n.  ** SQLITE_DO
fb50: 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  NE. If an IO err
fb60: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
fb70: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
fb80: 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a   Otherwise,.  **
fb90: 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20   proceed..  */. 
fba0: 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20 69 48   if( isHot || iH
fbb0: 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a  drOff!=pPager->j
fbc0: 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20  ournalHdr ){.   
fbd0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
fbe0: 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
fbf0: 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28   aMagic, sizeof(
fc00: 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66  aMagic), iHdrOff
fc10: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
fc20: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
fc30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
fc40: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
fc50: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
fc60: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30  zeof(aMagic))!=0
fc70: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
fc80: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
fc90: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
fca0: 61 64 20 74 68 65 20 66 69 72 73 74 20 74 68 72  ad the first thr
fcb0: 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73  ee 32-bit fields
fcc0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
fcd0: 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63  header: The nRec
fce0: 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65  .  ** field, the
fcf0: 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61   checksum-initia
fd00: 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61  lizer and the da
fd10: 74 61 62 61 73 65 20 73 69 7a 65 20 61 74 20 74  tabase size at t
fd20: 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
fd30: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
fd40: 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  . Return an erro
fd50: 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
fd60: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20  ng goes wrong.. 
fd70: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
fd80: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
fd90: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
fda0: 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e  d, iHdrOff+8, pN
fdb0: 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  Rec)).   || SQLI
fdc0: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
fdd0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fde0: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c  jfd, iHdrOff+12,
fdf0: 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   &pPager->cksumI
fe00: 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49  nit)).   || SQLI
fe10: 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
fe20: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
fe30: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c  jfd, iHdrOff+16,
fe40: 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a   pDbSize)).  ){.
fe50: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
fe60: 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
fe70: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
fe80: 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67 65  ){.    u32 iPage
fe90: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
fea0: 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65      /* Page-size
feb0: 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61   field of journa
fec0: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  l header */.    
fed0: 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  u32 iSectorSize;
fee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fef0: 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c  Sector-size fiel
ff00: 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d of journal hea
ff10: 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  der */..    /* R
ff20: 65 61 64 20 74 68 65 20 70 61 67 65 2d 73 69 7a  ead the page-siz
ff30: 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
ff40: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
ff50: 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20   fields. */.    
ff60: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
ff70: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
ff80: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
ff90: 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63 74 6f  rOff+20, &iSecto
ffa0: 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20  rSize)).     || 
ffb0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
ffc0: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
ffd0: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
ffe0: 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a 65 29  +24, &iPageSize)
fff0: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
10000 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
10010 0a 20 20 20 20 2f 2a 20 56 65 72 73 69 6f 6e 73  .    /* Versions
10020 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72   of SQLite prior
10030 20 74 6f 20 33 2e 35 2e 38 20 73 65 74 20 74 68   to 3.5.8 set th
10040 65 20 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c  e page-size fiel
10050 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
10060 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74  journal header t
10070 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  o zero. In this 
10080 63 61 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61  case, assume tha
10090 74 20 74 68 65 20 50 61 67 65 72 2e 70 61 67 65  t the Pager.page
100a0 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76 61 72 69  Size.    ** vari
100b0 61 62 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20  able is already 
100c0 73 65 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65  set to the corre
100d0 63 74 20 70 61 67 65 20 73 69 7a 65 2e 0a 20 20  ct page size..  
100e0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61    */.    if( iPa
100f0 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  geSize==0 ){.   
10100 20 20 20 69 50 61 67 65 53 69 7a 65 20 3d 20 70     iPageSize = p
10110 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
10120 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
10130 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61  heck that the va
10140 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74  lues read from t
10150 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
10160 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65   sector-size fie
10170 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77  lds.    ** are w
10180 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20  ithin range. To 
10190 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62  be 'in range', b
101a0 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20  oth values need 
101b0 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20  to be a power.  
101c0 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61    ** of two grea
101d0 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
101e0 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32 2c 20  l to 512 or 32, 
101f0 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20  and not greater 
10200 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20  than their .    
10210 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20 63 6f  ** respective co
10220 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d  mpile time maxim
10230 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a  um limits..    *
10240 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
10250 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20 20 20  ize<512         
10260 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63           || iSec
10270 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20 20 20  torSize<32.     
10280 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c  || iPageSize>SQL
10290 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
102a0 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65  E || iSectorSize
102b0 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45  >MAX_SECTOR_SIZE
102c0 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65  .     || ((iPage
102d0 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a  Size-1)&iPageSiz
102e0 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65  e)!=0   || ((iSe
102f0 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63  ctorSize-1)&iSec
10300 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20  torSize)!=0 .   
10310 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
10320 74 68 65 20 65 69 74 68 65 72 20 74 68 65 20 70  the either the p
10330 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74  age-size or sect
10340 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a  or-size in the j
10350 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73  ournal-header is
10360 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c   .      ** inval
10370 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f  id, then the pro
10380 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
10390 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  the journal-head
103a0 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20  er must have .  
103b0 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62      ** crashed b
103c0 65 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72  efore the header
103d0 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20   was synced. In 
103e0 74 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72  this case stop r
103f0 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a  eading .      **
10400 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
10410 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f  e here..      */
10420 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
10430 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
10440 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
10450 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f  the page-size to
10460 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
10470 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
10480 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20  ournal. .    ** 
10490 55 73 65 20 61 20 74 65 73 74 63 61 73 65 28 29  Use a testcase()
104a0 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73   macro to make s
104b0 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20  ure that malloc 
104c0 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a  failure within .
104d0 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50      ** PagerSetP
104e0 61 67 65 73 69 7a 65 28 29 20 69 73 20 74 65 73  agesize() is tes
104f0 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
10500 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
10510 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61  rSetPagesize(pPa
10520 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65 2c  ger, &iPageSize,
10530 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61   -1);.    testca
10540 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
10550 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64  K );..    /* Upd
10560 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20  ate the assumed 
10570 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d  sector-size to m
10580 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75  atch the value u
10590 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20 74  sed by .    ** t
105a0 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
105b0 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75  created this jou
105c0 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f  rnal. If this jo
105d0 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a 2a  urnal was.    **
105e0 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
105f0 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e  ocess other than
10600 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20   this one, then 
10610 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 20  this routine.   
10620 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c   ** is being cal
10630 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
10640 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
10650 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  . The local valu
10660 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67 65  e.    ** of Page
10670 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  r.sectorSize is 
10680 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  restored at the 
10690 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74  end of that rout
106a0 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ine..    */.    
106b0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
106c0 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65  ze = iSectorSize
106d0 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  ;.  }..  pPager-
106e0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a  >journalOff += J
106f0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
10700 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
10710 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  rc;.}.../*.** Wr
10720 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  ite the supplied
10730 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10740 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
10750 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
10760 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61  ager.** pPager a
10770 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
10780 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74  cation. The mast
10790 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
107a0 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74  must be the last
107b0 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65  .** thing writte
107c0 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66  n to a journal f
107d0 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
107e0 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  r is in full-syn
107f0 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a  c mode, the.** j
10800 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
10810 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63  riptor is advanc
10820 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ed to the next s
10830 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62  ector boundary b
10840 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e  efore.** anythin
10850 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68  g is written. Th
10860 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a  e format is:.**.
10870 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
10880 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a  PAGER_MJ_PGNO..*
10890 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20 4d  *   + N bytes: M
108a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
108b0 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38 2e  lename in utf-8.
108c0 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a  .**   + 4 bytes:
108d0 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d 61   N (length of ma
108e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
108f0 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20 6e  e in bytes, no n
10900 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e 0a  ul-terminator)..
10910 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a 20  **   + 4 bytes: 
10920 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  Master journal n
10930 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ame checksum..**
10940 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a     + 8 bytes: aJ
10950 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
10960 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
10970 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65  journal page che
10980 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d  cksum is the sum
10990 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e   of the bytes in
109a0 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a   the master.** j
109b0 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68 65  ournal name, whe
109c0 72 65 20 65 61 63 68 20 62 79 74 65 20 69 73 20  re each byte is 
109d0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
109e0 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69 6e   signed 8-bit in
109f0 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  teger..**.** If 
10a00 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c  zMaster is a NUL
10a10 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72  L pointer (occur
10a20 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64  s for a single d
10a30 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
10a40 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63  ion), .** this c
10a50 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
10a60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
10a70 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
10a80 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
10a90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
10aa0 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ter){.  int rc; 
10ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
10ad0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
10ae0 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20   nMaster;       
10af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10b00 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69 6e   Length of strin
10b10 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 69  g zMaster */.  i
10b20 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
10b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b40 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61  /* Offset of hea
10b50 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  der in journal f
10b60 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e  ile */.  i64 jrn
10b70 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  lSize;          
10b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
10b90 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e of journal fil
10ba0 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20 75  e on disk */.  u
10bb0 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20 20  32 cksum = 0;   
10bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bd0 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20 73  /* Checksum of s
10be0 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f  tring zMaster */
10bf0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
10c00 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d 3d 30  er->setMaster==0
10c10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
10c20 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
10c30 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 7a 4d  r) );..  if( !zM
10c40 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 70 50 61  aster .   || pPa
10c50 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
10c60 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
10c70 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c  ODE_MEMORY .   |
10c80 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  | !isOpen(pPager
10c90 2d 3e 6a 66 64 29 0a 20 20 29 7b 0a 20 20 20 20  ->jfd).  ){.    
10ca0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10cb0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
10cc0 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20  setMaster = 1;. 
10cd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10ce0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70  >journalHdr <= p
10cf0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10d00 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75  f );..  /* Calcu
10d10 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20  late the length 
10d20 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74 68 65  in bytes and the
10d30 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61   checksum of zMa
10d40 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d  ster */.  for(nM
10d50 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72  aster=0; zMaster
10d60 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74  [nMaster]; nMast
10d70 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d  er++){.    cksum
10d80 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73   += zMaster[nMas
10d90 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ter];.  }..  /* 
10da0 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
10db0 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f  mode, advance to
10dc0 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73   the next disk s
10dd0 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69  ector before wri
10de0 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61  ting.  ** the ma
10df0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10e00 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61  e. This is in ca
10e10 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
10e20 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
10e30 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
10e40 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
10e50 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20  n synced..  */. 
10e60 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
10e70 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61  lSync ){.    pPa
10e80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10e90 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
10ea0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  et(pPager);.  }.
10eb0 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67    iHdrOff = pPag
10ec0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
10ed0 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
10ee0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64  master journal d
10ef0 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ata to the end o
10f00 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
10f10 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65  le. If.  ** an e
10f20 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
10f30 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f  urn the error co
10f40 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  de to the caller
10f50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20  ..  */.  if( (0 
10f60 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
10f70 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
10f80 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52  , iHdrOff, PAGER
10f90 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
10fa0 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20  ))).   || (0 != 
10fb0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57  (rc = sqlite3OsW
10fc0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
10fd0 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74  , zMaster, nMast
10fe0 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29  er, iHdrOff+4)))
10ff0 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63  .   || (0 != (rc
11000 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
11010 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
11020 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e  Off+4+nMaster, n
11030 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20  Master))).   || 
11040 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
11050 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
11060 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  jfd, iHdrOff+4+n
11070 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29  Master+4, cksum)
11080 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
11090 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
110a0 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
110b0 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
110c0 38 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  8,.             
110d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110e0 20 20 20 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d      iHdrOff+4+nM
110f0 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a  aster+8))).  ){.
11100 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
11110 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
11120 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73  rnalOff += (nMas
11130 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49  ter+20);..  /* I
11140 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
11150 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72  n peristent-jour
11160 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  nal mode, then t
11170 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a  he physical .  *
11180 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d  * journal-file m
11190 61 79 20 65 78 74 65 6e 64 20 70 61 73 74 20 74  ay extend past t
111a0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
111b0 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
111c0 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74  e.  ** and 8 byt
111d0 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61  es of magic data
111e0 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f   just written to
111f0 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20   the file. This 
11200 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f  is .  ** dangero
11210 75 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63  us because the c
11220 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ode to rollback 
11230 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
11240 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74  le.  ** will not
11250 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64   be able to find
11260 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
11270 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65  nal name to dete
11280 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74  rmine .  ** whet
11290 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
112a0 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a  ournal is hot. .
112b0 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73    **.  ** Easies
112c0 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e  t thing to do in
112d0 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69   this scenario i
112e0 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
112f0 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
11300 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75  file to the requ
11310 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20  ired size..  */ 
11320 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
11330 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  ==(rc = sqlite3O
11340 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
11350 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65  ->jfd, &jrnlSize
11360 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a  )).   && jrnlSiz
11370 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e>pPager->journa
11380 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63  lOff.  ){.    rc
11390 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
113a0 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
113b0 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
113c0 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lOff);.  }.  ret
113d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
113e0 20 44 69 73 63 61 72 64 20 74 68 65 20 65 6e 74   Discard the ent
113f0 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
11400 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  the in-memory pa
11410 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73 74 61  ge-cache..*/.sta
11420 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
11430 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
11440 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 69  er){.  pPager->i
11450 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 0a 20  DataVersion++;. 
11460 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
11470 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42  start(pPager->pB
11480 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69 74 65  ackup);.  sqlite
11490 33 50 63 61 63 68 65 43 6c 65 61 72 28 70 50 61  3PcacheClear(pPa
114a0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d  ger->pPCache);.}
114b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
114c0 68 65 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61  he pPager->iData
114d0 56 65 72 73 69 6f 6e 20 76 61 6c 75 65 0a 2a 2f  Version value.*/
114e0 0a 75 33 32 20 73 71 6c 69 74 65 33 50 61 67 65  .u32 sqlite3Page
114f0 72 44 61 74 61 56 65 72 73 69 6f 6e 28 50 61 67  rDataVersion(Pag
11500 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61  er *pPager){.  a
11510 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
11520 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50 45 4e  State>PAGER_OPEN
11530 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61   );.  return pPa
11540 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f  ger->iDataVersio
11550 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  n;.}../*.** Free
11560 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20   all structures 
11570 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
11580 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20  vepoint[] array 
11590 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20  and set both.** 
115a0 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
115b0 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65   and Pager.nSave
115c0 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43  point to zero. C
115d0 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75  lose the sub-jou
115e0 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73  rnal.** if it is
115f0 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
11600 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
11610 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f  clusive mode..*/
11620 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
11630 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
11640 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
11650 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  {.  int ii;     
11660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
11670 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e  rator for loopin
11680 67 20 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e  g through Pager.
11690 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20  aSavepoint */.  
116a0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
116b0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
116c0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   ii++){.    sqli
116d0 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
116e0 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
116f0 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  int[ii].pInSavep
11700 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  oint);.  }.  if(
11710 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
11720 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74  iveMode || sqlit
11730 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65 6d  e3JournalIsInMem
11740 6f 72 79 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  ory(pPager->sjfd
11750 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
11760 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
11770 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sjfd);.  }.  sql
11780 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
11790 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  ->aSavepoint);. 
117a0 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
117b0 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  int = 0;.  pPage
117c0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->nSavepoint = 
117d0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75  0;.  pPager->nSu
117e0 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  bRec = 0;.}../*.
117f0 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74 20 6e  ** Set the bit n
11800 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68  umber pgno in th
11810 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
11820 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a  .pInSavepoint .*
11830 2a 20 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c  * bitvecs of all
11840 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
11850 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
11860 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
11870 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  .** or SQLITE_NO
11880 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  MEM if a malloc 
11890 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a  failure occurs..
118a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
118b0 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
118c0 65 63 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ecs(Pager *pPage
118d0 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
118e0 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
118f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
11900 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
11910 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
11920 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73  OK;       /* Res
11930 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66  ult code */..  f
11940 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
11950 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
11960 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72  ii++){.    Pager
11970 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26  Savepoint *p = &
11980 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
11990 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20  nt[ii];.    if( 
119a0 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29  pgno<=p->nOrig )
119b0 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71  {.      rc |= sq
119c0 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
119d0 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20  ->pInSavepoint, 
119e0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73  pgno);.      tes
119f0 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
11a00 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
11a10 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
11a20 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51  ITE_OK || rc==SQ
11a30 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
11a40 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
11a50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
11a60 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
11a70 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61   no-op if the pa
11a80 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
11a90 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74  ive mode and not
11aa0 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52 52 4f 52  .** in the ERROR
11ab0 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73   state. Otherwis
11ac0 65 2c 20 69 74 20 73 77 69 74 63 68 65 73 20 74  e, it switches t
11ad0 68 65 20 70 61 67 65 72 20 74 6f 20 50 41 47 45  he pager to PAGE
11ae0 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e  R_OPEN.** state.
11af0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
11b00 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
11b10 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
11b20 6f 64 65 2c 20 74 68 65 20 64 61 74 61 62 61 73  ode, the databas
11b30 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d  e file is.** com
11b40 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64  pletely unlocked
11b50 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  . If the file is
11b60 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68   unlocked and th
11b70 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f  e file-system do
11b80 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69  es.** not exhibi
11b90 74 20 74 68 65 20 55 4e 44 45 4c 45 54 41 42 4c  t the UNDELETABL
11ba0 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70  E_WHEN_OPEN prop
11bb0 65 72 74 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61  erty, the journa
11bc0 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f  l file is.** clo
11bd0 73 65 64 20 28 69 66 20 69 74 20 69 73 20 6f 70  sed (if it is op
11be0 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  en)..**.** If th
11bf0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 45 52  e pager is in ER
11c00 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74  ROR state when t
11c10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
11c20 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20  called, the .** 
11c30 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
11c40 70 61 67 65 72 20 63 61 63 68 65 20 61 72 65 20  pager cache are 
11c50 64 69 73 63 61 72 64 65 64 20 62 65 66 6f 72 65  discarded before
11c60 20 73 77 69 74 63 68 69 6e 67 20 62 61 63 6b 20   switching back 
11c70 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20  to .** the OPEN 
11c80 73 74 61 74 65 2e 20 52 65 67 61 72 64 6c 65 73  state. Regardles
11c90 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65  s of whether the
11ca0 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63   pager is in exc
11cb0 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f  lusive-mode.** o
11cc0 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e  r not, any journ
11cd0 61 6c 20 66 69 6c 65 20 6c 65 66 74 20 69 6e 20  al file left in 
11ce0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
11cf0 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65 64 0a  will be treated.
11d00 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72  ** as a hot-jour
11d10 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62  nal and rolled b
11d20 61 63 6b 20 74 68 65 20 6e 65 78 74 20 74 69 6d  ack the next tim
11d30 65 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  e a read-transac
11d40 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65  tion.** is opene
11d50 64 20 28 62 79 20 74 68 69 73 20 6f 72 20 62 79  d (by this or by
11d60 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65   any other conne
11d70 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69  ction)..*/.stati
11d80 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c  c void pager_unl
11d90 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
11da0 72 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  r){..  assert( p
11db0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
11dc0 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 20  AGER_READER .   
11dd0 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
11de0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
11df0 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  N .       || pPa
11e00 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
11e10 45 52 5f 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a  ER_ERROR .  );..
11e20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
11e30 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
11e40 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
11e50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
11e60 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 41   = 0;.  releaseA
11e70 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
11e80 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 61 67  ger);..  if( pag
11e90 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
11ea0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
11eb0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
11ec0 6a 66 64 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  jfd) );.    sqli
11ed0 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
11ee0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
11ef0 3e 70 57 61 6c 29 3b 0a 20 20 20 20 70 50 61 67  >pWal);.    pPag
11f00 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
11f10 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65  ER_OPEN;.  }else
11f20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
11f30 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
11f40 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20     int rc;      
11f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f60 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 72   /* Error code r
11f70 65 74 75 72 6e 65 64 20 62 79 20 70 61 67 65 72  eturned by pager
11f80 55 6e 6c 6f 63 6b 44 62 28 29 20 2a 2f 0a 20 20  UnlockDb() */.  
11f90 20 20 69 6e 74 20 69 44 63 20 3d 20 69 73 4f 70    int iDc = isOp
11fa0 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 3f 73  en(pPager->fd)?s
11fb0 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
11fc0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
11fd0 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20  ager->fd):0;..  
11fe0 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 65 72    /* If the oper
11ff0 61 74 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70  ating system sup
12000 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66  port deletion of
12010 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74 68 65   open files, the
12020 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74  n.    ** close t
12030 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
12040 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68  when dropping th
12050 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e  e database lock.
12060 20 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20    Otherwise.    
12070 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65  ** another conne
12080 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e  ction with journ
12090 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d  al_mode=delete m
120a0 69 67 68 74 20 64 65 6c 65 74 65 20 74 68 65 20  ight delete the 
120b0 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20  file.    ** out 
120c0 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20  from under us.. 
120d0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
120e0 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
120f0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20  MODE_MEMORY   & 
12100 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
12110 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
12120 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20  NALMODE_OFF     
12130 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
12140 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
12150 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20  OURNALMODE_WAL  
12160 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20      & 5)!=1 );. 
12170 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
12180 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
12190 4c 45 54 45 20 20 20 26 20 35 29 21 3d 31 20 29  LETE   & 5)!=1 )
121a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
121b0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
121c0 5f 54 52 55 4e 43 41 54 45 20 26 20 35 29 3d 3d  _TRUNCATE & 5)==
121d0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
121e0 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
121f0 4f 44 45 5f 50 45 52 53 49 53 54 20 20 26 20 35  ODE_PERSIST  & 5
12200 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20  )==1 );.    if( 
12210 30 3d 3d 28 69 44 63 20 26 20 53 51 4c 49 54 45  0==(iDc & SQLITE
12220 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
12230 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20  LE_WHEN_OPEN).  
12240 20 20 20 7c 7c 20 31 21 3d 28 70 50 61 67 65 72     || 1!=(pPager
12250 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20  ->journalMode & 
12260 35 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  5).    ){.      
12270 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
12280 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
12290 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
122a0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
122b0 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e  e ERROR state an
122c0 64 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e  d the call to un
122d0 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
122e0 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 66 61  e.    ** file fa
122f0 69 6c 73 2c 20 73 65 74 20 74 68 65 20 63 75 72  ils, set the cur
12300 72 65 6e 74 20 6c 6f 63 6b 20 74 6f 20 55 4e 4b  rent lock to UNK
12310 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74  NOWN_LOCK. See t
12320 68 65 20 63 6f 6d 6d 65 6e 74 0a 20 20 20 20 2a  he comment.    *
12330 2a 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  * above the #def
12340 69 6e 65 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e 5f  ine for UNKNOWN_
12350 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c  LOCK for an expl
12360 61 6e 61 74 69 6f 6e 20 6f 66 20 77 68 79 20 74  anation of why t
12370 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 6e 65  his.    ** is ne
12380 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a  cessary..    */.
12390 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e      rc = pagerUn
123a0 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 4e  lockDb(pPager, N
123b0 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  O_LOCK);.    if(
123c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
123d0 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
123e0 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 7b  ==PAGER_ERROR ){
123f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
12400 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c  Lock = UNKNOWN_L
12410 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  OCK;.    }..    
12420 2f 2a 20 54 68 65 20 70 61 67 65 72 20 73 74 61  /* The pager sta
12430 74 65 20 6d 61 79 20 62 65 20 63 68 61 6e 67 65  te may be change
12440 64 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 52 52  d from PAGER_ERR
12450 4f 52 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e  OR to PAGER_OPEN
12460 20 68 65 72 65 0a 20 20 20 20 2a 2a 20 77 69 74   here.    ** wit
12470 68 6f 75 74 20 63 6c 65 61 72 69 6e 67 20 74 68  hout clearing th
12480 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68  e error code. Th
12490 69 73 20 69 73 20 69 6e 74 65 6e 74 69 6f 6e 61  is is intentiona
124a0 6c 20 2d 20 74 68 65 20 65 72 72 6f 72 0a 20 20  l - the error.  
124b0 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 63 6c 65    ** code is cle
124c0 61 72 65 64 20 61 6e 64 20 74 68 65 20 63 61 63  ared and the cac
124d0 68 65 20 72 65 73 65 74 20 69 6e 20 74 68 65 20  he reset in the 
124e0 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 20  block below..   
124f0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
12500 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
12510 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
12520 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
12530 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
12540 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
12550 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  0;.    pPager->e
12560 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
12570 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  EN;.  }..  /* If
12580 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69   Pager.errCode i
12590 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65  s set, the conte
125a0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
125b0 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65   cache cannot be
125c0 0a 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e  .  ** trusted. N
125d0 6f 77 20 74 68 61 74 20 74 68 65 72 65 20 61 72  ow that there ar
125e0 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
125f0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
12600 68 65 20 70 61 67 65 72 2c 0a 20 20 2a 2a 20 69  he pager,.  ** i
12610 74 20 63 61 6e 20 73 61 66 65 6c 79 20 6d 6f 76  t can safely mov
12620 65 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f  e back to PAGER_
12630 4f 50 45 4e 20 73 74 61 74 65 2e 20 54 68 69 73  OPEN state. This
12640 20 68 61 70 70 65 6e 73 20 69 6e 20 62 6f 74 68   happens in both
12650 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e 64  .  ** normal and
12660 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69   exclusive-locki
12670 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ng mode..  */.  
12680 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
12690 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
126a0 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a  OK || !MEMDB );.
126b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
126c0 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28  rCode ){.    if(
126d0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
126e0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 61  e==0 ){.      pa
126f0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
12700 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
12710 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
12720 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
12730 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
12740 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 7d 65 6c  ER_OPEN;.    }el
12750 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72  se{.      pPager
12760 2d 3e 65 53 74 61 74 65 20 3d 20 28 69 73 4f 70  ->eState = (isOp
12770 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
12780 3f 20 50 41 47 45 52 5f 4f 50 45 4e 20 3a 20 50  ? PAGER_OPEN : P
12790 41 47 45 52 5f 52 45 41 44 45 52 29 3b 0a 20 20  AGER_READER);.  
127a0 20 20 7d 0a 20 20 20 20 69 66 28 20 55 53 45 46    }.    if( USEF
127b0 45 54 43 48 28 70 50 61 67 65 72 29 20 29 20 73  ETCH(pPager) ) s
127c0 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
127d0 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30  pPager->fd, 0, 0
127e0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  );.    pPager->e
127f0 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  rrCode = SQLITE_
12800 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  OK;.  }..  pPage
12810 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
12820 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0;.  pPager->jou
12830 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70  rnalHdr = 0;.  p
12840 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
12850 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
12860 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
12870 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20  called whenever 
12880 61 6e 20 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c  an IOERR or FULL
12890 20 65 72 72 6f 72 20 74 68 61 74 20 72 65 71 75   error that requ
128a0 69 72 65 73 0a 2a 2a 20 74 68 65 20 70 61 67 65  ires.** the page
128b0 72 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20  r to transition 
128c0 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
128d0 74 61 74 65 20 6d 61 79 20 61 68 76 65 20 6f 63  tate may ahve oc
128e0 63 75 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66  curred..** The f
128f0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
12900 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
12910 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72  e pager structur
12920 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a  e, the second .*
12930 2a 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65  * the error-code
12940 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74   about to be ret
12950 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72  urned by a pager
12960 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54   API function. T
12970 68 65 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74  he .** value ret
12980 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20  urned is a copy 
12990 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  of the second ar
129a0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
129b0 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  unction. .**.** 
129c0 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
129d0 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45  gument is SQLITE
129e0 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f  _FULL, SQLITE_IO
129f0 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ERR or one of th
12a00 65 0a 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d 63  e.** IOERR sub-c
12a10 6f 64 65 73 2c 20 74 68 65 20 70 61 67 65 72 20  odes, the pager 
12a20 65 6e 74 65 72 73 20 74 68 65 20 45 52 52 4f 52  enters the ERROR
12a30 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 65   state and the e
12a40 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20  rror code.** is 
12a50 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e  stored in Pager.
12a60 65 72 72 43 6f 64 65 2e 20 57 68 69 6c 65 20 74  errCode. While t
12a70 68 65 20 70 61 67 65 72 20 72 65 6d 61 69 6e 73  he pager remains
12a80 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
12a90 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f  ate,.** all majo
12aa0 72 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74  r API calls on t
12ab0 68 65 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d  he Pager will im
12ac0 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e  mediately return
12ad0 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a   Pager.errCode..
12ae0 2a 2a 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52 20  **.** The ERROR 
12af0 73 74 61 74 65 20 69 6e 64 69 63 61 74 65 73 20  state indicates 
12b00 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
12b10 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63  s of the pager-c
12b20 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20  ache .** cannot 
12b30 62 65 20 74 72 75 73 74 65 64 2e 20 54 68 69 73  be trusted. This
12b40 20 73 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c   state can be cl
12b50 65 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74  eared by complet
12b60 65 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a  ely discarding .
12b70 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ** the contents 
12b80 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
12b90 68 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  he. If a transac
12ba0 74 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20  tion was active 
12bb0 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73  when.** the pers
12bc0 69 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63  istent error occ
12bd0 75 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20  urred, then the 
12be0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
12bf0 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20   may need.** to 
12c00 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72  be replayed to r
12c10 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65  estore the conte
12c20 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
12c30 61 73 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a  ase file (as if.
12c40 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f 74  ** it were a hot
12c50 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74  -journal)..*/.st
12c60 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
12c70 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  rror(Pager *pPag
12c80 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69  er, int rc){.  i
12c90 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78  nt rc2 = rc & 0x
12ca0 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  ff;.  assert( rc
12cb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  ==SQLITE_OK || !
12cc0 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
12cd0 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  t(.       pPager
12ce0 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
12cf0 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20  E_FULL ||.      
12d00 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12d10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20  ==SQLITE_OK ||. 
12d20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65        (pPager->e
12d30 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d  rrCode & 0xff)==
12d40 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29  SQLITE_IOERR.  )
12d50 3b 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c  ;.  if( rc2==SQL
12d60 49 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d  ITE_FULL || rc2=
12d70 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b  =SQLITE_IOERR ){
12d80 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
12d90 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 70  Code = rc;.    p
12da0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
12db0 50 41 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20 7d  PAGER_ERROR;.  }
12dc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12dd0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
12de0 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
12df0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
12e00 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  Page);../*.** Th
12e10 65 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  e write transact
12e20 69 6f 6e 20 6f 70 65 6e 20 6f 6e 20 70 50 61 67  ion open on pPag
12e30 65 72 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d  er is being comm
12e40 69 74 74 65 64 20 28 62 43 6f 6d 6d 69 74 3d 3d  itted (bCommit==
12e50 31 29 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 65 64 20  1).** or rolled 
12e60 62 61 63 6b 20 28 62 43 6f 6d 6d 69 74 3d 3d 30  back (bCommit==0
12e70 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  )..**.** Return 
12e80 54 52 55 45 20 69 66 20 61 6e 64 20 6f 6e 6c 79  TRUE if and only
12e90 20 69 66 20 61 6c 6c 20 64 69 72 74 79 20 70 61   if all dirty pa
12ea0 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20 66 6c  ges should be fl
12eb0 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ushed to disk..*
12ec0 2a 0a 2a 2a 20 52 75 6c 65 73 3a 0a 2a 2a 0a 2a  *.** Rules:.**.*
12ed0 2a 20 20 20 2a 20 20 46 6f 72 20 6e 6f 6e 2d 54  *   *  For non-T
12ee0 45 4d 50 20 64 61 74 61 62 61 73 65 73 2c 20 61  EMP databases, a
12ef0 6c 77 61 79 73 20 73 79 6e 63 20 74 6f 20 64 69  lways sync to di
12f00 73 6b 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  sk.  This is nec
12f10 65 73 73 61 72 79 0a 2a 2a 20 20 20 20 20 20 66  essary.**      f
12f20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  or transactions 
12f30 74 6f 20 62 65 20 64 75 72 61 62 6c 65 2e 0a 2a  to be durable..*
12f40 2a 0a 2a 2a 20 20 20 2a 20 20 53 79 6e 63 20 54  *.**   *  Sync T
12f50 45 4d 50 20 64 61 74 61 62 61 73 65 20 6f 6e 6c  EMP database onl
12f60 79 20 6f 6e 20 61 20 43 4f 4d 4d 49 54 20 28 6e  y on a COMMIT (n
12f70 6f 74 20 61 20 52 4f 4c 4c 42 41 43 4b 29 20 77  ot a ROLLBACK) w
12f80 68 65 6e 20 74 68 65 20 62 61 63 6b 69 6e 67 0a  hen the backing.
12f90 2a 2a 20 20 20 20 20 20 66 69 6c 65 20 68 61 73  **      file has
12fa0 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 61 6c   been created al
12fb0 72 65 61 64 79 20 28 76 69 61 20 61 20 73 70 69  ready (via a spi
12fc0 6c 6c 20 6f 6e 20 70 61 67 65 72 53 74 72 65 73  ll on pagerStres
12fd0 73 28 29 29 20 61 6e 64 0a 2a 2a 20 20 20 20 20  s()) and.**     
12fe0 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   when the number
12ff0 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20   of dirty pages 
13000 69 6e 20 6d 65 6d 6f 72 79 20 65 78 63 65 65 64  in memory exceed
13010 73 20 32 35 25 20 6f 66 20 74 68 65 20 74 6f 74  s 25% of the tot
13020 61 6c 0a 2a 2a 20 20 20 20 20 20 63 61 63 68 65  al.**      cache
13030 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
13040 20 69 6e 74 20 70 61 67 65 72 46 6c 75 73 68 4f   int pagerFlushO
13050 6e 43 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70  nCommit(Pager *p
13060 50 61 67 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d  Pager, int bComm
13070 69 74 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  it){.  if( pPage
13080 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29  r->tempFile==0 )
13090 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
130a0 20 21 62 43 6f 6d 6d 69 74 20 29 20 72 65 74 75   !bCommit ) retu
130b0 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 69 73 4f  rn 0;.  if( !isO
130c0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
130d0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65  ) return 0;.  re
130e0 74 75 72 6e 20 28 73 71 6c 69 74 65 33 50 43 61  turn (sqlite3PCa
130f0 63 68 65 50 65 72 63 65 6e 74 44 69 72 74 79 28  chePercentDirty(
13100 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
13110 3e 3d 32 35 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >=25);.}../*.** 
13120 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64  This routine end
13130 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  s a transaction.
13140 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   A transaction i
13150 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64 20  s usually ended 
13160 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61 20  by .** either a 
13170 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c  COMMIT or a ROLL
13180 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20  BACK operation. 
13190 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79  This routine may
131a0 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61   be called .** a
131b0 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  fter rollback of
131c0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20   a hot-journal, 
131d0 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  or if an error o
131e0 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e  ccurs while open
131f0 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ing.** the journ
13200 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74 69  al file or writi
13210 6e 67 20 74 68 65 20 76 65 72 79 20 66 69 72 73  ng the very firs
13220 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  t journal-header
13230 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61 73   of a.** databas
13240 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
13250 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
13260 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
13270 65 64 20 69 6e 20 50 41 47 45 52 5f 45 52 52 4f  ed in PAGER_ERRO
13280 52 20 73 74 61 74 65 2e 20 49 66 20 69 74 20 69  R state. If it i
13290 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50  s called.** in P
132a0 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50 41 47  AGER_NONE or PAG
132b0 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 20  ER_SHARED state 
132c0 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68 65 6c  and the lock hel
132d0 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65 78 63  d is less.** exc
132e0 6c 75 73 69 76 65 20 74 68 61 6e 20 61 20 52 45  lusive than a RE
132f0 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69 74 20  SERVED lock, it 
13300 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
13310 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79  * Otherwise, any
13320 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
13330 74 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e  ts are released.
13340 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
13350 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
13360 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22  en, then it is "
13370 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65  finalized". Once
13380 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66   a journal .** f
13390 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e  ile has been fin
133a0 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74  alized it is not
133b0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
133c0 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b   it to roll back
133d0 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69   a .** transacti
133e0 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20  on. Nor will it 
133f0 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  be considered to
13400 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   be a hot-journa
13410 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20  l by this.** or 
13420 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62 61  any other databa
13430 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45  se connection. E
13440 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75  xactly how a jou
13450 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65  rnal is finalize
13460 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20  d.** depends on 
13470 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
13480 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
13490 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
134a0 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65   mode and.** the
134b0 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c   current journal
134c0 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75  -mode (Pager.jou
134d0 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c  rnalMode value),
134e0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
134f0 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
13500 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20  ==MEMORY.**     
13510 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  Journal file des
13520 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c  criptor is simpl
13530 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64  y closed. This d
13540 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20  estroys an .**  
13550 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75     in-memory jou
13560 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  rnal..**.**   jo
13570 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43  urnalMode==TRUNC
13580 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ATE.**     Journ
13590 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63  al file is trunc
135a0 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74  ated to zero byt
135b0 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
135c0 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
135d0 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20  =PERSIST.**     
135e0 54 68 65 20 66 69 72 73 74 20 32 38 20 62 79 74  The first 28 byt
135f0 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  es of the journa
13600 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65  l file are zeroe
13610 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61  d. This invalida
13620 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  tes.**     the f
13630 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
13640 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c  der in the file,
13650 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65   and hence the e
13660 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ntire journal.**
13670 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e       file. An in
13680 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69  valid journal fi
13690 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c  le cannot be rol
136a0 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
136b0 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44    journalMode==D
136c0 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65  ELETE.**     The
136d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
136e0 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65   closed and dele
136f0 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ted using sqlite
13700 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a  3OsDelete()..**.
13710 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20 70 61  **     If the pa
13720 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
13730 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
13740 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66  , this method of
13750 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20   finalizing.**  
13760 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66     the journal f
13770 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73 65  ile is never use
13780 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74  d. Instead, if t
13790 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69  he journalMode i
137a0 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20  s.**     DELETE 
137b0 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
137c0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
137d0 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64  de, the method d
137e0 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a  escribed under.*
137f0 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  *     journalMod
13800 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75 73  e==PERSIST is us
13810 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
13820 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72  * After the jour
13830 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  nal is finalized
13840 2c 20 74 68 65 20 70 61 67 65 72 20 6d 6f 76 65  , the pager move
13850 73 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44 45  s to PAGER_READE
13860 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66 20 72  R state..** If r
13870 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78  unning in non-ex
13880 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61 63 6b  clusive rollback
13890 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20   mode, the lock 
138a0 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 0a  on the file is .
138b0 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f  ** downgraded to
138c0 20 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a   a SHARED_LOCK..
138d0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
138e0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
138f0 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  o error occurs. 
13900 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
13910 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e 79  rs during.** any
13920 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72 61   of the IO opera
13930 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69 7a  tions to finaliz
13940 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
13950 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68 65  le or unlock the
13960 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68 65  .** database the
13970 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  n the IO error c
13980 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
13990 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66 20  to the user. If 
139a0 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  the .** operatio
139b0 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  n to finalize th
139c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
139d0 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ails, then the c
139e0 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72 69  ode still.** tri
139f0 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65  es to unlock the
13a00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
13a10 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69  f not in exclusi
13a20 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 0a  ve mode. If the.
13a30 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74  ** unlock operat
13a40 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65 6c  ion fails as wel
13a50 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  l, then the firs
13a60 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 6c  t error code rel
13a70 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66  ated.** to the f
13a80 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f 75  irst error encou
13a90 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75 72  ntered (the jour
13aa0 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e  nal finalization
13ab0 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74 75   one) is.** retu
13ac0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
13ad0 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  int pager_end_tr
13ae0 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20  ansaction(Pager 
13af0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73  *pPager, int has
13b00 4d 61 73 74 65 72 2c 20 69 6e 74 20 62 43 6f 6d  Master, int bCom
13b10 6d 69 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  mit){.  int rc =
13b20 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
13b30 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66   /* Error code f
13b40 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61  rom journal fina
13b50 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69  lization operati
13b60 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20  on */.  int rc2 
13b70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
13b80 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66   /* Error code f
13b90 72 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f  rom db file unlo
13ba0 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  ck operation */.
13bb0 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67  .  /* Do nothing
13bc0 20 69 66 20 74 68 65 20 70 61 67 65 72 20 64 6f   if the pager do
13bd0 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 6f  es not have an o
13be0 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
13bf0 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20 61 74  ction.  ** or at
13c00 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45   least a RESERVE
13c10 44 20 6c 6f 63 6b 2e 20 54 68 69 73 20 66 75 6e  D lock. This fun
13c20 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c  ction may be cal
13c30 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 0a 20  led when there. 
13c40 20 2a 2a 20 69 73 20 6e 6f 20 77 72 69 74 65 2d   ** is no write-
13c50 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
13c60 76 65 20 62 75 74 20 61 20 52 45 53 45 52 56 45  ve but a RESERVE
13c70 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
13c80 6b 20 69 73 0a 20 20 2a 2a 20 68 65 6c 64 20 75  k is.  ** held u
13c90 6e 64 65 72 20 74 77 6f 20 63 69 72 63 75 6d 73  nder two circums
13ca0 74 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a  tances:.  **.  *
13cb0 2a 20 20 20 31 2e 20 41 66 74 65 72 20 61 20 73  *   1. After a s
13cc0 75 63 63 65 73 73 66 75 6c 20 68 6f 74 2d 6a 6f  uccessful hot-jo
13cd0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20  urnal rollback, 
13ce0 69 74 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74  it is called wit
13cf0 68 0a 20 20 2a 2a 20 20 20 20 20 20 65 53 74 61  h.  **      eSta
13d00 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45 20 61  te==PAGER_NONE a
13d10 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  nd eLock==EXCLUS
13d20 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20  IVE_LOCK..  **. 
13d30 20 2a 2a 20 20 20 32 2e 20 49 66 20 61 20 63 6f   **   2. If a co
13d40 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6c 6f  nnection with lo
13d50 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
13d60 73 69 76 65 20 68 6f 6c 64 69 6e 67 20 61 6e 20  sive holding an 
13d70 45 58 43 4c 55 53 49 56 45 20 0a 20 20 2a 2a 20  EXCLUSIVE .  ** 
13d80 20 20 20 20 20 6c 6f 63 6b 20 73 77 69 74 63 68       lock switch
13d90 65 73 20 62 61 63 6b 20 74 6f 20 6c 6f 63 6b 69  es back to locki
13da0 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61  ng_mode=normal a
13db0 6e 64 20 74 68 65 6e 20 65 78 65 63 75 74 65 73  nd then executes
13dc0 20 61 0a 20 20 2a 2a 20 20 20 20 20 20 72 65 61   a.  **      rea
13dd0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  d-transaction, t
13de0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
13df0 63 61 6c 6c 65 64 20 77 69 74 68 20 65 53 74 61  called with eSta
13e00 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te==PAGER_READER
13e10 20 0a 20 20 2a 2a 20 20 20 20 20 20 61 6e 64 20   .  **      and 
13e20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
13e30 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 72  _LOCK when the r
13e40 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
13e50 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a  is closed..  */.
13e60 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
13e70 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
13e80 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
13e90 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
13ea0 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b  !=PAGER_ERROR );
13eb0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
13ec0 53 74 61 74 65 3c 50 41 47 45 52 5f 57 52 49 54  State<PAGER_WRIT
13ed0 45 52 5f 4c 4f 43 4b 45 44 20 26 26 20 70 50 61  ER_LOCKED && pPa
13ee0 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53 45 52  ger->eLock<RESER
13ef0 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  VED_LOCK ){.    
13f00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13f10 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65  ;.  }..  release
13f20 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50  AllSavepoints(pP
13f30 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  ager);.  assert(
13f40 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
13f50 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  jfd) || pPager->
13f60 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
13f70 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
13f80 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
13f90 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
13fa0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
13fb0 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69  ;..    /* Finali
13fc0 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
13fd0 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ile. */.    if( 
13fe0 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73  sqlite3JournalIs
13ff0 49 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d  InMemory(pPager-
14000 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 2f  >jfd) ){.      /
14010 2a 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72  * assert( pPager
14020 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
14030 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
14040 5f 4d 45 4d 4f 52 59 20 29 3b 20 2a 2f 0a 20 20  _MEMORY ); */.  
14050 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
14060 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
14070 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
14080 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
14090 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
140a0 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29  LMODE_TRUNCATE )
140b0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
140c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
140d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
140e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
140f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14100 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14110 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
14120 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  >jfd, 0);.      
14130 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14140 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 66  _OK && pPager->f
14150 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  ullSync ){.     
14160 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
14170 65 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 73  e the new file s
14180 69 7a 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  ize is written i
14190 6e 74 6f 20 74 68 65 20 69 6e 6f 64 65 20 72 69  nto the inode ri
141a0 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 20 20  ght away..      
141b0 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65      ** Otherwise
141c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67   the journal mig
141d0 68 74 20 72 65 73 75 72 72 65 63 74 20 66 6f 6c  ht resurrect fol
141e0 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 6c  lowing a power l
141f0 6f 73 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20  oss and.        
14200 20 20 2a 2a 20 63 61 75 73 65 20 74 68 65 20 6c    ** cause the l
14210 61 73 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ast transaction 
14220 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20 53  to roll back.  S
14230 65 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ee.          ** 
14240 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61  https://bugzilla
14250 2e 6d 6f 7a 69 6c 6c 61 2e 6f 72 67 2f 73 68 6f  .mozilla.org/sho
14260 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 31 30 37  w_bug.cgi?id=107
14270 32 37 37 33 0a 20 20 20 20 20 20 20 20 20 20 2a  2773.          *
14280 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
14290 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
142a0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
142b0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a  er->syncFlags);.
142c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
142d0 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
142e0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
142f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
14300 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
14310 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
14320 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20  MODE_PERSIST.   
14330 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
14340 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
14350 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
14360 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
14370 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20  ALMODE_WAL).    
14380 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65  ){.      rc = ze
14390 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  roJournalHdr(pPa
143a0 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 7c 7c  ger, hasMaster||
143b0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
143c0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
143d0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
143e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
143f0 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
14400 20 6d 61 79 20 62 65 20 65 78 65 63 75 74 65 64   may be executed
14410 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72   with Pager.jour
14420 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20  nalMode==MEMORY 
14430 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f  if.      ** a ho
14440 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75  t-journal was ju
14450 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  st rolled back. 
14460 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
14470 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
14480 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  * file should be
14490 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65   closed and dele
144a0 74 65 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e  ted. If this con
144b0 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74  nection writes t
144c0 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  o.      ** the d
144d0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74  atabase file, it
144e0 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e   will do so usin
144f0 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  g an in-memory j
14500 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20 20 2a 2f  ournal..      */
14510 0a 20 20 20 20 20 20 69 6e 74 20 62 44 65 6c 65  .      int bDele
14520 74 65 20 3d 20 21 70 50 61 67 65 72 2d 3e 74 65  te = !pPager->te
14530 6d 70 46 69 6c 65 3b 0a 20 20 20 20 20 20 61 73  mpFile;.      as
14540 73 65 72 74 28 20 73 71 6c 69 74 65 33 4a 6f 75  sert( sqlite3Jou
14550 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70  rnalIsInMemory(p
14560 50 61 67 65 72 2d 3e 6a 66 64 29 3d 3d 30 20 29  Pager->jfd)==0 )
14570 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14580 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
14590 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
145a0 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20  ALMODE_DELETE . 
145b0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
145c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
145d0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
145e0 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20  ODE_MEMORY .    
145f0 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
14600 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
14610 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
14620 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20  _WAL .      );. 
14630 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
14640 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
14650 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 65 6c  ;.      if( bDel
14660 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ete ){.        r
14670 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
14680 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
14690 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
146a0 61 6c 2c 20 70 50 61 67 65 72 2d 3e 65 78 74 72  al, pPager->extr
146b0 61 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a  aSync);.      }.
146c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
146d0 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
146e0 41 47 45 53 0a 20 20 73 71 6c 69 74 65 33 50 63  AGES.  sqlite3Pc
146f0 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79  acheIterateDirty
14700 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
14710 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  , pager_set_page
14720 68 61 73 68 29 3b 0a 20 20 69 66 28 20 70 50 61  hash);.  if( pPa
14730 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 26  ger->dbSize==0 &
14740 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
14750 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
14760 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20  pPCache)>0 ){.  
14770 20 20 50 67 48 64 72 20 2a 70 20 3d 20 73 71 6c    PgHdr *p = sql
14780 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
14790 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
147a0 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70  if( p ){.      p
147b0 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 30 3b 0a  ->pageHash = 0;.
147c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
147d0 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70  erUnrefNotNull(p
147e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
147f0 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 42 69  dif..  sqlite3Bi
14800 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
14810 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
14820 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  .  pPager->pInJo
14830 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 70 50 61  urnal = 0;.  pPa
14840 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
14850 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14860 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 61  OK ){.    if( pa
14870 67 65 72 46 6c 75 73 68 4f 6e 43 6f 6d 6d 69 74  gerFlushOnCommit
14880 28 70 50 61 67 65 72 2c 20 62 43 6f 6d 6d 69 74  (pPager, bCommit
14890 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
148a0 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
148b0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
148c0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
148d0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
148e0 65 43 6c 65 61 72 57 72 69 74 61 62 6c 65 28 70  eClearWritable(p
148f0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
14900 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
14910 65 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65  e3PcacheTruncate
14920 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
14930 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
14940 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61  );.  }..  if( pa
14950 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
14960 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70  ) ){.    /* Drop
14970 20 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d 6c   the WAL write-l
14980 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73  ock, if any. Als
14990 6f 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63  o, if the connec
149a0 74 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20 20  tion was in .   
149b0 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   ** locking_mode
149c0 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20  =exclusive mode 
149d0 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  but is no longer
149e0 2c 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c 55  , drop the EXCLU
149f0 53 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63  SIVE .    ** loc
14a00 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  k held on the da
14a10 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
14a20 20 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73 71   */.    rc2 = sq
14a30 6c 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65  lite3WalEndWrite
14a40 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
14a50 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61  er->pWal);.    a
14a60 73 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49  ssert( rc2==SQLI
14a70 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c 73 65  TE_OK );.  }else
14a80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14a90 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26 26  OK && bCommit &&
14aa0 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
14ab0 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 53 69  ize>pPager->dbSi
14ac0 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  ze ){.    /* Thi
14ad0 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
14ae0 6e 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  n when committin
14af0 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  g a transaction 
14b00 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72  in rollback-jour
14b10 6e 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20  nal.    ** mode 
14b20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
14b30 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
14b40 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
14b50 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a  database image..
14b60 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70      ** At this p
14b70 6f 69 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  oint the journal
14b80 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69   has been finali
14b90 7a 65 64 20 61 6e 64 20 74 68 65 20 74 72 61 6e  zed and the tran
14ba0 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20  saction .    ** 
14bb0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d  successfully com
14bc0 6d 69 74 74 65 64 2c 20 62 75 74 20 74 68 65 20  mitted, but the 
14bd0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69  EXCLUSIVE lock i
14be0 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20  s still held on 
14bf0 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e  the.    ** file.
14c00 20 53 6f 20 69 74 20 69 73 20 73 61 66 65 20 74   So it is safe t
14c10 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 64  o truncate the d
14c20 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
14c30 69 74 73 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20  its minimum.    
14c40 2a 2a 20 72 65 71 75 69 72 65 64 20 73 69 7a 65  ** required size
14c50 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
14c60 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
14c70 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
14c80 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
14c90 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
14ca0 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  r, pPager->dbSiz
14cb0 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  e);.  }..  if( r
14cc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
14cd0 62 43 6f 6d 6d 69 74 20 26 26 20 69 73 4f 70 65  bCommit && isOpe
14ce0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
14cf0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
14d00 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  3OsFileControl(p
14d10 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
14d20 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 50  E_FCNTL_COMMIT_P
14d30 48 41 53 45 54 57 4f 2c 20 30 29 3b 0a 20 20 20  HASETWO, 0);.   
14d40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14d50 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20  NOTFOUND ) rc = 
14d60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
14d70 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
14d80 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20  xclusiveMode .  
14d90 20 26 26 20 28 21 70 61 67 65 72 55 73 65 57 61   && (!pagerUseWa
14da0 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 73 71 6c  l(pPager) || sql
14db0 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65  ite3WalExclusive
14dc0 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61  Mode(pPager->pWa
14dd0 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20 20 20  l, 0)).  ){.    
14de0 72 63 32 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63  rc2 = pagerUnloc
14df0 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52  kDb(pPager, SHAR
14e00 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50  ED_LOCK);.    pP
14e10 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
14e20 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  tDone = 0;.  }. 
14e30 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
14e40 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a  = PAGER_READER;.
14e50 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
14e60 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75  ter = 0;..  retu
14e70 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rn (rc==SQLITE_O
14e80 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a  K?rc2:rc);.}../*
14e90 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f  .** Execute a ro
14ea0 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e  llback if a tran
14eb0 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
14ec0 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  e and unlock the
14ed0 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69   .** database fi
14ee0 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  le. .**.** If th
14ef0 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65  e pager has alre
14f00 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
14f10 45 52 52 4f 52 20 73 74 61 74 65 2c 20 64 6f 20  ERROR state, do 
14f20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20  not attempt .** 
14f30 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20  the rollback at 
14f40 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65  this time. Inste
14f50 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  ad, pager_unlock
14f60 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68  () is called. Th
14f70 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67  e.** call to pag
14f80 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c  er_unlock() will
14f90 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d   discard all in-
14fa0 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e  memory pages, un
14fb0 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61  lock.** the data
14fc0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f  base file and mo
14fd0 76 65 20 74 68 65 20 70 61 67 65 72 20 62 61 63  ve the pager bac
14fe0 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e  k to OPEN state.
14ff0 20 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61   If this .** mea
15000 6e 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ns that there is
15010 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c   a hot-journal l
15020 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  eft in the file-
15030 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74  system, the next
15040 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   .** connection 
15050 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72  to obtain a shar
15060 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70  ed lock on the p
15070 61 67 65 72 20 28 77 68 69 63 68 20 6d 61 79 20  ager (which may 
15080 62 65 20 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a  be this one) .**
15090 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61   will roll it ba
150a0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
150b0 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20 61   pager has not a
150c0 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74  lready entered t
150d0 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20  he ERROR state, 
150e0 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20  but an IO or.** 
150f0 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63  malloc error occ
15100 75 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c  urs during a rol
15110 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69 73  lback, then this
15120 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61 75   will itself cau
15130 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72  se .** the pager
15140 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52   to enter the ER
15150 52 4f 52 20 73 74 61 74 65 2e 20 57 68 69 63 68  ROR state. Which
15160 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64   will be cleared
15170 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20   by the.** call 
15180 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  to pager_unlock(
15190 29 2c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ), as described 
151a0 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  above..*/.static
151b0 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
151c0 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67  kAndRollback(Pag
151d0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
151e0 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
151f0 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26  e!=PAGER_ERROR &
15200 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
15210 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a  !=PAGER_OPEN ){.
15220 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65      assert( asse
15230 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
15240 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 69 66  Pager) );.    if
15250 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
15260 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  >=PAGER_WRITER_L
15270 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 73  OCKED ){.      s
15280 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
15290 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
152a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
152b0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
152c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
152d0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
152e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50     }else if( !pP
152f0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
15300 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ode ){.      ass
15310 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
15320 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
15330 52 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72  R );.      pager
15340 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
15350 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a  (pPager, 0, 0);.
15360 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65      }.  }.  page
15370 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
15380 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
15390 65 74 65 72 20 61 44 61 74 61 20 6d 75 73 74 20  eter aData must 
153a0 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
153b0 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67  r of pPager->pag
153c0 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f  eSize bytes.** o
153d0 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20  f data. Compute 
153e0 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65  and return a che
153f0 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20  cksum based ont 
15400 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
15410 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20  the .** page of 
15420 64 61 74 61 20 61 6e 64 20 74 68 65 20 63 75 72  data and the cur
15430 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50  rent value of pP
15440 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e  ager->cksumInit.
15450 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
15460 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73  ot a real checks
15470 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79  um. It is really
15480 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66   just the sum of
15490 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20   the .** random 
154a0 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70  initial value (p
154b0 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
154c0 29 20 61 6e 64 20 65 76 65 72 79 20 32 30 30 74  ) and every 200t
154d0 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65  h byte.** of the
154e0 20 70 61 67 65 20 64 61 74 61 2c 20 73 74 61 72   page data, star
154f0 74 69 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f  ting with byte o
15500 66 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70  ffset (pPager->p
15510 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a  ageSize%200)..**
15520 20 45 61 63 68 20 62 79 74 65 20 69 73 20 69 6e   Each byte is in
15530 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 20  terpreted as an 
15540 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69  8-bit unsigned i
15550 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68  nteger..**.** Ch
15560 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75  anging the formu
15570 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  la used to compu
15580 74 65 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d  te this checksum
15590 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a   results in an.*
155a0 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a  * incompatible j
155b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
155c0 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75  at..**.** If jou
155d0 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20  rnal corruption 
155e0 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20  occurs due to a 
155f0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74  power failure, t
15600 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a  he most likely .
15610 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74  ** scenario is t
15620 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74  hat one end or t
15630 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
15640 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63  record will be c
15650 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69  hanged. .** It i
15660 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65  s much less like
15670 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20  ly that the two 
15680 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ends of the jour
15690 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  nal record will 
156a0 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e  be.** correct an
156b0 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20  d the middle be 
156c0 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20  corrupt.  Thus, 
156d0 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20  this "checksum" 
156e0 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67  scheme,.** thoug
156f0 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c  h fast and simpl
15700 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d  e, catches the m
15710 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e  ostly likely kin
15720 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d of corruption.
15730 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
15740 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72  ager_cksum(Pager
15750 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
15760 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33  u8 *aData){.  u3
15770 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72  2 cksum = pPager
15780 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20  ->cksumInit;    
15790 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
157a0 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   value to return
157b0 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50   */.  int i = pP
157c0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32  ager->pageSize-2
157d0 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  00;          /* 
157e0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
157f0 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a    while( i>0 ){.
15800 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61      cksum += aDa
15810 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20  ta[i];.    i -= 
15820 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  200;.  }.  retur
15830 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a  n cksum;.}../*.*
15840 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75 72  * Report the cur
15850 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61  rent page size a
15860 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  nd number of res
15870 65 72 76 65 64 20 62 79 74 65 73 20 62 61 63 6b  erved bytes back
15880 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63  .** to the codec
15890 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
158a0 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61  TE_HAS_CODEC.sta
158b0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65  tic void pagerRe
158c0 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a  portSize(Pager *
158d0 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
158e0 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a  Pager->xCodecSiz
158f0 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61  eChng ){.    pPa
15900 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43  ger->xCodecSizeC
15910 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64  hng(pPager->pCod
15920 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ec, pPager->page
15930 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
15940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15950 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52   (int)pPager->nR
15960 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23  eserve);.  }.}.#
15970 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
15980 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29  gerReportSize(X)
15990 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66       /* No-op if
159a0 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f   we do not suppo
159b0 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65  rt a codec */.#e
159c0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
159d0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a  ITE_HAS_CODEC./*
159e0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
159f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
15a00 72 76 65 64 20 62 69 74 73 20 69 73 20 74 68 65  rved bits is the
15a10 20 73 61 6d 65 20 69 6e 20 74 68 65 20 64 65 73   same in the des
15a20 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 70 61 67 65  tination.** page
15a30 72 20 61 73 20 69 74 20 69 73 20 69 6e 20 74 68  r as it is in th
15a40 65 20 73 6f 75 72 63 65 2e 20 20 54 68 69 73 20  e source.  This 
15a50 63 6f 6d 65 73 20 75 70 20 77 68 65 6e 20 61 20  comes up when a 
15a60 56 41 43 55 55 4d 20 63 68 61 6e 67 65 73 20 74  VACUUM changes t
15a70 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
15a80 72 65 73 65 72 76 65 64 20 62 69 74 73 20 74 6f  reserved bits to
15a90 20 74 68 65 20 22 6f 70 74 69 6d 61 6c 22 20 61   the "optimal" a
15aa0 6d 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  mount..*/.void s
15ab0 71 6c 69 74 65 33 50 61 67 65 72 41 6c 69 67 6e  qlite3PagerAlign
15ac0 52 65 73 65 72 76 65 28 50 61 67 65 72 20 2a 70  Reserve(Pager *p
15ad0 44 65 73 74 2c 20 50 61 67 65 72 20 2a 70 53 72  Dest, Pager *pSr
15ae0 63 29 7b 0a 20 20 69 66 28 20 70 44 65 73 74 2d  c){.  if( pDest-
15af0 3e 6e 52 65 73 65 72 76 65 21 3d 70 53 72 63 2d  >nReserve!=pSrc-
15b00 3e 6e 52 65 73 65 72 76 65 20 29 7b 0a 20 20 20  >nReserve ){.   
15b10 20 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76 65   pDest->nReserve
15b20 20 3d 20 70 53 72 63 2d 3e 6e 52 65 73 65 72 76   = pSrc->nReserv
15b30 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f  e;.    pagerRepo
15b40 72 74 53 69 7a 65 28 70 44 65 73 74 29 3b 0a 20  rtSize(pDest);. 
15b50 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
15b60 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  ** Read a single
15b70 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65   page from eithe
15b80 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
15b90 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e  le (if isMainJrn
15ba0 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d  l==1) or.** from
15bb0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
15bc0 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d   (if isMainJrnl=
15bd0 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b  =0) and playback
15be0 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54   that page..** T
15bf0 68 65 20 70 61 67 65 20 62 65 67 69 6e 73 20 61  he page begins a
15c00 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65  t offset *pOffse
15c10 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  t into the file.
15c20 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a   The *pOffset.**
15c30 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61   value is increa
15c40 73 65 64 20 74 6f 20 74 68 65 20 73 74 61 72 74  sed to the start
15c50 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
15c60 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
15c70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e  ..**.** The main
15c80 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
15c90 6c 20 75 73 65 73 20 63 68 65 63 6b 73 75 6d 73  l uses checksums
15ca0 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74   - the statement
15cb0 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a   journal does .*
15cc0 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  * not..**.** If 
15cd0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
15ce0 6f 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f  of the page reco
15cf0 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  rd read from the
15d00 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
15d10 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65  ile.** is greate
15d20 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
15d30 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  nt value of Page
15d40 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70  r.dbSize, then p
15d50 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b  layback is.** sk
15d60 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45  ipped and SQLITE
15d70 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
15d80 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20  .**.** If pDone 
15d90 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
15da0 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f 72 64  n it is a record
15db0 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68   of pages that h
15dc0 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62  ave already.** b
15dd0 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e  een played back.
15de0 20 20 49 66 20 74 68 65 20 70 61 67 65 20 61 74    If the page at
15df0 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c   *pOffset has al
15e00 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65  ready been playe
15e10 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68  d back.** (if th
15e20 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
15e30 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74  pDone bit is set
15e40 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20  ) then skip the 
15e50 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b  playback..** Mak
15e60 65 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65  e sure the pDone
15e70 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69   bit correspondi
15e80 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73  ng to the *pOffs
15e90 65 74 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a  et page is set.*
15ea0 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72  * prior to retur
15eb0 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ning..**.** If t
15ec0 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 69  he page record i
15ed0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72  s successfully r
15ee0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ead from the (su
15ef0 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  b-)journal file.
15f00 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61  ** and played ba
15f10 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  ck, then SQLITE_
15f20 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
15f30 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
15f40 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72  ccurs.** while r
15f50 65 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72  eading the recor
15f60 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
15f70 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72  )journal file or
15f80 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a   while writing.*
15f90 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
15fa0 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65  e file, then the
15fb0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
15fc0 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64  s returned. If d
15fd0 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73  ata.** is succes
15fe0 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  sfully read from
15ff0 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
16000 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70 65  al file but appe
16010 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72  ars to be.** cor
16020 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
16030 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
16040 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65   Data is conside
16050 72 65 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e  red corrupted in
16060 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74  .** two circumst
16070 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20  ances:.** .**   
16080 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
16090 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69  page-number is i
160a0 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47  llegal (0 or PAG
160b0 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a  ER_MJ_PGNO), or.
160c0 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65  **   * If the re
160d0 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f  cord is being ro
160e0 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  lled back from t
160f0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
16100 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20  file.**     and 
16110 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65  the checksum fie
16120 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ld does not matc
16130 68 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e  h the record con
16140 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74  tent..**.** Neit
16150 68 65 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f  her of these two
16160 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70   scenarios are p
16170 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61  ossible during a
16180 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
16190 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
161a0 69 73 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e  is is a savepoin
161b0 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  t rollback, then
161c0 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65   memory may have
161d0 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c   to be dynamical
161e0 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  ly.** allocated 
161f0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
16200 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
16210 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c   case and an all
16220 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a  ocation fails,.*
16230 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
16240 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
16250 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
16260 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
16270 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
16280 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
16290 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
162a0 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63  being played bac
162b0 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66  k */.  i64 *pOff
162c0 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  set,            
162d0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
162e0 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79  f record to play
162f0 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63  back */.  Bitvec
16300 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20 20 20   *pDone,        
16310 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65          /* Bitve
16320 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61  c of pages alrea
16330 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a  dy played back *
16340 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72  /.  int isMainJr
16350 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nl,             
16360 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a    /* 1 -> main j
16370 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62  ournal. 0 -> sub
16380 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69  -journal. */.  i
16390 6e 74 20 69 73 53 61 76 65 70 6e 74 20 20 20 20  nt isSavepnt    
163a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
163b0 54 72 75 65 20 66 6f 72 20 61 20 73 61 76 65 70  True for a savep
163c0 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  oint rollback */
163d0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
163e0 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20  PgHdr *pPg;     
163f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16400 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67   An existing pag
16410 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a  e in the cache *
16420 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
16430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16440 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
16450 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69  mber of a page i
16460 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  n journal */.  u
16470 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
16480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16490 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f  Checksum used fo
164a0 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  r sanity checkin
164b0 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61  g */.  char *aDa
164c0 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
164d0 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
164e0 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68  y storage for th
164f0 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69  e page */.  sqli
16500 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20  te3_file *jfd;  
16510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16520 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
16530 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
16540 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69   file */.  int i
16550 73 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20  sSynced;        
16560 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
16570 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65   if journal page
16580 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 0a 20   is synced */.. 
16590 20 61 73 73 65 72 74 28 20 28 69 73 4d 61 69 6e   assert( (isMain
165a0 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20  Jrnl&~1)==0 );  
165b0 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e      /* isMainJrn
165c0 6c 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  l is 0 or 1 */. 
165d0 20 61 73 73 65 72 74 28 20 28 69 73 53 61 76 65   assert( (isSave
165e0 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20  pnt&~1)==0 );   
165f0 20 20 20 20 2f 2a 20 69 73 53 61 76 65 70 6e 74      /* isSavepnt
16600 20 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20   is 0 or 1 */.  
16610 61 73 73 65 72 74 28 20 69 73 4d 61 69 6e 4a 72  assert( isMainJr
16620 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20  nl || pDone );  
16630 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61     /* pDone alwa
16640 79 73 20 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a  ys used on sub-j
16650 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73  ournals */.  ass
16660 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 7c  ert( isSavepnt |
16670 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20  | pDone==0 );   
16680 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65 72 20 75  /* pDone never u
16690 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70  sed on non-savep
166a0 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61  oint */..  aData
166b0 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
166c0 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28 20  pace;.  assert( 
166d0 61 44 61 74 61 20 29 3b 20 20 20 20 20 20 20 20  aData );        
166e0 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65   /* Temp storage
166f0 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61   must have alrea
16700 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
16710 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  d */.  assert( p
16720 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
16730 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73 4d 61 69  r)==0 || (!isMai
16740 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61 76 65 70  nJrnl && isSavep
16750 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 69 74  nt) );..  /* Eit
16760 68 65 72 20 74 68 65 20 73 74 61 74 65 20 69 73  her the state is
16770 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 41   greater than PA
16780 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
16790 4d 4f 44 20 28 61 20 74 72 61 6e 73 61 63 74 69  MOD (a transacti
167a0 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73 61 76 65  on .  ** or save
167b0 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 64  point rollback d
167c0 6f 6e 65 20 61 74 20 74 68 65 20 72 65 71 75 65  one at the reque
167d0 73 74 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  st of the caller
167e0 29 20 6f 72 20 74 68 69 73 20 69 73 0a 20 20 2a  ) or this is.  *
167f0 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  * a hot-journal 
16800 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20 69 74 20  rollback. If it 
16810 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  is a hot-journal
16820 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 70   rollback, the p
16830 61 67 65 72 0a 20 20 2a 2a 20 69 73 20 69 6e 20  ager.  ** is in 
16840 73 74 61 74 65 20 4f 50 45 4e 20 61 6e 64 20 68  state OPEN and h
16850 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55 53 49 56  olds an EXCLUSIV
16860 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a 6f 75 72  E lock. Hot-jour
16870 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  nal rollback.  *
16880 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20 66 72 6f  * only reads fro
16890 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
168a0 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73 75 62 2d  al, not the sub-
168b0 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  journal..  */.  
168c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
168d0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
168e0 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20  ITER_CACHEMOD.  
168f0 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
16900 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
16910 50 45 4e 20 26 26 20 70 50 61 67 65 72 2d 3e 65  PEN && pPager->e
16920 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
16930 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20 61 73 73  LOCK).  );.  ass
16940 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
16950 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45  ate>=PAGER_WRITE
16960 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c 20 69 73  R_CACHEMOD || is
16970 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a 20 20 2f  MainJrnl );..  /
16980 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 20  * Read the page 
16990 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20  number and page 
169a0 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6a 6f  data from the jo
169b0 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75  urnal or sub-jou
169c0 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e 20  rnal.  ** file. 
169d0 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
169e0 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
169f0 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f  er if an IO erro
16a00 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a 20  r occurs..  */. 
16a10 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72 6e   jfd = isMainJrn
16a20 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  l ? pPager->jfd 
16a30 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b 0a  : pPager->sjfd;.
16a40 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
16a50 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74 2c  s(jfd, *pOffset,
16a60 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72   &pgno);.  if( r
16a70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
16a80 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
16a90 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a   sqlite3OsRead(j
16aa0 66 64 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20  fd, (u8*)aData, 
16ab0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
16ac0 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b  , (*pOffset)+4);
16ad0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
16ae0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
16af0 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20  ;.  *pOffset += 
16b00 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
16b10 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e   + 4 + isMainJrn
16b20 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74  l*4;..  /* Sanit
16b30 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68  y checking on th
16b40 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73  e page.  This is
16b50 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
16b60 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c  that I originall
16b70 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20  y.  ** thought. 
16b80 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c   If a power fail
16b90 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ure occurs while
16ba0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
16bb0 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20  being written,. 
16bc0 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75   ** it could cau
16bd0 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  se invalid data 
16be0 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
16bf0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  to the journal. 
16c00 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a   We need to.  **
16c10 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76   detect this inv
16c20 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20  alid data (with 
16c30 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79  high probability
16c40 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  ) and ignore it.
16c50 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f  .  */.  if( pgno
16c60 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  ==0 || pgno==PAG
16c70 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
16c80 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  r) ){.    assert
16c90 28 20 21 69 73 53 61 76 65 70 6e 74 20 29 3b 0a  ( !isSavepnt );.
16ca0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16cb0 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66  E_DONE;.  }.  if
16cc0 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61  ( pgno>(Pgno)pPa
16cd0 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73  ger->dbSize || s
16ce0 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
16cf0 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b  (pDone, pgno) ){
16d00 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
16d10 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
16d20 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20   isMainJrnl ){. 
16d30 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69     rc = read32bi
16d40 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65  ts(jfd, (*pOffse
16d50 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20  t)-4, &cksum);. 
16d60 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
16d70 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 21  rn rc;.    if( !
16d80 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 61 67  isSavepnt && pag
16d90 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
16da0 20 28 75 38 2a 29 61 44 61 74 61 29 21 3d 63 6b   (u8*)aData)!=ck
16db0 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sum ){.      ret
16dc0 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
16dd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
16de0 20 49 66 20 74 68 69 73 20 70 61 67 65 20 68 61   If this page ha
16df0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
16e00 6c 61 79 65 64 20 62 61 63 6b 20 62 65 66 6f 72  layed back befor
16e10 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72  e during the cur
16e20 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61  rent.  ** rollba
16e30 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74 20 62  ck, then don't b
16e40 6f 74 68 65 72 20 74 6f 20 70 6c 61 79 20 69 74  other to play it
16e50 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20 20 2a   back again..  *
16e60 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26  /.  if( pDone &&
16e70 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69   (rc = sqlite3Bi
16e80 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70  tvecSet(pDone, p
16e90 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  gno))!=SQLITE_OK
16ea0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
16eb0 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65  c;.  }..  /* Whe
16ec0 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 70  n playing back p
16ed0 61 67 65 20 31 2c 20 72 65 73 74 6f 72 65 20 74  age 1, restore t
16ee0 68 65 20 6e 52 65 73 65 72 76 65 20 73 65 74 74  he nReserve sett
16ef0 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ing.  */.  if( p
16f00 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67 65 72  gno==1 && pPager
16f10 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28 28 75 38  ->nReserve!=((u8
16f20 2a 29 61 44 61 74 61 29 5b 32 30 5d 20 29 7b 0a  *)aData)[20] ){.
16f30 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73      pPager->nRes
16f40 65 72 76 65 20 3d 20 28 28 75 38 2a 29 61 44 61  erve = ((u8*)aDa
16f50 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70 61 67  ta)[20];.    pag
16f60 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61  erReportSize(pPa
16f70 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
16f80 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
16f90 69 6e 20 43 41 43 48 45 4d 4f 44 20 73 74 61 74  in CACHEMOD stat
16fa0 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e, then there mu
16fb0 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20  st be a copy of 
16fc0 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69  this.  ** page i
16fd0 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
16fe0 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
16ff0 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20  just update the 
17000 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a  pager cache,.  *
17010 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61  * not the databa
17020 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  se file. The pag
17030 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64  e is left marked
17040 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63   dirty in this c
17050 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ase..  **.  ** A
17060 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74  n exception to t
17070 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49  he above rule: I
17080 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
17090 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  s in no-sync mod
170a0 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67  e.  ** and a pag
170b0 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e  e is moved durin
170c0 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  g an incremental
170d0 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65   vacuum then the
170e0 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e   page may.  ** n
170f0 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70 61 67  ot be in the pag
17100 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a  er cache. Later:
17110 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f   if a malloc() o
17120 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  r IO error occur
17130 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20  s.  ** during a 
17140 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c  Movepage() call,
17150 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
17160 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65  ay not be in the
17170 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68   cache.  ** eith
17180 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69  er. So the condi
17190 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69  tion described i
171a0 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72 61  n the above para
171b0 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a  graph is not.  *
171c0 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a  * assert()able..
171d0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20    **.  ** If in 
171e0 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20 57 52  WRITER_DBMOD, WR
171f0 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 6f 72  ITER_FINISHED or
17200 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74 68 65   OPEN state, the
17210 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65 0a  n we update the.
17220 20 20 2a 2a 20 70 61 67 65 72 20 63 61 63 68 65    ** pager cache
17230 20 69 66 20 69 74 20 65 78 69 73 74 73 20 61 6e   if it exists an
17240 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e  d the main file.
17250 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65   The page is the
17260 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a 20 6e  n marked .  ** n
17270 6f 74 20 64 69 72 74 79 2e 20 53 69 6e 63 65 20  ot dirty. Since 
17280 74 68 69 73 20 63 6f 64 65 20 69 73 20 6f 6e 6c  this code is onl
17290 79 20 65 78 65 63 75 74 65 64 20 69 6e 20 50 41  y executed in PA
172a0 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 66  GER_OPEN state f
172b0 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f  or.  ** a hot-jo
172c0 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20  urnal rollback, 
172d0 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
172e0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 63   that the page-c
172f0 61 63 68 65 20 69 73 20 65 6d 70 74 79 0a 20 20  ache is empty.  
17300 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ** if the pager 
17310 69 73 20 69 6e 20 4f 50 45 4e 20 73 74 61 74 65  is in OPEN state
17320 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b  ..  **.  ** Tick
17330 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73  et #1171:  The s
17340 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
17350 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70   might contain p
17360 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74  age content that
17370 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65   is.  ** differe
17380 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  nt from the page
17390 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20   content at the 
173a0 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
173b0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54  nsaction..  ** T
173c0 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20  his occurs when 
173d0 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65  a page is change
173e0 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  d prior to the s
173f0 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d  tart of a statem
17400 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68  ent.  ** then ch
17410 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68  anged again with
17420 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
17430 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  .  When rolling 
17440 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a  back such a.  **
17450 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75   statement we mu
17460 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  st not write to 
17470 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
17480 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20  abase unless we 
17490 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65  know.  ** for ce
174a0 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69  rtain that origi
174b0 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
174c0 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74  s are synced int
174d0 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  o the main rollb
174e0 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ack.  ** journal
174f0 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  .  Otherwise, a 
17500 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74  power loss might
17510 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20   leave modified 
17520 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a  data in the.  **
17530 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
17540 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20  ithout an entry 
17550 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
17560 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e  journal that can
17570 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68  .  ** restore th
17580 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
17590 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e  s original form.
175a0 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73    Two conditions
175b0 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65   must be.  ** me
175c0 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  t before writing
175d0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
175e0 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20   files. (1) the 
175f0 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
17600 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28  .  ** locked.  (
17610 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  2) we know that 
17620 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
17630 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c  e content is ful
17640 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69  ly synced.  ** i
17650 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  n the main journ
17660 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73  al either becaus
17670 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  e the page is no
17680 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c  t in cache or el
17690 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  se.  ** the page
176a0 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65   is marked as ne
176b0 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a  edSync==0..  **.
176c0 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a    ** 2008-04-14:
176d0 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e    When attemptin
176e0 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f  g to vacuum a co
176f0 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
17700 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20  ile, it.  ** is 
17710 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c  possible to fail
17720 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20   a statement on 
17730 61 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  a database that 
17740 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69  does not yet exi
17750 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20  st..  ** Do not 
17760 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
17770 20 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c   if database fil
17780 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e  e has never been
17790 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20   opened..  */.  
177a0 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
177b0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 70  pPager) ){.    p
177c0 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  Pg = 0;.  }else{
177d0 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74  .    pPg = sqlit
177e0 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50  e3PagerLookup(pP
177f0 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  ager, pgno);.  }
17800 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 20 7c  .  assert( pPg |
17810 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73  | !MEMDB );.  as
17820 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
17830 74 61 74 65 21 3d 50 41 47 45 52 5f 4f 50 45 4e  tate!=PAGER_OPEN
17840 20 7c 7c 20 70 50 67 3d 3d 30 20 7c 7c 20 70 50   || pPg==0 || pP
17850 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
17860 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
17870 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67  "PLAYBACK %d pag
17880 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 20  e %d hash(%08x) 
17890 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
178a0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
178b0 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64  ), pgno, pager_d
178c0 61 74 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e  atahash(pPager->
178d0 70 61 67 65 53 69 7a 65 2c 20 28 75 38 2a 29 61  pageSize, (u8*)a
178e0 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20 20 20  Data),.         
178f0 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d    (isMainJrnl?"m
17900 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75  ain-journal":"su
17910 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29  b-journal").  ))
17920 3b 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72  ;.  if( isMainJr
17930 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53 79 6e 63  nl ){.    isSync
17940 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ed = pPager->noS
17950 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66 73 65 74  ync || (*pOffset
17960 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   <= pPager->jour
17970 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65 6c 73 65  nalHdr);.  }else
17980 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d  {.    isSynced =
17990 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28   (pPg==0 || 0==(
179a0 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48  pPg->flags & PGH
179b0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29 3b 0a  DR_NEED_SYNC));.
179c0 20 20 7d 0a 20 20 69 66 28 20 69 73 4f 70 65 6e    }.  if( isOpen
179d0 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20 20 20  (pPager->fd).   
179e0 26 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61  && (pPager->eSta
179f0 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
17a00 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72  _DBMOD || pPager
17a10 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
17a20 4f 50 45 4e 29 0a 20 20 20 26 26 20 69 73 53 79  OPEN).   && isSy
17a30 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20 20 69 36  nced.  ){.    i6
17a40 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31  4 ofst = (pgno-1
17a50 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
17a60 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 74 65 73  ageSize;.    tes
17a70 74 63 61 73 65 28 20 21 69 73 53 61 76 65 70 6e  tcase( !isSavepn
17a80 74 20 26 26 20 70 50 67 21 3d 30 20 26 26 20 28  t && pPg!=0 && (
17a90 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
17aa0 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29  _NEED_SYNC)!=0 )
17ab0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ;.    assert( !p
17ac0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
17ad0 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  r) );.    rc = s
17ae0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
17af0 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 20 2a 29  ager->fd, (u8 *)
17b00 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
17b10 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a  ageSize, ofst);.
17b20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
17b30 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
17b40 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
17b50 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67  >dbFileSize = pg
17b60 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  no;.    }.    if
17b70 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  ( pPager->pBacku
17b80 70 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43  p ){.      CODEC
17b90 31 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 2c  1(pPager, aData,
17ba0 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c   pgno, 3, rc=SQL
17bb0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b  ITE_NOMEM_BKPT);
17bc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61  .      sqlite3Ba
17bd0 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
17be0 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
17bf0 2c 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20  , (u8*)aData);. 
17c00 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67       CODEC2(pPag
17c10 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c  er, aData, pgno,
17c20 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f   7, rc=SQLITE_NO
17c30 4d 45 4d 5f 42 4b 50 54 2c 20 61 44 61 74 61 29  MEM_BKPT, aData)
17c40 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
17c50 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20  if( !isMainJrnl 
17c60 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  && pPg==0 ){.   
17c70 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
17c80 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73   rollback of a s
17c90 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74  avepoint and dat
17ca0 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65  a was not writte
17cb0 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  n to.    ** the 
17cc0 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68 65  database and the
17cd0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d   page is not in-
17ce0 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73  memory, there is
17cf0 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20   a potential.   
17d00 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65   ** problem. Whe
17d10 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 65  n the page is ne
17d20 78 74 20 66 65 74 63 68 65 64 20 62 79 20 74 68  xt fetched by th
17d30 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20  e b-tree layer, 
17d40 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  it .    ** will 
17d50 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
17d60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
17d70 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79  which may or may
17d80 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20   not be .    ** 
17d90 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a  current. .    **
17da0 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72  .    ** There ar
17db0 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69  e a couple of di
17dc0 66 66 65 72 65 6e 74 20 77 61 79 73 20 74 68 69  fferent ways thi
17dd0 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c  s can happen. Al
17de0 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20 20 20  l are quite.    
17df0 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e  ** obscure. When
17e00 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63   running in sync
17e10 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68  hronous mode, th
17e20 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  is can only happ
17e30 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68  en .    ** if th
17e40 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65  e page is on the
17e50 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68   free-list at th
17e60 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
17e70 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
17e80 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65  .    ** populate
17e90 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73  d, then moved us
17ea0 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72  ing sqlite3Pager
17eb0 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20  Movepage()..    
17ec0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f  **.    ** The so
17ed0 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64  lution is to add
17ee0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
17ef0 67 65 20 74 6f 20 74 68 65 20 63 61 63 68 65 20  ge to the cache 
17f00 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a  containing.    *
17f10 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73 74 20  * the data just 
17f20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75  read from the su
17f30 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20  b-journal. Mark 
17f40 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74  the page as dirt
17f50 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66  y .    ** and if
17f60 20 74 68 65 20 70 61 67 65 72 20 72 65 71 75 69   the pager requi
17f70 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79  res a journal-sy
17f80 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68  nc, then mark th
17f90 65 20 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a  e page as .    *
17fa0 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f  * requiring a jo
17fb0 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72  urnal-sync befor
17fc0 65 20 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e  e it is written.
17fd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
17fe0 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b  rt( isSavepnt );
17ff0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50  .    assert( (pP
18000 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
18010 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c   & SPILLFLAG_ROL
18020 4c 42 41 43 4b 29 3d 3d 30 20 29 3b 0a 20 20 20  LBACK)==0 );.   
18030 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
18040 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41 47  ill |= SPILLFLAG
18050 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 72  _ROLLBACK;.    r
18060 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
18070 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  Get(pPager, pgno
18080 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20 20  , &pPg, 1);.    
18090 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
180a0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50  >doNotSpill & SP
180b0 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
180c0 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  )!=0 );.    pPag
180d0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
180e0 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c  = ~SPILLFLAG_ROL
180f0 4c 42 41 43 4b 3b 0a 20 20 20 20 69 66 28 20 72  LBACK;.    if( r
18100 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
18110 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 73 71  eturn rc;.    sq
18120 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
18130 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20  irty(pPg);.  }. 
18140 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
18150 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c  /* No page shoul
18160 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63  d ever be explic
18170 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b  itly rolled back
18180 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c   that is in use,
18190 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66   except.    ** f
181a0 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20  or page 1 which 
181b0 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69  is held in use i
181c0 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20  n order to keep 
181d0 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  the lock on the.
181e0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
181f0 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20  active. However 
18200 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20  such a page may 
18210 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
18220 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  s a result.    *
18230 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c  * of an internal
18240 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67   error resulting
18250 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63   in an automatic
18260 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
18270 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
18280 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  back()..    */. 
18290 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a     void *pData;.
182a0 20 20 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d      pData = pPg-
182b0 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63  >pData;.    memc
182c0 70 79 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61  py(pData, (u8*)a
182d0 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
182e0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61  geSize);.    pPa
182f0 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70  ger->xReiniter(p
18300 50 67 29 3b 0a 20 20 20 20 2f 2a 20 49 74 20 75  Pg);.    /* It u
18310 73 65 64 20 74 6f 20 62 65 20 74 68 61 74 20 73  sed to be that s
18320 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
18330 43 6c 65 61 6e 28 70 50 67 29 20 77 61 73 20 63  Clean(pPg) was c
18340 61 6c 6c 65 64 20 68 65 72 65 2e 20 20 42 75 74  alled here.  But
18350 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61 6c  .    ** that cal
18360 6c 20 77 61 73 20 64 61 6e 67 65 72 6f 75 73 20  l was dangerous 
18370 61 6e 64 20 68 61 64 20 6e 6f 20 64 65 74 65 63  and had no detec
18380 74 61 62 6c 65 20 62 65 6e 65 66 69 74 20 73 69  table benefit si
18390 6e 63 65 20 74 68 65 20 63 61 63 68 65 0a 20 20  nce the cache.  
183a0 20 20 2a 2a 20 69 73 20 6e 6f 72 6d 61 6c 6c 79    ** is normally
183b0 20 63 6c 65 61 6e 65 64 20 62 79 20 73 71 6c 69   cleaned by sqli
183c0 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  te3PcacheCleanAl
183d0 6c 28 29 20 61 66 74 65 72 20 72 6f 6c 6c 62 61  l() after rollba
183e0 63 6b 20 61 6e 64 20 73 6f 0a 20 20 20 20 2a 2a  ck and so.    **
183f0 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65   has been remove
18400 64 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f  d. */.    pager_
18410 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50 67  set_pagehash(pPg
18420 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
18430 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74  is was page 1, t
18440 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20  hen restore the 
18450 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64  value of Pager.d
18460 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a  bFileVers..    *
18470 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65  * Do this before
18480 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a   any decoding. *
18490 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d  /.    if( pgno==
184a0 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  1 ){.      memcp
184b0 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
184c0 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44  eVers, &((u8*)pD
184d0 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28  ata)[24],sizeof(
184e0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
184f0 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rs));.    }..   
18500 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70   /* Decode the p
18510 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72  age just read fr
18520 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43  om disk */.    C
18530 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44  ODEC1(pPager, pD
18540 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
18550 33 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  3, rc=SQLITE_NOM
18560 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20 73 71  EM_BKPT);.    sq
18570 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
18580 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72  se(pPg);.  }.  r
18590 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
185a0 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61  ** Parameter zMa
185b0 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65  ster is the name
185c0 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
185d0 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e  rnal file. A sin
185e0 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  gle journal.** f
185f0 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65  ile that referre
18600 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  d to the master 
18610 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
18620 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65   just been rolle
18630 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20  d back..** This 
18640 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
18650 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
18660 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
18670 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
18680 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20  le,.** and does 
18690 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  so if it is..**.
186a0 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73  ** Argument zMas
186b0 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f  ter may point to
186c0 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
186d0 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66 65 72  . So that buffer
186e0 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69   is not .** avai
186f0 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69  lable for use wi
18700 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69  thin this functi
18710 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  on..**.** When a
18720 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
18730 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c  file is created,
18740 20 69 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64   it is populated
18750 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20   with the names 
18760 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74  .** of all of it
18770 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73  s child journals
18780 2c 20 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74  , one after anot
18790 68 65 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61  her, formatted a
187a0 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f  s utf-8 .** enco
187b0 64 65 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e  ded text. The en
187c0 64 20 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20  d of each child 
187d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
187e0 6d 61 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a  marked with a .*
187f0 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
18800 20 62 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e   byte (0x00). i.
18810 65 2e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  e. the entire co
18820 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74  ntents of a mast
18830 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  er journal.** fi
18840 6c 65 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  le for a transac
18850 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74  tion involving t
18860 77 6f 20 64 61 74 61 62 61 73 65 73 20 6d 69 67  wo databases mig
18870 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  ht be:.**.**   "
18880 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d  /home/bill/a.db-
18890 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65  journal\x00/home
188a0 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e  /bill/b.db-journ
188b0 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20  al\x00".**.** A 
188c0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
188d0 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ile may only be 
188e0 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c  deleted once all
188f0 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a   of its child .*
18900 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20  * journals have 
18910 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
18920 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
18930 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20  ction reads the 
18940 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
18950 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
18960 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d  ile into .** mem
18970 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68  ory and loops th
18980 72 6f 75 67 68 20 65 61 63 68 20 6f 66 20 74 68  rough each of th
18990 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  e child journal 
189a0 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61  names. For.** ea
189b0 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ch child journal
189c0 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a  , it checks if:.
189d0 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65  **.**   * if the
189e0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65   child journal e
189f0 78 69 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f  xists, and if so
18a00 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63  .**   * if the c
18a10 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e  hild journal con
18a20 74 61 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63  tains a referenc
18a30 65 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  e to master jour
18a40 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65  nal .**     file
18a50 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49   zMaster.**.** I
18a60 66 20 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  f a child journa
18a70 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74  l can be found t
18a80 68 61 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68  hat matches both
18a90 20 6f 66 20 74 68 65 20 63 72 69 74 65 72 69 61   of the criteria
18aa0 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20  .** above, this 
18ab0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
18ac0 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
18ad0 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69  nything. Otherwi
18ae0 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63  se, if.** no suc
18af0 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  h child journal 
18b00 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69  can be found, fi
18b10 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65  le zMaster is de
18b20 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68  leted from.** th
18b30 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73  e file-system us
18b40 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  ing sqlite3OsDel
18b50 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ete()..**.** If 
18b60 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68  an IO error with
18b70 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
18b80 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
18b90 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  is returned. Thi
18ba0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c  s.** function al
18bb0 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62  locates memory b
18bc0 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  y calling sqlite
18bd0 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e  3Malloc(). If an
18be0 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66   allocation.** f
18bf0 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  ails, SQLITE_NOM
18c00 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  EM is returned. 
18c10 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f  Otherwise, if no
18c20 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72   IO or malloc er
18c30 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20  rors .** occur, 
18c40 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
18c50 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44  urned..**.** TOD
18c60 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  O: This function
18c70 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e   allocates a sin
18c80 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d  gle block of mem
18c90 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74  ory to load.** t
18ca0 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
18cb0 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ts of the master
18cc0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
18cd0 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20  his could be.** 
18ce0 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f  a couple of kilo
18cf0 62 79 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f  bytes or so - po
18d00 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72  tentially larger
18d10 20 74 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a   than the page .
18d20 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  ** size..*/.stat
18d30 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c  ic int pager_del
18d40 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50  master(Pager *pP
18d50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
18d60 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71   *zMaster){.  sq
18d70 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
18d80 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
18d90 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
18da0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
18db0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
18dc0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d  sqlite3_file *pM
18dd0 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c  aster;    /* Mal
18de0 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75  loc'd master-jou
18df0 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
18e00 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ptor */.  sqlite
18e10 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c  3_file *pJournal
18e20 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20  ;   /* Malloc'd 
18e30 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69  child-journal fi
18e40 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
18e50 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
18e60 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20  Journal = 0; /* 
18e70 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74  Contents of mast
18e80 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
18e90 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72  */.  i64 nMaster
18ea0 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f  Journal;       /
18eb0 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72  * Size of master
18ec0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
18ed0 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
18ee0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l;           /* 
18ef0 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a  Pointer to one j
18f00 6f 75 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a  ournal within MJ
18f10 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
18f20 2a 7a 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20  *zMasterPtr;    
18f30 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f       /* Space to
18f40 20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d   hold MJ filenam
18f50 65 20 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c  e from a journal
18f60 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
18f70 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20  MasterPtr;      
18f80 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f       /* Amount o
18f90 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  f space allocate
18fa0 64 20 74 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b  d to zMasterPtr[
18fb0 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  ] */..  /* Alloc
18fc0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f  ate space for bo
18fd0 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20  th the pJournal 
18fe0 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65  and pMaster file
18ff0 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20   descriptors..  
19000 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
19010 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  , open the maste
19020 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  r journal file f
19030 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f  or reading..  */
19040 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71  .  pMaster = (sq
19050 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c  lite3_file *)sql
19060 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  ite3MallocZero(p
19070 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20  Vfs->szOsFile * 
19080 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d  2);.  pJournal =
19090 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
190a0 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72  )(((u8 *)pMaster
190b0 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ) + pVfs->szOsFi
190c0 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73  le);.  if( !pMas
190d0 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ter ){.    rc = 
190e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
190f0 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
19100 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
19110 3d 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  = .#if SQLITE_EN
19120 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43  ABLE_DATA_PROTEC
19130 54 49 4f 4e 0a 20 20 20 20 20 20 28 70 50 61 67  TION.      (pPag
19140 65 72 2d 3e 76 66 73 46 6c 61 67 73 26 53 51 4c  er->vfsFlags&SQL
19150 49 54 45 5f 4f 50 45 4e 5f 46 49 4c 45 50 52 4f  ITE_OPEN_FILEPRO
19160 54 45 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23  TECTION_MASK)|.#
19170 65 6e 64 69 66 0a 20 20 20 20 20 20 28 53 51 4c  endif.      (SQL
19180 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
19190 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
191a0 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  STER_JOURNAL);. 
191b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
191c0 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73  sOpen(pVfs, zMas
191d0 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c  ter, pMaster, fl
191e0 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  ags, 0);.  }.  i
191f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19200 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
19210 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20 4c 6f 61  r_out;..  /* Loa
19220 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  d the entire mas
19230 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19240 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61   into space obta
19250 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 73  ined from.  ** s
19260 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20  qlite3_malloc() 
19270 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  and pointed to b
19280 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  y zMasterJournal
19290 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61 69 6e 0a  .   Also obtain.
192a0 20 20 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20    ** sufficient 
192b0 73 70 61 63 65 20 28 69 6e 20 7a 4d 61 73 74 65  space (in zMaste
192c0 72 50 74 72 29 20 74 6f 20 68 6f 6c 64 20 74 68  rPtr) to hold th
192d0 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61 73 74 65  e names of maste
192e0 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  r.  ** journal f
192f0 69 6c 65 73 20 65 78 74 72 61 63 74 65 64 20 66  iles extracted f
19300 72 6f 6d 20 72 65 67 75 6c 61 72 20 72 6f 6c 6c  rom regular roll
19310 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73 2e 0a 20  back-journals.. 
19320 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
19330 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61  e3OsFileSize(pMa
19340 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f  ster, &nMasterJo
19350 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63  urnal);.  if( rc
19360 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
19370 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
19380 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74 72 20 3d  ;.  nMasterPtr =
19390 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
193a0 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65 72 4a 6f  e+1;.  zMasterJo
193b0 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 4d  urnal = sqlite3M
193c0 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75  alloc(nMasterJou
193d0 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74  rnal + nMasterPt
193e0 72 20 2b 20 31 29 3b 0a 20 20 69 66 28 20 21 7a  r + 1);.  if( !z
193f0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
19400 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
19410 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
19420 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
19430 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  out;.  }.  zMast
19440 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72  erPtr = &zMaster
19450 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
19460 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20 72 63 20  ournal+1];.  rc 
19470 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
19480 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72  pMaster, zMaster
19490 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d  Journal, (int)nM
194a0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29  asterJournal, 0)
194b0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
194c0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
194d0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 7a 4d  master_out;.  zM
194e0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61  asterJournal[nMa
194f0 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20 3d 20 30  sterJournal] = 0
19500 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20  ;..  zJournal = 
19510 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a  zMasterJournal;.
19520 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e    while( (zJourn
19530 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al-zMasterJourna
19540 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l)<nMasterJourna
19550 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 78 69  l ){.    int exi
19560 73 74 73 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  sts;.    rc = sq
19570 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
19580 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  fs, zJournal, SQ
19590 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
195a0 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20  TS, &exists);.  
195b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
195c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
195d0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
195e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
195f0 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 2f  xists ){.      /
19600 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75  * One of the jou
19610 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f  rnals pointed to
19620 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a   by the master j
19630 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20  ournal exists.. 
19640 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20       ** Open it 
19650 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20  and check if it 
19660 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61  points at the ma
19670 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
19680 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65  .      ** so, re
19690 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c  turn without del
196a0 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  eting the master
196b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
196c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
196d0 74 20 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 66  t c;.      int f
196e0 6c 61 67 73 20 3d 20 0a 23 69 66 20 53 51 4c 49  lags = .#if SQLI
196f0 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50  TE_ENABLE_DATA_P
19700 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20 20 20  ROTECTION.      
19710 20 20 28 70 50 61 67 65 72 2d 3e 76 66 73 46 6c    (pPager->vfsFl
19720 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
19730 46 49 4c 45 50 52 4f 54 45 43 54 49 4f 4e 5f 4d  FILEPROTECTION_M
19740 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a 20 20 20  ASK)|.#endif.   
19750 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45       (SQLITE_OPE
19760 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
19770 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
19780 4e 41 4c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  NAL);.      rc =
19790 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
197a0 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70  Vfs, zJournal, p
197b0 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20  Journal, flags, 
197c0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
197d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
197e0 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
197f0 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
19800 20 7d 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 72   }..      rc = r
19810 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
19820 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74  (pJournal, zMast
19830 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74  erPtr, nMasterPt
19840 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
19850 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61  3OsClose(pJourna
19860 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  l);.      if( rc
19870 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
19880 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
19890 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
198a0 20 7d 0a 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d   }..      c = zM
198b0 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26  asterPtr[0]!=0 &
198c0 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72  & strcmp(zMaster
198d0 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30  Ptr, zMaster)==0
198e0 3b 0a 20 20 20 20 20 20 69 66 28 20 63 20 29 7b  ;.      if( c ){
198f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68  .        /* We h
19900 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20  ave a match. Do 
19910 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
19920 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
19930 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 67  le. */.        g
19940 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
19950 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
19960 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d  .    zJournal +=
19970 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33   (sqlite3Strlen3
19980 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a  0(zJournal)+1);.
19990 20 20 7d 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f    }. .  sqlite3O
199a0 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b  sClose(pMaster);
199b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
199c0 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
199d0 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d  aster, 0);..delm
199e0 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c  aster_out:.  sql
199f0 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65  ite3_free(zMaste
19a00 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28  rJournal);.  if(
19a10 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20   pMaster ){.    
19a20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
19a30 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73  Master);.    ass
19a40 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f  ert( !isOpen(pJo
19a50 75 72 6e 61 6c 29 20 29 3b 0a 20 20 20 20 73 71  urnal) );.    sq
19a60 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73 74  lite3_free(pMast
19a70 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
19a80 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
19a90 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
19aa0 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20   used to change 
19ab0 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20  the actual size 
19ac0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
19ad0 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20  .** file in the 
19ae0 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69  file-system. Thi
19af0 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77  s only happens w
19b00 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  hen committing a
19b10 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a   transaction,.**
19b20 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   or rolling back
19b30 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28   a transaction (
19b40 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e  including rollin
19b50 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  g back a hot-jou
19b60 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rnal)..**.** If 
19b70 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
19b80 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70  e file is not op
19b90 65 6e 2c 20 6f 72 20 74 68 65 20 70 61 67 65 72  en, or the pager
19ba0 20 69 73 20 6e 6f 74 20 69 6e 20 65 69 74 68 65   is not in eithe
19bb0 72 0a 2a 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50  r.** DBMOD or OP
19bc0 45 4e 20 73 74 61 74 65 2c 20 74 68 69 73 20 66  EN state, this f
19bd0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
19be0 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  op. Otherwise, t
19bf0 68 65 20 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74  he size .** of t
19c00 68 65 20 66 69 6c 65 20 69 73 20 63 68 61 6e 67  he file is chang
19c10 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65  ed to nPage page
19c20 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d  s (nPage*pPager-
19c30 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 29  >pageSize bytes)
19c40 2e 20 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  . .** If the fil
19c50 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72  e on disk is cur
19c60 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68  rently larger th
19c70 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20  an nPage pages, 
19c80 74 68 65 6e 20 75 73 65 20 74 68 65 20 56 46 53  then use the VFS
19c90 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20  .** xTruncate() 
19ca0 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61  method to trunca
19cb0 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  te it..**.** Or,
19cc0 20 69 74 20 6d 69 67 68 74 20 62 65 20 74 68 65   it might be the
19cd0 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 66   case that the f
19ce0 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73  ile on disk is s
19cf0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20  maller than .** 
19d00 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53 6f 6d  nPage pages. Som
19d10 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
19d20 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  em implementatio
19d30 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75  ns can get confu
19d40 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74  sed if .** you t
19d50 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61  ry to truncate a
19d60 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69   file to some si
19d70 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65  ze that is large
19d80 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75  r than it .** cu
19d90 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64  rrently is, so d
19da0 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20  etect this case 
19db0 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e 67  and write a sing
19dc0 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20  le zero byte to 
19dd0 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74  .** the end of t
19de0 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e 73 74  he new file inst
19df0 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ead..**.** If su
19e00 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
19e10 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61   SQLITE_OK. If a
19e20 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
19e30 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e  s while modifyin
19e40 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  g.** the databas
19e50 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e 20 74  e file, return t
19e60 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  he error code to
19e70 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
19e80 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
19e90 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
19ea0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
19eb0 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
19ec0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
19ed0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
19ee0 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f  tate!=PAGER_ERRO
19ef0 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  R );.  assert( p
19f00 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
19f10 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
19f20 20 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70   .  if( isOpen(p
19f30 50 61 67 65 72 2d 3e 66 64 29 20 0a 20 20 20 26  Pager->fd) .   &
19f40 26 20 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74  & (pPager->eStat
19f50 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e>=PAGER_WRITER_
19f60 44 42 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d  DBMOD || pPager-
19f70 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
19f80 50 45 4e 29 20 0a 20 20 29 7b 0a 20 20 20 20 69  PEN) .  ){.    i
19f90 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20  64 currentSize, 
19fa0 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74  newSize;.    int
19fb0 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
19fc0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
19fd0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
19fe0 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
19ff0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 2f 2a 20  _LOCK );.    /* 
1a000 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66 65  TODO: Is it safe
1a010 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64 62   to use Pager.db
1a020 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20 2a  FileSize here? *
1a030 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
1a040 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
1a050 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e  ger->fd, &curren
1a060 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53  tSize);.    newS
1a070 69 7a 65 20 3d 20 73 7a 50 61 67 65 2a 28 69 36  ize = szPage*(i6
1a080 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28  4)nPage;.    if(
1a090 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1a0a0 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e  & currentSize!=n
1a0b0 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
1a0c0 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e  if( currentSize>
1a0d0 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
1a0e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1a0f0 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
1a100 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a  ->fd, newSize);.
1a110 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1a120 28 63 75 72 72 65 6e 74 53 69 7a 65 2b 73 7a 50  (currentSize+szP
1a130 61 67 65 29 3c 3d 6e 65 77 53 69 7a 65 20 29 7b  age)<=newSize ){
1a140 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
1a150 54 6d 70 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  Tmp = pPager->pT
1a160 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20 20  mpSpace;.       
1a170 20 6d 65 6d 73 65 74 28 70 54 6d 70 2c 20 30 2c   memset(pTmp, 0,
1a180 20 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20   szPage);.      
1a190 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77    testcase( (new
1a1a0 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3d 3d 20  Size-szPage) == 
1a1b0 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20  currentSize );. 
1a1c0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1a1d0 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65   (newSize-szPage
1a1e0 29 20 3e 20 20 63 75 72 72 65 6e 74 53 69 7a 65  ) >  currentSize
1a1f0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
1a200 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
1a210 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 54 6d 70  pPager->fd, pTmp
1a220 2c 20 73 7a 50 61 67 65 2c 20 6e 65 77 53 69 7a  , szPage, newSiz
1a230 65 2d 73 7a 50 61 67 65 29 3b 0a 20 20 20 20 20  e-szPage);.     
1a240 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
1a250 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a260 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
1a270 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65  FileSize = nPage
1a280 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a290 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1a2a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1a2b0 20 61 20 73 61 6e 69 74 69 7a 65 64 20 76 65 72   a sanitized ver
1a2c0 73 69 6f 6e 20 6f 66 20 74 68 65 20 73 65 63 74  sion of the sect
1a2d0 6f 72 2d 73 69 7a 65 20 6f 66 20 4f 53 20 66 69  or-size of OS fi
1a2e0 6c 65 20 70 46 69 6c 65 2e 20 54 68 65 0a 2a 2a  le pFile. The.**
1a2f0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1a300 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c   guaranteed to l
1a310 69 65 20 62 65 74 77 65 65 6e 20 33 32 20 61 6e  ie between 32 an
1a320 64 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  d MAX_SECTOR_SIZ
1a330 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
1a340 33 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  3SectorSize(sqli
1a350 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29  te3_file *pFile)
1a360 7b 0a 20 20 69 6e 74 20 69 52 65 74 20 3d 20 73  {.  int iRet = s
1a370 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
1a380 7a 65 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  ze(pFile);.  if(
1a390 20 69 52 65 74 3c 33 32 20 29 7b 0a 20 20 20 20   iRet<32 ){.    
1a3a0 69 52 65 74 20 3d 20 35 31 32 3b 0a 20 20 7d 65  iRet = 512;.  }e
1a3b0 6c 73 65 20 69 66 28 20 69 52 65 74 3e 4d 41 58  lse if( iRet>MAX
1a3c0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a  _SECTOR_SIZE ){.
1a3d0 20 20 20 20 61 73 73 65 72 74 28 20 4d 41 58 5f      assert( MAX_
1a3e0 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32  SECTOR_SIZE>=512
1a3f0 20 29 3b 0a 20 20 20 20 69 52 65 74 20 3d 20 4d   );.    iRet = M
1a400 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  AX_SECTOR_SIZE;.
1a410 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52 65    }.  return iRe
1a420 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  t;.}../*.** Set 
1a430 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1a440 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
1a450 65 20 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74  e variable for t
1a460 68 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65  he given.** page
1a470 72 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76  r based on the v
1a480 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
1a490 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65   the xSectorSize
1a4a0 20 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68   method.** of th
1a4b0 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
1a4c0 66 69 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72  file. The sector
1a4d0 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73   size will be us
1a4e0 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d  ed .** to determ
1a4f0 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64  ine the size and
1a500 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f   alignment of jo
1a510 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64  urnal header and
1a520 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72   .** master jour
1a530 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74  nal pointers wit
1a540 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72  hin created jour
1a550 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  nal files..**.**
1a560 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   For temporary f
1a570 69 6c 65 73 20 74 68 65 20 65 66 66 65 63 74 69  iles the effecti
1a580 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  ve sector size i
1a590 73 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74  s always 512 byt
1a5a0 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  es..**.** Otherw
1a5b0 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d  ise, for non-tem
1a5c0 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68  porary files, th
1a5d0 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
1a5e0 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68  or size is.** th
1a5f0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
1a600 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53   by the xSectorS
1a610 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75  ize() method rou
1a620 6e 64 65 64 20 75 70 20 74 6f 20 33 32 20 69 66  nded up to 32 if
1a630 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20 74  .** it is less t
1a640 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64  han 32, or round
1a650 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53  ed down to MAX_S
1a660 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74  ECTOR_SIZE if it
1a670 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
1a680 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  han MAX_SECTOR_S
1a690 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  IZE..**.** If th
1a6a0 65 20 66 69 6c 65 20 68 61 73 20 74 68 65 20 53  e file has the S
1a6b0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45  QLITE_IOCAP_POWE
1a6c0 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20  RSAFE_OVERWRITE 
1a6d0 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 73  property, then s
1a6e0 65 74 0a 2a 2a 20 74 68 65 20 65 66 66 65 63 74  et.** the effect
1a6f0 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  ive sector size 
1a700 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d 20 76  to its minimum v
1a710 61 6c 75 65 20 28 35 31 32 29 2e 20 20 54 68 65  alue (512).  The
1a720 20 70 75 72 70 6f 73 65 20 6f 66 0a 2a 2a 20 70   purpose of.** p
1a730 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
1a740 65 20 69 73 20 74 6f 20 64 65 66 69 6e 65 20 74  e is to define t
1a750 68 65 20 22 62 6c 61 73 74 20 72 61 64 69 75 73  he "blast radius
1a760 22 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 0a  " of bytes that.
1a770 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ** might change 
1a780 69 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72  if a crash occur
1a790 73 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  s while writing 
1a7a0 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  to a single byte
1a7b0 20 69 6e 0a 2a 2a 20 74 68 61 74 20 72 61 6e 67   in.** that rang
1a7c0 65 2e 20 20 42 75 74 20 77 69 74 68 20 50 4f 57  e.  But with POW
1a7d0 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
1a7e0 2c 20 74 68 65 20 62 6c 61 73 74 20 72 61 64 69  , the blast radi
1a7f0 75 73 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 74  us is zero.** (t
1a800 68 61 74 20 69 73 20 77 68 61 74 20 50 4f 57 45  hat is what POWE
1a810 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20  RSAFE_OVERWRITE 
1a820 6d 65 61 6e 73 29 2c 20 73 6f 20 77 65 20 6d 69  means), so we mi
1a830 6e 69 6d 69 7a 65 20 74 68 65 20 73 65 63 74 6f  nimize the secto
1a840 72 0a 2a 2a 20 73 69 7a 65 2e 20 20 46 6f 72 20  r.** size.  For 
1a850 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
1a860 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 72  ibility of the r
1a870 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
1a880 66 69 6c 65 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20  file format,.** 
1a890 77 65 20 63 61 6e 6e 6f 74 20 72 65 64 75 63 65  we cannot reduce
1a8a0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
1a8b0 65 63 74 6f 72 20 73 69 7a 65 20 62 65 6c 6f 77  ector size below
1a8c0 20 35 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   512..*/.static 
1a8d0 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53 69  void setSectorSi
1a8e0 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
1a8f0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  ){.  assert( isO
1a900 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1a910 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
1a920 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 50  ile );..  if( pP
1a930 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20  ager->tempFile. 
1a940 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44    || (sqlite3OsD
1a950 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1a960 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
1a970 20 26 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   & .            
1a980 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50    SQLITE_IOCAP_P
1a990 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1a9a0 54 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  TE)!=0.  ){.    
1a9b0 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64  /* Sector size d
1a9c0 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f  oesn't matter fo
1a9d0 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
1a9e0 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c  s. Also, the fil
1a9f0 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74  e.    ** may not
1aa00 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
1aa10 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20  d yet, in which 
1aa20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f  case the OsSecto
1aa30 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63  rSize().    ** c
1aa40 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c  all will segfaul
1aa50 74 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72  t. */.    pPager
1aa60 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35  ->sectorSize = 5
1aa70 31 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  12;.  }else{.   
1aa80 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
1aa90 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 53 65 63  ize = sqlite3Sec
1aaa0 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  torSize(pPager->
1aab0 66 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  fd);.  }.}../*.*
1aac0 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a  * Playback the j
1aad0 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20  ournal and thus 
1aae0 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
1aaf0 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20  base file to.** 
1ab00 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73  the state it was
1ab10 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74   in before we st
1ab20 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61  arted making cha
1ab30 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  nges.  .**.** Th
1ab40 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
1ab50 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c  ormat is as foll
1ab60 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29  ows: .**.**  (1)
1ab70 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e    8 byte prefix.
1ab80 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75    A copy of aJou
1ab90 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20  rnalMagic[]..** 
1aba0 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67   (2)  4 byte big
1abb0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
1abc0 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
1abd0 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67  ber of valid pag
1abe0 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20  e records.**    
1abf0 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61     in the journa
1ac00 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75  l.  If this valu
1ac10 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  e is 0xffffffff,
1ac20 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68   then compute th
1ac30 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65  e.**       numbe
1ac40 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
1ac50 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  s from the journ
1ac60 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29  al size..**  (3)
1ac70 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
1ac80 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
1ac90 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  h is the initial
1aca0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a   value for the .
1acb0 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20  **       sanity 
1acc0 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34  checksum..**  (4
1acd0 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65  )  4 byte intege
1ace0 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
1acf0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
1ad00 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a  o truncate the.*
1ad10 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65  *       database
1ad20 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c   to during a rol
1ad30 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20  lback..**  (5)  
1ad40 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
1ad50 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
1ad60 69 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  is the sector si
1ad70 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a  ze.  The header.
1ad80 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68 69 73  **       is this
1ad90 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73   many bytes in s
1ada0 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20  ize..**  (6)  4 
1adb0 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
1adc0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1add0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a   the page size..
1ade0 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61  **  (7)  zero pa
1adf0 64 64 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65  dding out to the
1ae00 20 6e 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a   next sector siz
1ae10 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f  e..**  (8)  Zero
1ae20 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69   or more pages i
1ae30 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61  nstances, each a
1ae40 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20  s follows:.**   
1ae50 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70       +  4 byte p
1ae60 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20  age number..**  
1ae70 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d        +  pPager-
1ae80 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
1ae90 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20  of data..**     
1aea0 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65     +  4 byte che
1aeb0 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  cksum.**.** When
1aec0 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65   we speak of the
1aed0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c   journal header,
1aee0 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72   we mean the fir
1aef0 73 74 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65  st 7 items above
1af00 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20  ..** Each entry 
1af10 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
1af20 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
1af30 20 74 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a   the 8th item..*
1af40 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61  *.** Call the va
1af50 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63  lue from the sec
1af60 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63  ond bullet "nRec
1af70 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20  ".  nRec is the 
1af80 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c  number of.** val
1af90 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20  id page entries 
1afa0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
1afb0 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20   In most cases, 
1afc0 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20  you can compute 
1afd0 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
1afe0 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69  nRec from the si
1aff0 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
1b000 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20  l file.  But if 
1b010 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  a power.** failu
1b020 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
1b030 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  e the journal wa
1b040 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
1b050 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65   it could be the
1b060 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68  .** case that th
1b070 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
1b080 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61  urnal file had a
1b090 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
1b0a0 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65  eased but.** the
1b0b0 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68   extra entries h
1b0c0 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20  ad not yet made 
1b0d0 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73  it safely to dis
1b0e0 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61  k.  In such a ca
1b0f0 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  se,.** the value
1b100 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65   of nRec compute
1b110 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  d from the file 
1b120 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  size would be to
1b130 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a  o large.  For.**
1b140 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65   that reason, we
1b150 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
1b160 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68  nRec value in th
1b170 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
1b180 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  If the nRec valu
1b190 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20  e is 0xffffffff 
1b1a0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52  it means that nR
1b1b0 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ec should be com
1b1c0 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68  puted.** from th
1b1d0 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68  e file size.  Th
1b1e0 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  is value is used
1b1f0 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73   when the user s
1b200 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f  elects the.** no
1b210 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72  -sync option for
1b220 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
1b230 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
1b240 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72  ould lead to cor
1b250 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  ruption.** in th
1b260 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f  is case.  But fo
1b270 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65  r things like te
1b280 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77  mporary table (w
1b290 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  hich will be.** 
1b2a0 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
1b2b0 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
1b2c0 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72  ed) we don't car
1b2d0 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e.  .**.** If th
1b2e0 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73  e file opened as
1b2f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b300 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d  e is not a well-
1b310 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61  formed.** journa
1b320 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20  l file then all 
1b330 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20  pages up to the 
1b340 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20  first corrupted 
1b350 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a  page are rolled.
1b360 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70  ** back (or no p
1b370 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72  ages if the jour
1b380 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f  nal header is co
1b390 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f  rrupted). The jo
1b3a0 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
1b3b0 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e   then deleted an
1b3c0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
1b3d0 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66  rned, just as if
1b3e0 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68   no corruption h
1b3f0 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75  ad.** been encou
1b400 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntered..**.** If
1b410 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f   an I/O or mallo
1b420 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73  c() error occurs
1b430 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69  , the journal-fi
1b440 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65  le is not delete
1b450 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  d.** and an erro
1b460 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1b470 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73  ed..**.** The is
1b480 48 6f 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e  Hot parameter in
1b490 64 69 63 61 74 65 73 20 74 68 61 74 20 77 65 20  dicates that we 
1b4a0 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f  are trying to ro
1b4b0 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  llback a journal
1b4c0 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62  .** that might b
1b4d0 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e  e a hot journal.
1b4e0 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62    Or, it could b
1b4f0 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
1b500 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72  al is .** preser
1b510 76 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a  ved because of J
1b520 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
1b530 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44  ST or JOURNALMOD
1b540 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49  E_TRUNCATE..** I
1b550 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  f the journal re
1b560 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73  ally is hot, res
1b570 65 74 20 74 68 65 20 70 61 67 65 72 20 63 61 63  et the pager cac
1b580 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67  he prior rolling
1b590 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e  .** back any con
1b5a0 74 65 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f  tent.  If the jo
1b5b0 75 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20  urnal is merely 
1b5c0 70 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72  persistent, no r
1b5d0 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65  eset is.** neede
1b5e0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1b5f0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
1b600 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
1b610 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c  nt isHot){.  sql
1b620 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
1b630 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
1b640 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
1b650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1b660 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
1b670 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
1b680 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20  /.  u32 nRec;   
1b690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b6a0 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
1b6b0 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
1b6c0 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20   */.  u32 u;    
1b6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b6e0 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
1b6f0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e  counter */.  Pgn
1b700 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20  o mxPg = 0;     
1b710 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1b720 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69   the original fi
1b730 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20  le in pages */. 
1b740 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1b750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1b760 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75  ult code of a su
1b770 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
1b780 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20  t res = 1;      
1b790 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1b7a0 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
1b7b0 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f  te3OsAccess() */
1b7c0 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
1b7d0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
1b7e0 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ame of master jo
1b7f0 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e  urnal file if an
1b800 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50  y */.  int needP
1b810 61 67 65 72 52 65 73 65 74 3b 20 20 20 20 20 20  agerReset;      
1b820 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74  /* True to reset
1b830 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66   page prior to f
1b840 69 72 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61  irst page rollba
1b850 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6c 61  ck */.  int nPla
1b860 79 62 61 63 6b 20 3d 20 30 3b 20 20 20 20 20 20  yback = 0;      
1b870 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
1b880 20 6f 66 20 70 61 67 65 73 20 72 65 73 74 6f 72   of pages restor
1b890 65 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  ed from journal 
1b8a0 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
1b8b0 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
1b8c0 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
1b8d0 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20  journal.  Abort 
1b8e0 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68  early if.  ** th
1b8f0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70  e journal is emp
1b900 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ty..  */.  asser
1b910 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
1b920 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d  ->jfd) );.  rc =
1b930 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
1b940 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
1b950 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
1b960 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b970 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1b980 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ack;.  }..  /* R
1b990 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ead the master j
1b9a0 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d  ournal name from
1b9b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66   the journal, if
1b9c0 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a   it is present..
1b9d0 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72    ** If a master
1b9e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
1b9f0 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
1ba00 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73   but the file is
1ba10 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e   not.  ** presen
1ba20 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20  t on disk, then 
1ba30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
1ba40 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20  ot hot and does 
1ba50 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
1ba60 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   ** played back.
1ba70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a  .  **.  ** TODO:
1ba80 20 54 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65   Technically the
1ba90 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e   following is an
1baa0 20 65 72 72 6f 72 20 62 65 63 61 75 73 65 20 69   error because i
1bab0 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20  t assumes that. 
1bac0 20 2a 2a 20 62 75 66 66 65 72 20 50 61 67 65 72   ** buffer Pager
1bad0 2e 70 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d  .pTmpSpace is (m
1bae0 78 50 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74  xPathname+1) byt
1baf0 65 73 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e  es or larger. i.
1bb00 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50  e. that.  ** (pP
1bb10 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e  ager->pageSize >
1bb20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  = pPager->pVfs->
1bb30 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55  mxPathname+1). U
1bb40 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a  sing os_unix.c,.
1bb50 20 20 2a 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20    ** mxPathname 
1bb60 69 73 20 35 31 32 2c 20 77 68 69 63 68 20 69 73  is 512, which is
1bb70 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
1bb80 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62   minimum allowab
1bb90 6c 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f  le value.  ** fo
1bba0 72 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f  r pageSize..  */
1bbb0 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61  .  zMaster = pPa
1bbc0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
1bbd0 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
1bbe0 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
1bbf0 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
1bc00 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
1bc10 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66  athname+1);.  if
1bc20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1bc30 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b  && zMaster[0] ){
1bc40 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1bc50 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
1bc60 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  zMaster, SQLITE_
1bc70 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
1bc80 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73  res);.  }.  zMas
1bc90 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  ter = 0;.  if( r
1bca0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1bcb0 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f  !res ){.    goto
1bcc0 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1bcd0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
1bce0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e  rnalOff = 0;.  n
1bcf0 65 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20  eedPagerReset = 
1bd00 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69  isHot;..  /* Thi
1bd10 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65  s loop terminate
1bd20 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 61 20  s either when a 
1bd30 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29  readJournalHdr()
1bd40 20 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f   or .  ** pager_
1bd50 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
1bd60 65 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  e() call returns
1bd70 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
1bd80 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a  an IO error .  *
1bd90 2a 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a  * occurs. .  */.
1bda0 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
1bdb0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65    /* Read the ne
1bdc0 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  xt journal heade
1bdd0 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  r from the journ
1bde0 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  al file.  If the
1bdf0 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f  re are.    ** no
1be00 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c  t enough bytes l
1be10 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  eft in the journ
1be20 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f  al file for a co
1be30 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f  mplete header, o
1be40 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63  r.    ** it is c
1be50 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61  orrupted, then a
1be60 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 68 61   process must ha
1be70 76 65 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20  ve failed while 
1be80 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
1be90 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65  ** This indicate
1bea0 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e  s nothing more n
1beb0 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
1bec0 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  d back..    */. 
1bed0 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
1bee0 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 69  nalHdr(pPager, i
1bef0 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63  sHot, szJ, &nRec
1bf00 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66  , &mxPg);.    if
1bf10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1bf20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63  ){ .      if( rc
1bf30 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
1bf40 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1bf50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
1bf60 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
1bf70 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
1bf80 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
1bf90 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
1bfa0 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  hen this journal
1bfb0 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
1bfc0 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a  a process.    **
1bfd0 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73   working in no-s
1bfe0 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d  ync mode. This m
1bff0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65  eans that the re
1c000 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  st of the journa
1c010 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f  l.    ** file co
1c020 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c  nsists of pages,
1c030 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
1c040 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  re journal heade
1c050 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20  rs. Compute.    
1c060 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
1c070 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68  nRec based on th
1c080 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20  is assumption.. 
1c090 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
1c0a0 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29  ec==0xffffffff )
1c0b0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1c0c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1c0d0 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
1c0e0 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
1c0f0 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29      nRec = (int)
1c100 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f  ((szJ - JOURNAL_
1c110 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f  HDR_SZ(pPager))/
1c120 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
1c130 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  ager));.    }.. 
1c140 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
1c150 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c   0 and this roll
1c160 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61  back is of a tra
1c170 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64  nsaction created
1c180 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   by this.    ** 
1c190 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74  process and if t
1c1a0 68 69 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c  his is the final
1c1b0 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a   header in the j
1c1c0 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20  ournal, then it 
1c1d0 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61  means.    ** tha
1c1e0 74 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74  t this part of t
1c1f0 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
1c200 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20  eing filled but 
1c210 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
1c220 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74  .    ** synced t
1c230 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65  o disk.  Compute
1c240 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1c250 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68  ages based on th
1c260 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20  e remaining.    
1c270 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  ** size of the f
1c280 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
1c290 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74 65 72  ** The third ter
1c2a0 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20 77 61  m of the test wa
1c2b0 73 20 61 64 64 65 64 20 74 6f 20 66 69 78 20 74  s added to fix t
1c2c0 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20  icket #2565..   
1c2d0 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67   ** When rolling
1c2e0 20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72   back a hot jour
1c2f0 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77  nal, nRec==0 alw
1c300 61 79 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  ays means that t
1c310 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63  he next.    ** c
1c320 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72  hunk of the jour
1c330 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72  nal contains zer
1c340 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f  o pages to be ro
1c350 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a  lled back.  But.
1c360 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e      ** when doin
1c370 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64  g a ROLLBACK and
1c380 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75   the nRec==0 chu
1c390 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74 20 63  nk is the last c
1c3a0 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74  hunk in.    ** t
1c3b0 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d  he journal, it m
1c3c0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f  eans that the jo
1c3d0 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
1c3e0 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20  ain additional. 
1c3f0 20 20 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74     ** pages that
1c400 20 6e 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c   need to be roll
1c410 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74  ed back and that
1c420 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1c430 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f  ages .    ** sho
1c440 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20  uld be computed 
1c450 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  based on the jou
1c460 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a  rnal file size..
1c470 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
1c480 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74  Rec==0 && !isHot
1c490 20 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67   &&.        pPag
1c4a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
1c4b0 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
1c4c0 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
1c4d0 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
1c4e0 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28     nRec = (int)(
1c4f0 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
1c500 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55  ournalOff) / JOU
1c510 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
1c520 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  r));.    }..    
1c530 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
1c540 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72  e first header r
1c550 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
1c560 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74  rnal, truncate t
1c570 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
1c580 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20  se file back to 
1c590 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
1c5a0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1c5b0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1c5c0 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
1c5d0 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a  R_SZ(pPager) ){.
1c5e0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1c5f0 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
1c600 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69  , mxPg);.      i
1c610 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1c620 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
1c630 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1c640 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
1c650 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78  ger->dbSize = mx
1c660 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  Pg;.    }..    /
1c670 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
1c680 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
1c690 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63   journal and bac
1c6a0 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20  k into the .    
1c6b0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1c6c0 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63 61 63   and/or page cac
1c6d0 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  he..    */.    f
1c6e0 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20  or(u=0; u<nRec; 
1c6f0 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  u++){.      if( 
1c700 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20 29  needPagerReset )
1c710 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
1c720 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
1c730 20 20 20 20 20 20 20 6e 65 65 64 50 61 67 65 72         needPager
1c740 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  Reset = 0;.     
1c750 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61   }.      rc = pa
1c760 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
1c770 5f 70 61 67 65 28 70 50 61 67 65 72 2c 26 70 50  _page(pPager,&pP
1c780 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1c790 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20 20 20 69  ,0,1,0);.      i
1c7a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c7b0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 50 6c 61   ){.        nPla
1c7c0 79 62 61 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 7d  yback++;.      }
1c7d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
1c7e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
1c7f0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  E ){.          p
1c800 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1c810 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20  f = szJ;.       
1c820 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1c830 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
1c840 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
1c850 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
1c860 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a       /* If the j
1c870 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20  ournal has been 
1c880 74 72 75 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c  truncated, simpl
1c890 79 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 61  y stop reading a
1c8a0 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nd.          ** 
1c8b0 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20 6a  processing the j
1c8c0 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67  ournal. This mig
1c8d0 68 74 20 68 61 70 70 65 6e 20 69 66 20 74 68 65  ht happen if the
1c8e0 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20   journal was.   
1c8f0 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f         ** not co
1c900 6d 70 6c 65 74 65 6c 79 20 77 72 69 74 74 65 6e  mpletely written
1c910 20 61 6e 64 20 73 79 6e 63 65 64 20 70 72 69 6f   and synced prio
1c920 72 20 74 6f 20 61 20 63 72 61 73 68 2e 20 20 49  r to a crash.  I
1c930 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20  n that.         
1c940 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 20 64 61   ** case, the da
1c950 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 68 61  tabase should ha
1c960 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72  ve never been wr
1c970 69 74 74 65 6e 20 69 6e 20 74 68 65 0a 20 20 20  itten in the.   
1c980 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20         ** first 
1c990 70 6c 61 63 65 20 73 6f 20 69 74 20 69 73 20 4f  place so it is O
1c9a0 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e  K to simply aban
1c9b0 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  don the rollback
1c9c0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1c9d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1c9e0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
1c9f0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
1ca00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ca10 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72       /* If we ar
1ca20 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c  e unable to roll
1ca30 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64 20 72  back, quit and r
1ca40 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 0a  eturn the error.
1ca50 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64            ** cod
1ca60 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61  e.  This will ca
1ca70 75 73 65 20 74 68 65 20 70 61 67 65 72 20 74 6f  use the pager to
1ca80 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72   enter the error
1ca90 20 73 74 61 74 65 0a 20 20 20 20 20 20 20 20 20   state.         
1caa0 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20 66   ** so that no f
1cab0 75 72 74 68 65 72 20 68 61 72 6d 20 77 69 6c 6c  urther harm will
1cac0 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72 68 61   be done.  Perha
1cad0 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20  ps the next.    
1cae0 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
1caf0 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77   to come along w
1cb00 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 72  ill be able to r
1cb10 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61 74 61  ollback the data
1cb20 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20  base..          
1cb30 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  */.          got
1cb40 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
1cb50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1cb60 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  }.    }.  }.  /*
1cb70 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61  NOTREACHED*/.  a
1cb80 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64  ssert( 0 );..end
1cb90 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20  _playback:.  /* 
1cba0 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c  Following a roll
1cbb0 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61  back, the databa
1cbc0 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  se file should b
1cbd0 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20 6f 72  e back in its or
1cbe0 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74  iginal.  ** stat
1cbf0 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  e prior to the s
1cc00 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
1cc10 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f  saction, so invo
1cc20 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49  ke the.  ** SQLI
1cc30 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
1cc40 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72  ANGED file-contr
1cc50 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64 69 73  ol method to dis
1cc60 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61 73  able the.  ** as
1cc70 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74 68 65  sertion that the
1cc80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1cc90 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66 69 65  nter was modifie
1cca0 64 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  d..  */.#ifdef S
1ccb0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66  QLITE_DEBUG.  if
1ccc0 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  ( pPager->fd->pM
1ccd0 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 73 71  ethods ){.    sq
1cce0 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
1ccf0 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66  olHint(pPager->f
1cd00 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  d,SQLITE_FCNTL_D
1cd10 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29 3b 0a  B_UNCHANGED,0);.
1cd20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1cd30 20 49 66 20 74 68 69 73 20 70 6c 61 79 62 61 63   If this playbac
1cd40 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61  k is happening a
1cd50 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20  utomatically as 
1cd60 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49  a result of an I
1cd70 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f  O or .  ** mallo
1cd80 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63  c error that occ
1cd90 75 72 72 65 64 20 61 66 74 65 72 20 74 68 65 20  urred after the 
1cda0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77  change-counter w
1cdb0 61 73 20 75 70 64 61 74 65 64 20 62 75 74 20 0a  as updated but .
1cdc0 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20    ** before the 
1cdd0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
1cde0 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20  committed, then 
1cdf0 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1ce00 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63  er .  ** modific
1ce10 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68  ation may just h
1ce20 61 76 65 20 62 65 65 6e 20 72 65 76 65 72 74 65  ave been reverte
1ce30 64 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65  d. If this happe
1ce40 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ns in exclusive 
1ce50 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e  .  ** mode, then
1ce60 20 73 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e   subsequent tran
1ce70 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d  sactions perform
1ce80 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63  ed by the connec
1ce90 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20  tion will not.  
1cea0 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20 63 68  ** update the ch
1ceb0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20  ange-counter at 
1cec0 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65  all. This may le
1ced0 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f  ad to cache inco
1cee0 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70  nsistency.  ** p
1cef0 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65  roblems for othe
1cf00 72 20 70 72 6f 63 65 73 73 65 73 20 61 74 20 73  r processes at s
1cf10 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  ome point in the
1cf20 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73   future. So, jus
1cf30 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74  t.  ** in case t
1cf40 68 69 73 20 68 61 73 20 68 61 70 70 65 6e 65 64  his has happened
1cf50 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e  , clear the chan
1cf60 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67  geCountDone flag
1cf70 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61   now..  */.  pPa
1cf80 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
1cf90 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
1cfa0 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20  empFile;..  if( 
1cfb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1cfc0 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  .    zMaster = p
1cfd0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
1cfe0 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d  ;.    rc = readM
1cff0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
1d000 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
1d010 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
1d020 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
1d030 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
1d040 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1d050 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1d060 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50  ITE_OK.   && (pP
1d070 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
1d080 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
1d090 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
1d0a0 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a  te==PAGER_OPEN).
1d0b0 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71    ){.    rc = sq
1d0c0 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 70  lite3PagerSync(p
1d0d0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20  Pager, 0);.  }. 
1d0e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d0f0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
1d100 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
1d110 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61  tion(pPager, zMa
1d120 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 2c 20 30  ster[0]!='\0', 0
1d130 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1d140 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d150 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1d160 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
1d170 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29  ster[0] && res )
1d180 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
1d190 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a  e was a master j
1d1a0 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20  ournal and this 
1d1b0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
1d1c0 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20  urn success,.   
1d1d0 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
1d1e0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
1d1f0 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
1d200 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20  ournal..    */. 
1d210 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65     rc = pager_de
1d220 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20  lmaster(pPager, 
1d230 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65  zMaster);.    te
1d240 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1d250 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69  TE_OK );.  }.  i
1d260 66 28 20 69 73 48 6f 74 20 26 26 20 6e 50 6c 61  f( isHot && nPla
1d270 79 62 61 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c  yback ){.    sql
1d280 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
1d290 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52  NOTICE_RECOVER_R
1d2a0 4f 4c 4c 42 41 43 4b 2c 20 22 72 65 63 6f 76 65  OLLBACK, "recove
1d2b0 72 65 64 20 25 64 20 70 61 67 65 73 20 66 72 6f  red %d pages fro
1d2c0 6d 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  m %s",.         
1d2d0 20 20 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b         nPlayback
1d2e0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
1d2f0 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  al);.  }..  /* T
1d300 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  he Pager.sectorS
1d310 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79  ize variable may
1d320 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74   have been updat
1d330 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67  ed while rolling
1d340 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75  .  ** back a jou
1d350 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20  rnal created by 
1d360 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61  a process with a
1d370 20 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f   different secto
1d380 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75  r size.  ** valu
1d390 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74  e. Reset it to t
1d3a0 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65  he correct value
1d3b0 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73   for this proces
1d3c0 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63  s..  */.  setSec
1d3d0 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
1d3e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d3f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
1d400 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67   content for pag
1d410 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65  e pPg out of the
1d420 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
1d430 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d  nd into .** pPg-
1d440 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72 65 64  >pData. A shared
1d450 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72   lock or greater
1d460 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e   must be held on
1d470 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
1d480 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69   file before thi
1d490 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1d4a0 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  lled..**.** If p
1d4b0 61 67 65 20 31 20 69 73 20 72 65 61 64 2c 20 74  age 1 is read, t
1d4c0 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hen the value of
1d4d0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
1d4e0 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a  s[] is set to.**
1d4f0 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
1d500 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1d510 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
1d520 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
1d530 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  urs, then the IO
1d540 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
1d550 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
1d560 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
1d570 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1d580 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1d590 20 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28   int readDbPage(
1d5a0 50 67 48 64 72 20 2a 70 50 67 2c 20 75 33 32 20  PgHdr *pPg, u32 
1d5b0 69 46 72 61 6d 65 29 7b 0a 20 20 50 61 67 65 72  iFrame){.  Pager
1d5c0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1d5d0 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72  pPager; /* Pager
1d5e0 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74   object associat
1d5f0 65 64 20 77 69 74 68 20 70 61 67 65 20 70 50 67  ed with page pPg
1d600 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20   */.  Pgno pgno 
1d610 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20  = pPg->pgno;    
1d620 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
1d630 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69  r to read */.  i
1d640 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1d650 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  K;          /* R
1d660 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1d670 69 6e 74 20 70 67 73 7a 20 3d 20 70 50 61 67 65  int pgsz = pPage
1d680 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 2f 2a 20  r->pageSize; /* 
1d690 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1d6a0 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73  to read */..  as
1d6b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
1d6c0 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
1d6d0 45 52 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a  ER && !MEMDB );.
1d6e0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1d6f0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
1d700 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d710 4f 4d 49 54 5f 57 41 4c 0a 20 20 69 66 28 20 69  OMIT_WAL.  if( i
1d720 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20  Frame ){.    /* 
1d730 54 72 79 20 74 6f 20 70 75 6c 6c 20 74 68 65 20  Try to pull the 
1d740 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 77 72  page from the wr
1d750 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 2e 20 2a  ite-ahead log. *
1d760 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
1d770 65 33 57 61 6c 52 65 61 64 46 72 61 6d 65 28 70  e3WalReadFrame(p
1d780 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 69 46 72  Pager->pWal, iFr
1d790 61 6d 65 2c 20 70 67 73 7a 2c 20 70 50 67 2d 3e  ame, pgsz, pPg->
1d7a0 70 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73 65 0a  pData);.  }else.
1d7b0 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 69  #endif.  {.    i
1d7c0 36 34 20 69 4f 66 66 73 65 74 20 3d 20 28 70 67  64 iOffset = (pg
1d7d0 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
1d7e0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
1d7f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
1d800 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
1d810 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a  pPg->pData, pgsz
1d820 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20  , iOffset);.    
1d830 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
1d840 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
1d850 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1d860 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1d870 20 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   }..  if( pgno==
1d880 31 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 20  1 ){.    if( rc 
1d890 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
1d8a0 68 65 20 72 65 61 64 20 69 73 20 75 6e 73 75 63  he read is unsuc
1d8b0 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65  cessful, set the
1d8c0 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f   dbFileVers[] to
1d8d0 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20 20   something.     
1d8e0 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e 65   ** that will ne
1d8f0 76 65 72 20 62 65 20 61 20 76 61 6c 69 64 20 66  ver be a valid f
1d900 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20 64 62  ile version.  db
1d910 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 61 20  FileVers[] is a 
1d920 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66  copy.      ** of
1d930 20 62 79 74 65 73 20 32 34 2e 2e 33 39 20 6f 66   bytes 24..39 of
1d940 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1d950 42 79 74 65 73 20 32 38 2e 2e 33 31 20 73 68 6f  Bytes 28..31 sho
1d960 75 6c 64 20 61 6c 77 61 79 73 20 62 65 0a 20 20  uld always be.  
1d970 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74      ** zero or t
1d980 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
1d990 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 2e  atabase in page.
1d9a0 20 42 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e   Bytes 32..35 an
1d9b0 64 20 33 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a  d 35..39.      *
1d9c0 2a 20 73 68 6f 75 6c 64 20 62 65 20 70 61 67 65  * should be page
1d9d0 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61   numbers which a
1d9e0 72 65 20 6e 65 76 65 72 20 30 78 66 66 66 66 66  re never 0xfffff
1d9f0 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67  fff.  So filling
1da00 0a 20 20 20 20 20 20 2a 2a 20 70 50 61 67 65 72  .      ** pPager
1da10 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 77  ->dbFileVers[] w
1da20 69 74 68 20 61 6c 6c 20 30 78 66 66 20 62 79 74  ith all 0xff byt
1da30 65 73 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63  es should suffic
1da40 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
1da50 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72    ** For an encr
1da60 79 70 74 65 64 20 64 61 74 61 62 61 73 65 2c 20  ypted database, 
1da70 74 68 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73  the situation is
1da80 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20   more complex:  
1da90 62 79 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32  bytes.      ** 2
1daa0 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74  4..39 of the dat
1dab0 61 62 61 73 65 20 61 72 65 20 77 68 69 74 65 20  abase are white 
1dac0 6e 6f 69 73 65 2e 20 20 42 75 74 20 74 68 65 20  noise.  But the 
1dad0 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20  probability of. 
1dae0 20 20 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f       ** white no
1daf0 69 73 65 20 65 71 75 61 6c 69 6e 67 20 31 36 20  ise equaling 16 
1db00 62 79 74 65 73 20 6f 66 20 30 78 66 66 20 69 73  bytes of 0xff is
1db10 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
1db20 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77  ll so.      ** w
1db30 65 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62  e should still b
1db40 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  e ok..      */. 
1db50 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67       memset(pPag
1db60 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
1db70 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61  0xff, sizeof(pPa
1db80 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
1db90 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1dba0 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65      u8 *dbFileVe
1dbb0 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d  rs = &((u8*)pPg-
1dbc0 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20  >pData)[24];.   
1dbd0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
1dbe0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64  r->dbFileVers, d
1dbf0 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
1dc00 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
1dc10 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Vers));.    }.  
1dc20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65  }.  CODEC1(pPage
1dc30 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  r, pPg->pData, p
1dc40 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c  gno, 3, rc = SQL
1dc50 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b  ITE_NOMEM_BKPT);
1dc60 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73  ..  PAGER_INCR(s
1dc70 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
1dc80 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41  ddb_count);.  PA
1dc90 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
1dca0 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41  >nRead);.  IOTRA
1dcb0 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c  CE(("PGIN %p %d\
1dcc0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
1dcd0 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  ));.  PAGERTRACE
1dce0 28 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65  (("FETCH %d page
1dcf0 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
1dd00 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1dd10 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1dd20 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
1dd30 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a  agehash(pPg)));.
1dd40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1dd50 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68  ./*.** Update th
1dd60 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63  e value of the c
1dd70 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74  hange-counter at
1dd80 20 6f 66 66 73 65 74 73 20 32 34 20 61 6e 64 20   offsets 24 and 
1dd90 39 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61  92 in.** the hea
1dda0 64 65 72 20 61 6e 64 20 74 68 65 20 73 71 6c 69  der and the sqli
1ddb0 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  te version numbe
1ddc0 72 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a  r at offset 96..
1ddd0 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  **.** This is an
1dde0 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75   unconditional u
1ddf0 70 64 61 74 65 2e 20 20 53 65 65 20 61 6c 73 6f  pdate.  See also
1de00 20 74 68 65 20 70 61 67 65 72 5f 69 6e 63 72 5f   the pager_incr_
1de10 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a  changecounter().
1de20 2a 2a 20 72 6f 75 74 69 6e 65 20 77 68 69 63 68  ** routine which
1de30 20 6f 6e 6c 79 20 75 70 64 61 74 65 73 20 74 68   only updates th
1de40 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1de50 20 69 66 20 74 68 65 20 75 70 64 61 74 65 20 69   if the update i
1de60 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65  s actually.** ne
1de70 65 64 65 64 2c 20 61 73 20 64 65 74 65 72 6d 69  eded, as determi
1de80 6e 65 64 20 62 79 20 74 68 65 20 70 50 61 67 65  ned by the pPage
1de90 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
1dea0 6e 65 20 73 74 61 74 65 20 76 61 72 69 61 62 6c  ne state variabl
1deb0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1dec0 64 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68  d pager_write_ch
1ded0 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 67 48 64  angecounter(PgHd
1dee0 72 20 2a 70 50 67 29 7b 0a 20 20 75 33 32 20 63  r *pPg){.  u32 c
1def0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a  hange_counter;..
1df00 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
1df10 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65  he value just re
1df20 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20  ad and write it 
1df30 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e  back to byte 24.
1df40 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75   */.  change_cou
1df50 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65  nter = sqlite3Ge
1df60 74 34 62 79 74 65 28 28 75 38 2a 29 70 50 67 2d  t4byte((u8*)pPg-
1df70 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  >pPager->dbFileV
1df80 65 72 73 29 2b 31 3b 0a 20 20 70 75 74 33 32 62  ers)+1;.  put32b
1df90 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1dfa0 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e  >pData)+24, chan
1dfb0 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20  ge_counter);..  
1dfc0 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68  /* Also store th
1dfd0 65 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e  e SQLite version
1dfe0 20 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73   number in bytes
1dff0 20 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20   96..99 and in. 
1e000 20 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35   ** bytes 92..95
1e010 20 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67   store the chang
1e020 65 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68  e counter for wh
1e030 69 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20  ich the version 
1e040 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20 76  number.  ** is v
1e050 61 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32  alid. */.  put32
1e060 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67  bits(((char*)pPg
1e070 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61  ->pData)+92, cha
1e080 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20  nge_counter);.  
1e090 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
1e0a0 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 36  *)pPg->pData)+96
1e0b0 2c 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e  , SQLITE_VERSION
1e0c0 5f 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66  _NUMBER);.}..#if
1e0d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e0e0 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  _WAL./*.** This 
1e0f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f  function is invo
1e100 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ked once for eac
1e110 68 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  h page that has 
1e120 61 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a  already been .**
1e130 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1e140 65 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20  e log file when 
1e150 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f  a WAL transactio
1e160 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1e170 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69  ..** Parameter i
1e180 50 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e  Pg is the page n
1e190 75 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61  umber of said pa
1e1a0 67 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67  ge. The pCtx arg
1e1b0 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74  ument .** is act
1e1c0 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  ually a pointer 
1e1d0 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72  to the Pager str
1e1e0 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
1e1f0 20 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65   page iPg is pre
1e200 73 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68  sent in the cach
1e210 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75  e, and has no ou
1e220 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
1e230 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64  nces,.** it is d
1e240 69 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77  iscarded. Otherw
1e250 69 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72  ise, if there ar
1e260 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75  e one or more ou
1e270 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66  tstanding.** ref
1e280 65 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67  erences, the pag
1e290 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c  e content is rel
1e2a0 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64  oaded from the d
1e2b0 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a  atabase. If the.
1e2c0 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65  ** attempt to re
1e2d0 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f  load content fro
1e2e0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  m the database i
1e2f0 73 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66  s required and f
1e300 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e  ails, .** return
1e310 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1e320 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65   code. Otherwise
1e330 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  , SQLITE_OK..*/.
1e340 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1e350 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69  UndoCallback(voi
1e360 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50  d *pCtx, Pgno iP
1e370 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
1e380 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1e390 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67  r *pPager = (Pag
1e3a0 65 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48  er *)pCtx;.  PgH
1e3b0 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65  dr *pPg;..  asse
1e3c0 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
1e3d0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 67  pPager) );.  pPg
1e3e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
1e3f0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50  ookup(pPager, iP
1e400 67 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b  g);.  if( pPg ){
1e410 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1e420 50 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75  PcachePageRefcou
1e430 6e 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20  nt(pPg)==1 ){.  
1e440 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
1e450 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20  eDrop(pPg);.    
1e460 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32  }else{.      u32
1e470 20 69 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20   iFrame = 0;.   
1e480 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
1e490 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67  alFindFrame(pPag
1e4a0 65 72 2d 3e 70 57 61 6c 2c 20 70 50 67 2d 3e 70  er->pWal, pPg->p
1e4b0 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20  gno, &iFrame);. 
1e4c0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1e4d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e4e0 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67    rc = readDbPag
1e4f0 65 28 70 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a  e(pPg, iFrame);.
1e500 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1e510 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e520 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
1e530 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67  r->xReiniter(pPg
1e540 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1e550 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1e560 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a  efNotNull(pPg);.
1e570 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1e580 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74  Normally, if a t
1e590 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
1e5a0 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79 20 62  lled back, any b
1e5b0 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20  ackup processes 
1e5c0 61 72 65 0a 20 20 2a 2a 20 75 70 64 61 74 65 64  are.  ** updated
1e5d0 20 61 73 20 64 61 74 61 20 69 73 20 63 6f 70 69   as data is copi
1e5e0 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20 72 6f  ed out of the ro
1e5f0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
1e600 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  nd into the.  **
1e610 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20   database. This 
1e620 69 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79  is not generally
1e630 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68 20 61   possible with a
1e640 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 61   WAL database, a
1e650 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  s.  ** rollback 
1e660 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20  involves simply 
1e670 74 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20 6c  truncating the l
1e680 6f 67 20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f  og file. Therefo
1e690 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20  re, if one.  ** 
1e6a0 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 68  or more frames h
1e6b0 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
1e6c0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1e6d0 6c 6f 67 20 28 61 6e 64 20 74 68 65 72 65 66 6f  log (and therefo
1e6e0 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f  re .  ** also co
1e6f0 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 61  pied into the ba
1e700 63 6b 75 70 20 64 61 74 61 62 61 73 65 73 29 20  ckup databases) 
1e710 61 73 20 70 61 72 74 20 6f 66 20 74 68 69 73 20  as part of this 
1e720 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a  transaction,.  *
1e730 2a 20 74 68 65 20 62 61 63 6b 75 70 73 20 6d 75  * the backups mu
1e740 73 74 20 62 65 20 72 65 73 74 61 72 74 65 64 2e  st be restarted.
1e750 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42  .  */.  sqlite3B
1e760 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61  ackupRestart(pPa
1e770 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a  ger->pBackup);..
1e780 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e790 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1e7a0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
1e7b0 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e   rollback a tran
1e7c0 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c  saction on a WAL
1e7d0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
1e7e0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 52 6f  atic int pagerRo
1e7f0 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67 65 72 20  llbackWal(Pager 
1e800 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1e810 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1e820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1e830 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
1e840 50 67 48 64 72 20 2a 70 4c 69 73 74 3b 20 20 20  PgHdr *pList;   
1e850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e860 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69 72 74 79  /* List of dirty
1e870 20 70 61 67 65 73 20 74 6f 20 72 65 76 65 72 74   pages to revert
1e880 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c   */..  /* For al
1e890 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  l pages in the c
1e8a0 61 63 68 65 20 74 68 61 74 20 61 72 65 20 63 75  ache that are cu
1e8b0 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 6f 72  rrently dirty or
1e8c0 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20   have already.  
1e8d0 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ** been written 
1e8e0 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74  (but not committ
1e8f0 65 64 29 20 74 6f 20 74 68 65 20 6c 6f 67 20 66  ed) to the log f
1e900 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74  ile, do one of t
1e910 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  he .  ** followi
1e920 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ng:.  **.  **   
1e930 2b 20 44 69 73 63 61 72 64 20 74 68 65 20 63 61  + Discard the ca
1e940 63 68 65 64 20 70 61 67 65 20 28 69 66 20 72 65  ched page (if re
1e950 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20  fcount==0), or. 
1e960 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20 70   **   + Reload p
1e970 61 67 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  age content from
1e980 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69   the database (i
1e990 66 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20  f refcount>0).. 
1e9a0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
1e9b0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
1e9c0 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 63 20  bOrigSize;.  rc 
1e9d0 3d 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f  = sqlite3WalUndo
1e9e0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
1e9f0 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b  agerUndoCallback
1ea00 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72  , (void *)pPager
1ea10 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  );.  pList = sql
1ea20 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
1ea30 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
1ea40 63 68 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  che);.  while( p
1ea50 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49  List && rc==SQLI
1ea60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48  TE_OK ){.    PgH
1ea70 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73  dr *pNext = pLis
1ea80 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 72  t->pDirty;.    r
1ea90 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c  c = pagerUndoCal
1eaa0 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29 70 50  lback((void *)pP
1eab0 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ager, pList->pgn
1eac0 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  o);.    pList = 
1ead0 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65  pNext;.  }..  re
1eae0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1eaf0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1eb00 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f  is a wrapper aro
1eb10 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c 46 72  und sqlite3WalFr
1eb20 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c 6c 20  ames(). As well 
1eb30 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68  as logging.** th
1eb40 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1eb50 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
1eb60 68 65 61 64 65 64 20 62 79 20 70 4c 69 73 74 20  headed by pList 
1eb70 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44  (connected by pD
1eb80 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66  irty),.** this f
1eb90 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73  unction notifies
1eba0 20 61 6e 79 20 61 63 74 69 76 65 20 62 61 63 6b   any active back
1ebb0 75 70 20 70 72 6f 63 65 73 73 65 73 20 74 68 61  up processes tha
1ebc0 74 20 74 68 65 20 70 61 67 65 73 20 68 61 76 65  t the pages have
1ebd0 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a  .** changed. .**
1ebe0 0a 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20  .** The list of 
1ebf0 70 61 67 65 73 20 70 61 73 73 65 64 20 69 6e 74  pages passed int
1ec00 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
1ec10 73 20 61 6c 77 61 79 73 20 73 6f 72 74 65 64 20  s always sorted 
1ec20 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  by page number..
1ec30 2a 2a 20 48 65 6e 63 65 2c 20 69 66 20 70 61 67  ** Hence, if pag
1ec40 65 20 31 20 61 70 70 65 61 72 73 20 61 6e 79 77  e 1 appears anyw
1ec50 68 65 72 65 20 6f 6e 20 74 68 65 20 6c 69 73 74  here on the list
1ec60 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 74 68 65  , it will be the
1ec70 20 66 69 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20   first page..*/ 
1ec80 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1ec90 72 57 61 6c 46 72 61 6d 65 73 28 0a 20 20 50 61  rWalFrames(.  Pa
1eca0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
1ecb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ecc0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
1ecd0 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 2c  .  PgHdr *pList,
1ece0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecf0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
1ed00 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20  ames to log */. 
1ed10 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c   Pgno nTruncate,
1ed20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed30 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a   /* Database siz
1ed40 65 20 61 66 74 65 72 20 74 68 69 73 20 63 6f 6d  e after this com
1ed50 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43  mit */.  int isC
1ed60 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20  ommit           
1ed70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1ed80 20 69 66 20 74 68 69 73 20 69 73 20 61 20 63 6f   if this is a co
1ed90 6d 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  mmit */.){.  int
1eda0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1edb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1edc0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1edd0 20 69 6e 74 20 6e 4c 69 73 74 3b 20 20 20 20 20   int nList;     
1ede0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edf0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1ee00 67 65 73 20 69 6e 20 70 4c 69 73 74 20 2a 2f 0a  ges in pList */.
1ee10 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20    PgHdr *p;     
1ee20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee30 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
1ee40 20 6f 76 65 72 20 70 61 67 65 73 20 2a 2f 0a 0a   over pages */..
1ee50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1ee60 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 61 73 73 65  ->pWal );.  asse
1ee70 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 23 69 66  rt( pList );.#if
1ee80 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1ee90 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .  /* Verify tha
1eea0 74 20 74 68 65 20 70 61 67 65 20 6c 69 73 74 20  t the page list 
1eeb0 69 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20  is in accending 
1eec0 6f 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70  order */.  for(p
1eed0 3d 70 4c 69 73 74 3b 20 70 20 26 26 20 70 2d 3e  =pList; p && p->
1eee0 70 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69  pDirty; p=p->pDi
1eef0 72 74 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74  rty){.    assert
1ef00 28 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70  ( p->pgno < p->p
1ef10 44 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20  Dirty->pgno );. 
1ef20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
1ef30 65 72 74 28 20 70 4c 69 73 74 2d 3e 70 44 69 72  ert( pList->pDir
1ef40 74 79 3d 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d 69  ty==0 || isCommi
1ef50 74 20 29 3b 0a 20 20 69 66 28 20 69 73 43 6f 6d  t );.  if( isCom
1ef60 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  mit ){.    /* If
1ef70 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69   a WAL transacti
1ef80 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d  on is being comm
1ef90 69 74 74 65 64 2c 20 74 68 65 72 65 20 69 73 20  itted, there is 
1efa0 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 77 72 69 74  no point in writ
1efb0 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70  ing.    ** any p
1efc0 61 67 65 73 20 77 69 74 68 20 70 61 67 65 20 6e  ages with page n
1efd0 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 20 74  umbers greater t
1efe0 68 61 6e 20 6e 54 72 75 6e 63 61 74 65 20 69 6e  han nTruncate in
1eff0 74 6f 20 74 68 65 20 57 41 4c 20 66 69 6c 65 2e  to the WAL file.
1f000 0a 20 20 20 20 2a 2a 20 54 68 65 79 20 77 69 6c  .    ** They wil
1f010 6c 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  l never be read 
1f020 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53  by any client. S
1f030 6f 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72  o remove them fr
1f040 6f 6d 20 74 68 65 20 70 44 69 72 74 79 0a 20 20  om the pDirty.  
1f050 20 20 2a 2a 20 6c 69 73 74 20 68 65 72 65 2e 20    ** list here. 
1f060 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a 2a 70  */.    PgHdr **p
1f070 70 4e 65 78 74 20 3d 20 26 70 4c 69 73 74 3b 0a  pNext = &pList;.
1f080 20 20 20 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20      nList = 0;. 
1f090 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20     for(p=pList; 
1f0a0 28 2a 70 70 4e 65 78 74 20 3d 20 70 29 21 3d 30  (*ppNext = p)!=0
1f0b0 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1f0c0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e        if( p->pgn
1f0d0 6f 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29 7b 0a  o<=nTruncate ){.
1f0e0 20 20 20 20 20 20 20 20 70 70 4e 65 78 74 20 3d          ppNext =
1f0f0 20 26 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20   &p->pDirty;.   
1f100 20 20 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20       nList++;.  
1f110 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1f120 61 73 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b  assert( pList );
1f130 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c  .  }else{.    nL
1f140 69 73 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70  ist = 1;.  }.  p
1f150 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47  Pager->aStat[PAG
1f160 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 20 2b  ER_STAT_WRITE] +
1f170 3d 20 6e 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20  = nList;..  if( 
1f180 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pList->pgno==1 )
1f190 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
1f1a0 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74  ngecounter(pList
1f1b0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1f1c0 33 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65  3WalFrames(pPage
1f1d0 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20 20  r->pWal, .      
1f1e0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1f1f0 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61  , pList, nTrunca
1f200 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 70 50  te, isCommit, pP
1f210 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
1f220 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  gs.  );.  if( rc
1f230 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1f240 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29  Pager->pBackup )
1f250 7b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73  {.    for(p=pLis
1f260 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74  t; p; p=p->pDirt
1f270 79 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  y){.      sqlite
1f280 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50  3BackupUpdate(pP
1f290 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70  ager->pBackup, p
1f2a0 2d 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d  ->pgno, (u8 *)p-
1f2b0 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  >pData);.    }. 
1f2c0 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
1f2d0 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
1f2e0 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50  pList = sqlite3P
1f2f0 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
1f300 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
1f310 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20  .  for(p=pList; 
1f320 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  p; p=p->pDirty){
1f330 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
1f340 61 67 65 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a  agehash(p);.  }.
1f350 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
1f360 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65   rc;.}../*.** Be
1f370 67 69 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73  gin a read trans
1f380 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41  action on the WA
1f390 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  L..**.** This ro
1f3a0 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65  utine used to be
1f3b0 20 63 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70   called "pagerOp
1f3c0 65 6e 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65  enSnapshot()" be
1f3d0 63 61 75 73 65 20 69 74 20 65 73 73 65 6e 74 69  cause it essenti
1f3e0 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20  ally.** makes a 
1f3f0 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20  snapshot of the 
1f400 64 61 74 61 62 61 73 65 20 61 74 20 74 68 65 20  database at the 
1f410 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e  current point in
1f420 20 74 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72   time and preser
1f430 76 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70  ves.** that snap
1f440 73 68 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20  shot for use by 
1f450 74 68 65 20 72 65 61 64 65 72 20 69 6e 20 73 70  the reader in sp
1f460 69 74 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e  ite of concurren
1f470 74 6c 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a  tly changes by.*
1f480 2a 20 6f 74 68 65 72 20 77 72 69 74 65 72 73 20  * other writers 
1f490 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73  or checkpointers
1f4a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f4b0 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72  pagerBeginReadTr
1f4c0 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20  ansaction(Pager 
1f4d0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1f4e0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1f4f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1f500 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1f510 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b  int changed = 0;
1f520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f530 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65  /* True if cache
1f540 20 6d 75 73 74 20 62 65 20 72 65 73 65 74 20 2a   must be reset *
1f550 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  /..  assert( pag
1f560 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
1f570 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1f580 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
1f590 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67  GER_OPEN || pPag
1f5a0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
1f5b0 52 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f  R_READER );..  /
1f5c0 2a 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52  * sqlite3WalEndR
1f5d0 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29  eadTransaction()
1f5e0 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20   was not called 
1f5f0 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73  for the previous
1f600 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
1f610 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  n in locking_mod
1f620 65 3d 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f  e=EXCLUSIVE.  So
1f630 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49   call it now.  I
1f640 66 20 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e  f we.  ** are in
1f650 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f   locking_mode=NO
1f660 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64  RMAL and EndRead
1f670 28 29 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  () was previousl
1f680 79 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74  y called,.  ** t
1f690 68 65 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c  he duplicate cal
1f6a0 6c 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20  l is harmless.. 
1f6b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   */.  sqlite3Wal
1f6c0 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69  EndReadTransacti
1f6d0 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
1f6e0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
1f6f0 33 57 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61  3WalBeginReadTra
1f700 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
1f710 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29  >pWal, &changed)
1f720 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1f730 54 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64  TE_OK || changed
1f740 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65   ){.    pager_re
1f750 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
1f760 20 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50   if( USEFETCH(pP
1f770 61 67 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f  ager) ) sqlite3O
1f780 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
1f790 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  >fd, 0, 0);.  }.
1f7a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1f7b0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1f7c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1f7d0 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66  alled as part of
1f7e0 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20   the transition 
1f7f0 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a  from PAGER_OPEN.
1f800 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44  ** to PAGER_READ
1f810 45 52 20 73 74 61 74 65 20 74 6f 20 64 65 74 65  ER state to dete
1f820 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 6f  rmine the size o
1f830 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1f840 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20  ile.** in pages 
1f850 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20 70 61  (assuming the pa
1f860 67 65 20 73 69 7a 65 20 63 75 72 72 65 6e 74 6c  ge size currentl
1f870 79 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65  y stored in Page
1f880 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a  r.pageSize)..**.
1f890 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ** If no error o
1f8a0 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b  ccurs, SQLITE_OK
1f8b0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1f8c0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1f8d0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20   database.** in 
1f8e0 70 61 67 65 73 20 69 73 20 73 74 6f 72 65 64 20  pages is stored 
1f8f0 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65  in *pnPage. Othe
1f900 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20  rwise, an error 
1f910 63 6f 64 65 20 28 70 65 72 68 61 70 73 0a 2a 2a  code (perhaps.**
1f920 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
1f930 54 41 54 29 20 69 73 20 72 65 74 75 72 6e 65 64  TAT) is returned
1f940 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20   and *pnPage is 
1f950 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e  left unmodified.
1f960 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1f970 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61  agerPagecount(Pa
1f980 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
1f990 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67  o *pnPage){.  Pg
1f9a0 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  no nPage;       
1f9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f9c0 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
1f9d0 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a   via *pnPage */.
1f9e0 0a 20 20 2f 2a 20 51 75 65 72 79 20 74 68 65 20  .  /* Query the 
1f9f0 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 66  WAL sub-system f
1fa00 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
1fa10 73 69 7a 65 2e 20 54 68 65 20 57 61 6c 44 62 73  size. The WalDbs
1fa20 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74  ize().  ** funct
1fa30 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f  ion returns zero
1fa40 20 69 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e   if the WAL is n
1fa50 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61  ot open (i.e. Pa
1fa60 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72  ger.pWal==0), or
1fa70 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 64 61 74  .  ** if the dat
1fa80 61 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f  abase size is no
1fa90 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65  t available. The
1faa0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69   database size i
1fab0 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c  s not.  ** avail
1fac0 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41  able from the WA
1fad0 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 69 66 20  L sub-system if 
1fae0 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20  the log file is 
1faf0 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f  empty or.  ** co
1fb00 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20  ntains no valid 
1fb10 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61  committed transa
1fb20 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61  ctions..  */.  a
1fb30 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1fb40 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
1fb50 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  N );.  assert( p
1fb60 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48  Pager->eLock>=SH
1fb70 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
1fb80 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1fb90 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61  ager->fd) );.  a
1fba0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
1fbb0 65 6d 70 46 69 6c 65 3d 3d 30 20 29 3b 0a 20 20  empFile==0 );.  
1fbc0 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 57  nPage = sqlite3W
1fbd0 61 6c 44 62 73 69 7a 65 28 70 50 61 67 65 72 2d  alDbsize(pPager-
1fbe0 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66  >pWal);..  /* If
1fbf0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1fc00 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
1fc10 62 61 73 65 20 69 73 20 6e 6f 74 20 61 76 61 69  base is not avai
1fc20 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 0a 20  lable from the. 
1fc30 20 2a 2a 20 57 41 4c 20 73 75 62 2d 73 79 73 74   ** WAL sub-syst
1fc40 65 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68  em, determine th
1fc50 65 20 70 61 67 65 20 63 6f 75 6e 74 65 20 62 61  e page counte ba
1fc60 73 65 64 20 6f 6e 20 74 68 65 20 73 69 7a 65 20  sed on the size 
1fc70 6f 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61  of.  ** the data
1fc80 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
1fc90 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
1fca0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
1fcb0 6e 6f 74 20 61 6e 0a 20 20 2a 2a 20 69 6e 74 65  not an.  ** inte
1fcc0 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20  ger multiple of 
1fcd0 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 72  the page-size, r
1fce0 6f 75 6e 64 20 75 70 20 74 68 65 20 72 65 73 75  ound up the resu
1fcf0 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  lt..  */.  if( n
1fd00 50 61 67 65 3d 3d 30 20 26 26 20 41 4c 57 41 59  Page==0 && ALWAY
1fd10 53 28 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  S(isOpen(pPager-
1fd20 3e 66 64 29 29 20 29 7b 0a 20 20 20 20 69 36 34  >fd)) ){.    i64
1fd30 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20   n = 0;         
1fd40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1fd50 7a 65 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e  ze of db file in
1fd60 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 6e   bytes */.    in
1fd70 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
1fd80 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
1fd90 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20 20 69 66  >fd, &n);.    if
1fda0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1fdb0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1fdc0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50  rc;.    }.    nP
1fdd0 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 2b  age = (Pgno)((n+
1fde0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1fdf0 2d 31 29 20 2f 20 70 50 61 67 65 72 2d 3e 70 61  -1) / pPager->pa
1fe00 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
1fe10 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  /* If the curren
1fe20 74 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  t number of page
1fe30 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73  s in the file is
1fe40 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1fe50 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65  e.  ** configure
1fe60 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20  d maximum pager 
1fe70 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65  number, increase
1fe80 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d   the allowed lim
1fe90 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  it so.  ** that 
1fea0 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20  the file can be 
1feb0 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  read..  */.  if(
1fec0 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d   nPage>pPager->m
1fed0 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  xPgno ){.    pPa
1fee0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50  ger->mxPgno = (P
1fef0 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a  gno)nPage;.  }..
1ff00 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61 67    *pnPage = nPag
1ff10 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
1ff20 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
1ff30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1ff40 4c 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66  L./*.** Check if
1ff50 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20   the *-wal file 
1ff60 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
1ff70 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1ff80 20 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67 65   opened by pPage
1ff90 72 0a 2a 2a 20 65 78 69 73 74 73 20 69 66 20 74  r.** exists if t
1ffa0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
1ffb0 6f 74 20 65 6d 70 79 2c 20 6f 72 20 76 65 72 69  ot empy, or veri
1ffc0 66 79 20 74 68 61 74 20 74 68 65 20 2a 2d 77 61  fy that the *-wa
1ffd0 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e  l file does.** n
1ffe0 6f 74 20 65 78 69 73 74 20 28 62 79 20 64 65 6c  ot exist (by del
1fff0 65 74 69 6e 67 20 69 74 29 20 69 66 20 74 68 65  eting it) if the
20000 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
20010 73 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49  s empty..**.** I
20020 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
20030 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64 20  s not empty and 
20040 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65  the *-wal file e
20050 78 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65 20  xists, open the 
20060 70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20  pager.** in WAL 
20070 6d 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64 61  mode.  If the da
20080 74 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 20  tabase is empty 
20090 6f 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66  or if no *-wal f
200a0 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0a 2a  ile exists and.*
200b0 2a 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  * if no error oc
200c0 63 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65 20  curs, make sure 
200d0 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64  Pager.journalMod
200e0 65 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a  e is not set to.
200f0 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ** PAGER_JOURNAL
20100 4d 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20  MODE_WAL..**.** 
20110 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
20120 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
20130 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  e..**.** The cal
20140 6c 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20  ler must hold a 
20150 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SHARED lock on t
20160 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20170 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a   to call this.**
20180 20 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75   function. Becau
20190 73 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  se an EXCLUSIVE 
201a0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66  lock on the db f
201b0 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ile is required 
201c0 74 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20  to delete .** a 
201d0 57 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d  WAL on a none-em
201e0 70 74 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  pty database, th
201f0 69 73 20 65 6e 73 75 72 65 73 20 74 68 65 72 65  is ensures there
20200 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64   is no race cond
20210 69 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65  ition .** betwee
20220 6e 20 74 68 65 20 78 41 63 63 65 73 73 28 29 20  n the xAccess() 
20230 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44 65  below and an xDe
20240 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65 78 65  lete() being exe
20250 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a  cuted by some .*
20260 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  * other connecti
20270 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
20280 74 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66  t pagerOpenWalIf
20290 50 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a 70  Present(Pager *p
202a0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
202b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
202c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
202d0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
202e0 45 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EN );.  assert( 
202f0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53  pPager->eLock>=S
20300 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  HARED_LOCK );.. 
20310 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
20320 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e  mpFile ){.    in
20330 74 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20 20  t isWal;        
20340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
20350 72 75 65 20 69 66 20 57 41 4c 20 66 69 6c 65 20  rue if WAL file 
20360 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 50 67  exists */.    Pg
20370 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  no nPage;       
20380 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
20390 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
203a0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ase file */..   
203b0 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
203c0 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
203d0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
203e0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
203f0 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29    if( nPage==0 )
20400 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
20410 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
20420 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65  ger->pVfs, pPage
20430 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20  r->zWal, 0);.   
20440 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20450 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
20460 4f 45 4e 54 20 29 20 72 63 20 3d 20 53 51 4c 49  OENT ) rc = SQLI
20470 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 73 57  TE_OK;.      isW
20480 61 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  al = 0;.    }els
20490 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
204a0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20  lite3OsAccess(. 
204b0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
204c0 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
204d0 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  Wal, SQLITE_ACCE
204e0 53 53 5f 45 58 49 53 54 53 2c 20 26 69 73 57 61  SS_EXISTS, &isWa
204f0 6c 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  l.      );.    }
20500 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
20510 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20520 69 66 28 20 69 73 57 61 6c 20 29 7b 0a 20 20 20  if( isWal ){.   
20530 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
20540 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
20550 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
20560 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20  Cache)==0 );.   
20570 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20580 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50  3PagerOpenWal(pP
20590 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
205a0 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
205b0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
205c0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
205d0 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  _WAL ){.        
205e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
205f0 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
20600 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a  NALMODE_DELETE;.
20610 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20620 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
20630 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
20640 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e  layback savepoin
20650 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72  t pSavepoint. Or
20660 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d  , if pSavepoint=
20670 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79  =NULL, then play
20680 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69  back.** the enti
20690 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
206a0 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65  l file. The case
206b0 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
206c0 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a  L occurs when .*
206d0 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  * a ROLLBACK TO 
206e0 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b  command is invok
206f0 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e  ed on a SAVEPOIN
20700 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61 6e  T that is a tran
20710 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65  saction .** save
20720 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  point..**.** Whe
20730 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  n pSavepoint is 
20740 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e  not NULL (meanin
20750 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74  g a non-transact
20760 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73  ion savepoint is
20770 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65   .** being rolle
20780 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68  d back), then th
20790 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69  e rollback consi
207a0 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72  sts of up to thr
207b0 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65  ee stages,.** pe
207c0 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f  rformed in the o
207d0 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a  rder specified:.
207e0 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20  **.**   * Pages 
207f0 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20  are played back 
20800 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
20810 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
20820 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66  t byte.**     of
20830 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70 6f  fset PagerSavepo
20840 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20  int.iOffset and 
20850 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a  continuing to .*
20860 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
20870 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c  oint.iHdrOffset,
20880 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f   or to the end o
20890 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
208a0 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69  al.**     file i
208b0 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
208c0 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a  .iHdrOffset is z
208d0 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ero..**.**   * I
208e0 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
208f0 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e  .iHdrOffset is n
20900 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61  ot zero, then pa
20910 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a  ges are played.*
20920 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72 74  *     back start
20930 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ing from the jou
20940 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65  rnal header imme
20950 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
20960 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  g .**     PagerS
20970 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
20980 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  set to the end o
20990 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
209a0 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20  al file..**.**  
209b0 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68 65   * Pages are the
209c0 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  n played back fr
209d0 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
209e0 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e  al file, startin
209f0 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68  g.**     with th
20a00 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
20a10 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e  .iSubRec and con
20a20 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65  tinuing to the e
20a30 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65  nd of.**     the
20a40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
20a50 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20  *.** Throughout 
20a60 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f  the rollback pro
20a70 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20  cess, each time 
20a80 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64  a page is rolled
20a90 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f   back, the.** co
20aa0 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
20ab0 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74 76  is set in a bitv
20ac0 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76 61  ec structure (va
20ad0 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20  riable pDone in 
20ae0 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  the.** implement
20af0 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68  ation below). Th
20b00 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e  is is used to en
20b10 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67 65  sure that a page
20b20 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c   is only.** roll
20b30 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72 73  ed back the firs
20b40 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63  t time it is enc
20b50 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68  ountered in eith
20b60 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  er journal..**.*
20b70 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20  * If pSavepoint 
20b80 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61  is NULL, then pa
20b90 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61  ges are only pla
20ba0 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
20bb0 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61  e main.** journa
20bc0 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73  l file. There is
20bd0 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62   no need for a b
20be0 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63 61  itvec in this ca
20bf0 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74  se..**.** In eit
20c00 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65  her case, before
20c10 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e   playback commen
20c20 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64 62  ces the Pager.db
20c30 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a  Size variable.**
20c40 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68 65   is reset to the
20c50 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20 68   value that it h
20c60 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72 74  eld at the start
20c70 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e   of the savepoin
20c80 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61  t .** (or transa
20c90 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20  ction). No page 
20ca0 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62  with a page-numb
20cb0 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
20cc0 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73  this value.** is
20cd0 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66   played back. If
20ce0 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65   one is encounte
20cf0 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79  red it is simply
20d00 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61   skipped..*/.sta
20d10 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61  tic int pagerPla
20d20 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50  ybackSavepoint(P
20d30 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61  ager *pPager, Pa
20d40 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53  gerSavepoint *pS
20d50 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34  avepoint){.  i64
20d60 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
20d70 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69        /* Effecti
20d80 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  ve size of the m
20d90 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ain journal */. 
20da0 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
20db0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
20dc0 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e   of first segmen
20dd0 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61  t of main-journa
20de0 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69  l records */.  i
20df0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
20e00 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  K;      /* Retur
20e10 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76  n code */.  Bitv
20e20 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20  ec *pDone = 0;  
20e30 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74       /* Bitvec t
20e40 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20 70  o ensure pages p
20e50 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20  layed back only 
20e60 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  once */..  asser
20e70 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
20e80 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
20e90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
20ea0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
20eb0 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
20ec0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
20ed0 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73  e a bitvec to us
20ee0 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
20ef0 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c  et of pages roll
20f00 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28  ed back */.  if(
20f10 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
20f20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74     pDone = sqlit
20f30 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
20f40 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
20f50 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e  );.    if( !pDon
20f60 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
20f70 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
20f80 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  KPT;.    }.  }..
20f90 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 61 74    /* Set the dat
20fa0 61 62 61 73 65 20 73 69 7a 65 20 62 61 63 6b 20  abase size back 
20fb0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20  to the value it 
20fc0 77 61 73 20 62 65 66 6f 72 65 20 74 68 65 20 73  was before the s
20fd0 61 76 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62  avepoint .  ** b
20fe0 65 69 6e 67 20 72 65 76 65 72 74 65 64 20 77 61  eing reverted wa
20ff0 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  s opened..  */. 
21000 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
21010 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20 70  = pSavepoint ? p
21020 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
21030 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69   : pPager->dbOri
21040 67 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  gSize;.  pPager-
21050 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
21060 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
21070 69 6c 65 3b 0a 0a 20 20 69 66 28 20 21 70 53 61  ile;..  if( !pSa
21080 76 65 70 6f 69 6e 74 20 26 26 20 70 61 67 65 72  vepoint && pager
21090 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
210a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67  {.    return pag
210b0 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50  erRollbackWal(pP
210c0 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
210d0 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75   Use pPager->jou
210e0 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65  rnalOff as the e
210f0 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66  ffective size of
21100 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
21110 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
21120 20 20 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c    The actual fil
21130 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65  e might be large
21140 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20  r than this in. 
21150 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41   ** PAGER_JOURNA
21160 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f  LMODE_TRUNCATE o
21170 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  r PAGER_JOURNALM
21180 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75  ODE_PERSIST.  Bu
21190 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20  t anything.  ** 
211a0 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75  past pPager->jou
211b0 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c  rnalOff is off-l
211c0 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a  imits to us..  *
211d0 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72  /.  szJ = pPager
211e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
211f0 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
21200 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c  Wal(pPager)==0 |
21210 7c 20 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f  | szJ==0 );..  /
21220 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69  * Begin by rolli
21230 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20  ng back records 
21240 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
21250 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
21260 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65  t.  ** PagerSave
21270 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e  point.iOffset an
21280 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
21290 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
212a0 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68   header..  ** Th
212b0 65 72 65 20 6d 69 67 68 74 20 62 65 20 72 65 63  ere might be rec
212c0 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  ords in the main
212d0 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61   journal that ha
212e0 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  ve a page number
212f0 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68  .  ** greater th
21300 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  an the current d
21310 61 74 61 62 61 73 65 20 73 69 7a 65 20 28 70 50  atabase size (pP
21320 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75  ager->dbSize) bu
21330 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c  t those.  ** wil
21340 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61 75 74  l be skipped aut
21350 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67  omatically.  Pag
21360 65 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  es are added to 
21370 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20  pDone as they.  
21380 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62 61  ** are played ba
21390 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ck..  */.  if( p
213a0 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70 61  Savepoint && !pa
213b0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
213c0 29 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66  ) ){.    iHdrOff
213d0 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
213e0 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76  HdrOffset ? pSav
213f0 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
21400 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50  et : szJ;.    pP
21410 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21420 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
21430 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c  Offset;.    whil
21440 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
21450 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
21460 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29  nalOff<iHdrOff )
21470 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
21480 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
21490 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
214a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
214b0 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a  , pDone, 1, 1);.
214c0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
214d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
214e0 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E );.  }else{.  
214f0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
21500 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  lOff = 0;.  }.. 
21510 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c   /* Continue rol
21520 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64  ling back record
21530 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69  s out of the mai
21540 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69  n journal starti
21550 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66  ng at.  ** the f
21560 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
21570 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e  der seen and con
21580 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68  tinuing until th
21590 65 20 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a  e effective end.
215a0 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e    ** of the main
215b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
215c0 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70  Continue to skip
215d0 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61   out-of-range pa
215e0 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e  ges and.  ** con
215f0 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67  tinue adding pag
21600 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  es rolled back t
21610 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  o pDone..  */.  
21620 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
21630 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
21640 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29  journalOff<szJ )
21650 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20  {.    u32 ii;   
21660 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
21670 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
21680 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20  u32 nJRec = 0;  
21690 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
216a0 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20  Journal Records 
216b0 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79  */.    u32 dummy
216c0 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  ;.    rc = readJ
216d0 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
216e0 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63  , 0, szJ, &nJRec
216f0 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61  , &dummy);.    a
21700 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
21710 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f  E_DONE );..    /
21720 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50  *.    ** The "pP
21730 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
21740 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
21750 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
21760 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20  >journalOff".   
21770 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61   ** test is rela
21780 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32  ted to ticket #2
21790 35 36 35 2e 20 20 53 65 65 20 74 68 65 20 64 69  565.  See the di
217a0 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a  scussion in the.
217b0 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61      ** pager_pla
217c0 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e  yback() function
217d0 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
217e0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20  information..   
217f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52 65   */.    if( nJRe
21800 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50  c==0 .     && pP
21810 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
21820 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
21830 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
21840 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20  >journalOff.    
21850 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d  ){.      nJRec =
21860 20 28 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50   (u32)((szJ - pP
21870 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21880 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
21890 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
218a0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63      for(ii=0; rc
218b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
218c0 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65  i<nJRec && pPage
218d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a  r->journalOff<sz
218e0 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  J; ii++){.      
218f0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
21900 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
21910 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  ger, &pPager->jo
21920 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c  urnalOff, pDone,
21930 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 1);.    }.  
21940 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
21950 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
21960 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
21970 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
21980 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d  er->journalOff>=
21990 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  szJ );..  /* Fin
219a0 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20  ally,  rollback 
219b0 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73  pages from the s
219c0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67  ub-journal.  Pag
219d0 65 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a  e that were.  **
219e0 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c   previously roll
219f0 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74  ed back out of t
21a00 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
21a10 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69  (and are hence i
21a20 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69  n pDone).  ** wi
21a30 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20  ll be skipped.  
21a40 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67  Out-of-range pag
21a50 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70  es are also skip
21a60 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ped..  */.  if( 
21a70 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
21a80 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
21a90 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
21aa0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20  nter */.    i64 
21ab0 6f 66 66 73 65 74 20 3d 20 28 69 36 34 29 70 53  offset = (i64)pS
21ac0 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65  avepoint->iSubRe
21ad0 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  c*(4+pPager->pag
21ae0 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28  eSize);..    if(
21af0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
21b00 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
21b10 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76   = sqlite3WalSav
21b20 65 70 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65  epointUndo(pPage
21b30 72 2d 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f  r->pWal, pSavepo
21b40 69 6e 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a  int->aWalData);.
21b50 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
21b60 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75  =pSavepoint->iSu
21b70 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45  bRec; rc==SQLITE
21b80 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72  _OK && ii<pPager
21b90 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29  ->nSubRec; ii++)
21ba0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
21bb0 6f 66 66 73 65 74 3d 3d 28 69 36 34 29 69 69 2a  offset==(i64)ii*
21bc0 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
21bd0 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63  ize) );.      rc
21be0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
21bf0 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
21c00 72 2c 20 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e  r, &offset, pDon
21c10 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  e, 0, 1);.    }.
21c20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
21c30 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
21c40 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74   }..  sqlite3Bit
21c50 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65  vecDestroy(pDone
21c60 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
21c70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
21c80 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21c90 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72   = szJ;.  }..  r
21ca0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21cb0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
21cc0 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
21cd0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
21ce0 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
21cf0 0a 2a 2a 20 62 65 66 6f 72 65 20 61 74 74 65 6d  .** before attem
21d00 70 74 69 6e 67 20 74 6f 20 72 65 63 79 63 6c 65  pting to recycle
21d10 20 63 6c 65 61 6e 20 61 6e 64 20 75 6e 75 73 65   clean and unuse
21d20 64 20 70 61 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64  d pages..*/.void
21d30 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
21d40 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20  Cachesize(Pager 
21d50 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
21d60 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  age){.  sqlite3P
21d70 63 61 63 68 65 53 65 74 43 61 63 68 65 73 69 7a  cacheSetCachesiz
21d80 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
21d90 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f  e, mxPage);.}../
21da0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
21db0 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
21dc0 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
21dd0 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77  s that are allow
21de0 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 61 74 74  ed.** before att
21df0 65 6d 70 74 69 6e 67 20 74 6f 20 73 70 69 6c 6c  empting to spill
21e00 20 70 61 67 65 73 20 74 6f 20 6a 6f 75 72 6e 61   pages to journa
21e10 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
21e20 33 50 61 67 65 72 53 65 74 53 70 69 6c 6c 73 69  3PagerSetSpillsi
21e30 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
21e40 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
21e50 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
21e60 63 61 63 68 65 53 65 74 53 70 69 6c 6c 73 69 7a  cacheSetSpillsiz
21e70 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
21e80 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f  e, mxPage);.}../
21e90 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 53 51 4c 49  *.** Invoke SQLI
21ea0 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49  TE_FCNTL_MMAP_SI
21eb0 5a 45 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ZE based on the 
21ec0 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
21ed0 20 73 7a 4d 6d 61 70 2e 0a 2a 2f 0a 73 74 61 74   szMmap..*/.stat
21ee0 69 63 20 76 6f 69 64 20 70 61 67 65 72 46 69 78  ic void pagerFix
21ef0 4d 61 70 6c 69 6d 69 74 28 50 61 67 65 72 20 2a  Maplimit(Pager *
21f00 70 50 61 67 65 72 29 7b 0a 23 69 66 20 53 51 4c  pPager){.#if SQL
21f10 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
21f20 45 3e 30 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  E>0.  sqlite3_fi
21f30 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65 72 2d  le *fd = pPager-
21f40 3e 66 64 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  >fd;.  if( isOpe
21f50 6e 28 66 64 29 20 26 26 20 66 64 2d 3e 70 4d 65  n(fd) && fd->pMe
21f60 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e  thods->iVersion>
21f70 3d 33 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =3 ){.    sqlite
21f80 33 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 20 20  3_int64 sz;.    
21f90 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 73 7a 4d  sz = pPager->szM
21fa0 6d 61 70 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  map;.    pPager-
21fb0 3e 62 55 73 65 46 65 74 63 68 20 3d 20 28 73 7a  >bUseFetch = (sz
21fc0 3e 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  >0);.    sqlite3
21fd0 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
21fe0 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  t(pPager->fd, SQ
21ff0 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f  LITE_FCNTL_MMAP_
22000 53 49 5a 45 2c 20 26 73 7a 29 3b 0a 20 20 7d 0a  SIZE, &sz);.  }.
22010 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
22020 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d  Change the maxim
22030 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20 6d  um size of any m
22040 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61  emory mapping ma
22050 64 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  de of the databa
22060 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64  se file..*/.void
22070 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
22080 4d 6d 61 70 4c 69 6d 69 74 28 50 61 67 65 72 20  MmapLimit(Pager 
22090 2a 70 50 61 67 65 72 2c 20 73 71 6c 69 74 65 33  *pPager, sqlite3
220a0 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a  _int64 szMmap){.
220b0 20 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70    pPager->szMmap
220c0 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 70 61 67   = szMmap;.  pag
220d0 65 72 46 69 78 4d 61 70 6c 69 6d 69 74 28 70 50  erFixMaplimit(pP
220e0 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ager);.}../*.** 
220f0 46 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d  Free as much mem
22100 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20  ory as possible 
22110 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 0a  from the pager..
22120 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
22130 61 67 65 72 53 68 72 69 6e 6b 28 50 61 67 65 72  agerShrink(Pager
22140 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c   *pPager){.  sql
22150 69 74 65 33 50 63 61 63 68 65 53 68 72 69 6e 6b  ite3PcacheShrink
22160 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
22170 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75  );.}../*.** Adju
22180 73 74 20 73 65 74 74 69 6e 67 73 20 6f 66 20 74  st settings of t
22190 68 65 20 70 61 67 65 72 20 74 6f 20 74 68 6f 73  he pager to thos
221a0 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  e specified in t
221b0 68 65 20 70 67 46 6c 61 67 73 20 70 61 72 61 6d  he pgFlags param
221c0 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eter..**.** The 
221d0 22 6c 65 76 65 6c 22 20 69 6e 20 70 67 46 6c 61  "level" in pgFla
221e0 67 73 20 26 20 50 41 47 45 52 5f 53 59 4e 43 48  gs & PAGER_SYNCH
221f0 52 4f 4e 4f 55 53 5f 4d 41 53 4b 20 73 65 74 73  RONOUS_MASK sets
22200 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 0a   the robustness.
22210 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
22220 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65  se to damage due
22230 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 6f   to OS crashes o
22240 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  r power failures
22250 20 62 79 0a 2a 2a 20 63 68 61 6e 67 69 6e 67 20   by.** changing 
22260 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79  the number of sy
22270 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74  ncs()s when writ
22280 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73  ing the journals
22290 2e 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 66  ..** There are f
222a0 6f 75 72 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a  our levels:.**.*
222b0 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73  *    OFF       s
222c0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69  qlite3OsSync() i
222d0 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20  s never called. 
222e0 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
222f0 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ault.**         
22300 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61       for tempora
22310 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74  ry and transient
22320 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
22330 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a   NORMAL    The j
22340 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
22350 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69   once before wri
22360 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
22370 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
22380 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
22390 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65   is normally ade
223a0 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e  quate protection
223b0 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  , but.**        
223c0 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f        it is theo
223d0 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62  retically possib
223e0 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20  le, though very 
223f0 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20  unlikely,.**    
22400 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61            that a
22410 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77  n inopertune pow
22420 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
22430 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e   leave the journ
22440 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
22450 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68     in a state wh
22460 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20  ich would cause 
22470 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
22480 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20  tabase.**       
22490 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69         when it i
224a0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
224b0 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20  *.**    FULL    
224c0 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
224d0 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65   synced twice be
224e0 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
224f0 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
22500 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
22510 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64  e (with some add
22520 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
22530 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66  ion - the nRec f
22540 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  ield.**         
22550 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72       of the jour
22560 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69  nal header - bei
22570 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65  ng written in be
22580 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a  tween the two.**
22590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79                sy
225a0 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73  ncs).  If we ass
225b0 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67  ume that writing
225c0 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   a.**           
225d0 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73     single disk s
225e0 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c  ector is atomic,
225f0 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20   then this mode 
22600 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20  provides.**     
22610 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e           assuran
22620 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ce that the jour
22630 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nal will not be 
22640 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65  corrupted to the
22650 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
22660 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e   point of causin
22670 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  g damage to the 
22680 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20  database during 
22690 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
226a0 20 20 20 45 58 54 52 41 20 20 20 20 20 54 68 69     EXTRA     Thi
226b0 73 20 69 73 20 6c 69 6b 65 20 46 55 4c 4c 20 65  s is like FULL e
226c0 78 63 65 70 74 20 74 68 61 74 20 69 73 20 61 6c  xcept that is al
226d0 73 6f 20 73 79 6e 63 73 20 74 68 65 20 64 69 72  so syncs the dir
226e0 65 63 74 6f 72 79 0a 2a 2a 20 20 20 20 20 20 20  ectory.**       
226f0 20 20 20 20 20 20 20 74 68 61 74 20 63 6f 6e 74         that cont
22700 61 69 6e 73 20 74 68 65 20 72 6f 6c 6c 62 61 63  ains the rollbac
22710 6b 20 6a 6f 75 72 6e 61 6c 20 61 66 74 65 72 20  k journal after 
22720 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  the rollback.** 
22730 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75               jou
22740 72 6e 61 6c 20 69 73 20 75 6e 6c 69 6e 6b 65 64  rnal is unlinked
22750 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76  ..**.** The abov
22760 65 20 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62  e is for a rollb
22770 61 63 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  ack-journal mode
22780 2e 20 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c  .  For WAL mode,
22790 20 4f 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a   OFF continues.*
227a0 2a 20 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e  * to mean that n
227b0 6f 20 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63  o syncs ever occ
227c0 75 72 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e  ur.  NORMAL mean
227d0 73 20 74 68 61 74 20 74 68 65 20 57 41 4c 20 69  s that the WAL i
227e0 73 20 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f  s synced.** prio
227f0 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
22800 66 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64  f checkpoint and
22810 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
22820 73 65 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  se file is synce
22830 64 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63  d.** at the conc
22840 6c 75 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68  lusion of the ch
22850 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20  eckpoint if the 
22860 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f  entire content o
22870 66 20 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73  f the WAL.** was
22880 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e   written back in
22890 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
228a0 20 20 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70    But no sync op
228b0 65 72 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66  erations occur f
228c0 6f 72 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72  or.** an ordinar
228d0 79 20 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d  y commit in NORM
228e0 41 4c 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c  AL mode with WAL
228f0 2e 20 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68  .  FULL means th
22900 61 74 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69  at the WAL.** fi
22910 6c 65 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c  le is synced fol
22920 6c 6f 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d  lowing each comm
22930 69 74 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e  it operation, in
22940 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65   addition to the
22950 0a 2a 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69  .** syncs associ
22960 61 74 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c  ated with NORMAL
22970 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64  .  There is no d
22980 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
22990 6e 20 46 55 4c 4c 0a 2a 2a 20 61 6e 64 20 45 58  n FULL.** and EX
229a0 54 52 41 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65  TRA for WAL mode
229b0 2e 0a 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63  ..**.** Do not c
229c0 6f 6e 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f  onfuse synchrono
229d0 75 73 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c  us=FULL with SQL
229e0 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20  ITE_SYNC_FULL.  
229f0 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59  The.** SQLITE_SY
22a00 4e 43 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65  NC_FULL macro me
22a10 61 6e 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d  ans to use the M
22a20 61 63 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c  acOSX-style full
22a30 2d 66 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20  -fsync.** using 
22a40 66 63 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e  fcntl(F_FULLFSYN
22a50 43 29 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43  C).  SQLITE_SYNC
22a60 5f 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f  _NORMAL means to
22a70 20 64 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61   do an.** ordina
22a80 72 79 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e  ry fsync() call.
22a90 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69    There is no di
22aa0 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
22ab0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
22ac0 4c 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f  L.** and SQLITE_
22ad0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70  SYNC_NORMAL on p
22ae0 6c 61 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74  latforms other t
22af0 68 61 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74  han MacOSX.  But
22b00 20 74 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e   the.** synchron
22b10 6f 75 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20  ous=FULL versus 
22b20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d  synchronous=NORM
22b30 41 4c 20 73 65 74 74 69 6e 67 20 64 65 74 65 72  AL setting deter
22b40 6d 69 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68  mines when.** th
22b50 65 20 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76  e xSync primitiv
22b60 65 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20  e is called and 
22b70 69 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61  is relevant to a
22b80 6c 6c 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a  ll platforms..**
22b90 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
22ba0 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
22bb0 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
22bc0 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
22bd0 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
22be0 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  L=3..*/.#ifndef 
22bf0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
22c00 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73  R_PRAGMAS.void s
22c10 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c  qlite3PagerSetFl
22c20 61 67 73 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ags(.  Pager *pP
22c30 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  ager,        /* 
22c40 54 68 65 20 70 61 67 65 72 20 74 6f 20 73 65 74  The pager to set
22c50 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 66 6f   safety level fo
22c60 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
22c70 70 67 46 6c 61 67 73 20 20 20 20 20 20 2f 2a 20  pgFlags      /* 
22c80 56 61 72 69 6f 75 73 20 66 6c 61 67 73 20 2a 2f  Various flags */
22c90 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  .){.  unsigned l
22ca0 65 76 65 6c 20 3d 20 70 67 46 6c 61 67 73 20 26  evel = pgFlags &
22cb0 20 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f   PAGER_SYNCHRONO
22cc0 55 53 5f 4d 41 53 4b 3b 0a 20 20 69 66 28 20 70  US_MASK;.  if( p
22cd0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
22ce0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
22cf0 6f 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70  oSync = 1;.    p
22d00 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
22d10 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
22d20 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 30 3b 0a  >extraSync = 0;.
22d30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
22d40 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c  ger->noSync =  l
22d50 65 76 65 6c 3d 3d 50 41 47 45 52 5f 53 59 4e 43  evel==PAGER_SYNC
22d60 48 52 4f 4e 4f 55 53 5f 4f 46 46 20 3f 31 3a 30  HRONOUS_OFF ?1:0
22d70 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75  ;.    pPager->fu
22d80 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3e 3d  llSync = level>=
22d90 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
22da0 53 5f 46 55 4c 4c 20 3f 31 3a 30 3b 0a 20 20 20  S_FULL ?1:0;.   
22db0 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79   pPager->extraSy
22dc0 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 50 41 47 45  nc = level==PAGE
22dd0 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 45 58  R_SYNCHRONOUS_EX
22de0 54 52 41 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20  TRA ?1:0;.  }.  
22df0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
22e00 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  nc ){.    pPager
22e10 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b  ->syncFlags = 0;
22e20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  .    pPager->ckp
22e30 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 30 3b 0a  tSyncFlags = 0;.
22e40 20 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46 6c    }else if( pgFl
22e50 61 67 73 20 26 20 50 41 47 45 52 5f 46 55 4c 4c  ags & PAGER_FULL
22e60 46 53 59 4e 43 20 29 7b 0a 20 20 20 20 70 50 61  FSYNC ){.    pPa
22e70 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d  ger->syncFlags =
22e80 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c   SQLITE_SYNC_FUL
22e90 4c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  L;.    pPager->c
22ea0 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53  kptSyncFlags = S
22eb0 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b  QLITE_SYNC_FULL;
22ec0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 67 46  .  }else if( pgF
22ed0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 43 4b 50  lags & PAGER_CKP
22ee0 54 5f 46 55 4c 4c 46 53 59 4e 43 20 29 7b 0a 20  T_FULLFSYNC ){. 
22ef0 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
22f00 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
22f10 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70  NC_NORMAL;.    p
22f20 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
22f30 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
22f40 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65  NC_FULL;.  }else
22f50 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  {.    pPager->sy
22f60 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
22f70 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
22f80 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79    pPager->ckptSy
22f90 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
22fa0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
22fb0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53  }.  pPager->walS
22fc0 79 6e 63 46 6c 61 67 73 20 3d 20 70 50 61 67 65  yncFlags = pPage
22fd0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a 20 20  r->syncFlags;.  
22fe0 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
22ff0 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67  Sync ){.    pPag
23000 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
23010 20 7c 3d 20 57 41 4c 5f 53 59 4e 43 5f 54 52 41   |= WAL_SYNC_TRA
23020 4e 53 41 43 54 49 4f 4e 53 3b 0a 20 20 7d 0a 20  NSACTIONS;.  }. 
23030 20 69 66 28 20 70 67 46 6c 61 67 73 20 26 20 50   if( pgFlags & P
23040 41 47 45 52 5f 43 41 43 48 45 53 50 49 4c 4c 20  AGER_CACHESPILL 
23050 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
23060 6f 4e 6f 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50  oNotSpill &= ~SP
23070 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d  ILLFLAG_OFF;.  }
23080 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
23090 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20  ->doNotSpill |= 
230a0 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 3b 0a 20  SPILLFLAG_OFF;. 
230b0 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
230c0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
230d0 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
230e0 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
230f0 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62  whenever the lib
23100 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73  rary.** attempts
23110 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
23120 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73  rary file.  This
23130 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
23140 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
23150 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
23160 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64   only.  .*/.#ifd
23170 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
23180 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  nt sqlite3_opent
23190 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  emp_count = 0;.#
231a0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  endif../*.** Ope
231b0 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
231c0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  le..**.** Write 
231d0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
231e0 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e  tor into *pFile.
231f0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
23200 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a  K on success .**
23210 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
23220 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
23230 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c  fail. The OS wil
23240 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
23250 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74  .** delete the t
23260 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68  emporary file wh
23270 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
23280 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73  .**.** The flags
23290 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 56   passed to the V
232a0 46 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29  FS layer xOpen()
232b0 20 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20   call are those 
232c0 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20  specified.** by 
232d0 70 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61  parameter vfsFla
232e0 67 73 20 4f 52 65 64 20 77 69 74 68 20 74 68 65  gs ORed with the
232f0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
23300 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
23310 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20  N_READWRITE.**  
23320 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43     SQLITE_OPEN_C
23330 52 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c  REATE.**     SQL
23340 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
23350 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  VE.**     SQLITE
23360 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
23370 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OSE.*/.static in
23380 74 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  t pagerOpentemp(
23390 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
233a0 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
233b0 70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  pager object */.
233c0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
233d0 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65  pFile,  /* Write
233e0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
233f0 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69  ptor here */.  i
23400 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
23410 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
23420 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
23430 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20  the VFS */.){.  
23440 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
23450 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
23460 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20  code */..#ifdef 
23470 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71  SQLITE_TEST.  sq
23480 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
23490 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64  ount++;  /* Used
234a0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
234b0 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a   analysis only *
234c0 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46  /.#endif..  vfsF
234d0 6c 61 67 73 20 7c 3d 20 20 0a 23 69 66 20 53 51  lags |=  .#if SQ
234e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41  LITE_ENABLE_DATA
234f0 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20  _PROTECTION.    
23500 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
23510 3e 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45  >vfsFlags&SQLITE
23520 5f 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54 45 43  _OPEN_FILEPROTEC
23530 54 49 4f 4e 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64  TION_MASK)|.#end
23540 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  if.            S
23550 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
23560 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
23570 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
23580 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
23590 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20  PEN_EXCLUSIVE | 
235a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
235b0 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20  TEONCLOSE;.  rc 
235c0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
235d0 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c  pPager->pVfs, 0,
235e0 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73   pFile, vfsFlags
235f0 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
23600 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
23610 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29   isOpen(pFile) )
23620 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
23630 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
23640 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e  busy handler fun
23650 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
23660 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74   pager invokes t
23670 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
23680 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  if sqlite3OsLock
23690 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  () returns .** S
236a0 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20  QLITE_BUSY when 
236b0 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64  trying to upgrad
236c0 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74  e from no-lock t
236d0 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  o a SHARED lock,
236e0 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69  .** or when tryi
236f0 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72  ng to upgrade fr
23700 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  om a RESERVED lo
23710 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  ck to an EXCLUSI
23720 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20  VE .** lock. It 
23730 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b  does *not* invok
23740 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
23750 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  er when upgradin
23760 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44  g from.** SHARED
23770 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72   to RESERVED, or
23780 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
23790 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45  from SHARED to E
237a0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69  XCLUSIVE.** (whi
237b0 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  ch occurs during
237c0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
237d0 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a  lback). Summary:
237e0 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74  .**.**   Transit
237f0 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ion             
23800 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76             | Inv
23810 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65  okes xBusyHandle
23820 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  r.**   ---------
23830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
23860 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20  **   NO_LOCK    
23870 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43     -> SHARED_LOC
23880 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20  K      | Yes.** 
23890 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20    SHARED_LOCK   
238a0 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  -> RESERVED_LOCK
238b0 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48      | No.**   SH
238c0 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45  ARED_LOCK   -> E
238d0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20  XCLUSIVE_LOCK   
238e0 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56  | No.**   RESERV
238f0 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55  ED_LOCK -> EXCLU
23900 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65  SIVE_LOCK   | Ye
23910 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  s.**.** If the b
23920 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
23930 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e  back returns non
23940 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20  -zero, the lock 
23950 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20  is .** retried. 
23960 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65  If it returns ze
23970 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c  ro, then the SQL
23980 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69  ITE_BUSY error i
23990 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f  s.** returned to
239a0 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74   the caller of t
239b0 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e  he pager API fun
239c0 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
239d0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
239e0 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67  syhandler(.  Pag
239f0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
23a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a10 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
23a20 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75  t */.  int (*xBu
23a30 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20  syHandler)(void 
23a40 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  *),         /* P
23a50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68  ointer to busy-h
23a60 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20  andler function 
23a70 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
23a80 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20  HandlerArg      
23a90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
23aa0 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f  ument to pass to
23ab0 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f   xBusyHandler */
23ac0 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 42  .){.  pPager->xB
23ad0 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75  usyHandler = xBu
23ae0 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61  syHandler;.  pPa
23af0 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
23b00 72 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64  rArg = pBusyHand
23b10 6c 65 72 41 72 67 3b 0a 0a 20 20 69 66 28 20 69  lerArg;..  if( i
23b20 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
23b30 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 2a  ) ){.    void **
23b40 61 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29 26 70  ap = (void **)&p
23b50 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
23b60 6c 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ler;.    assert(
23b70 20 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 20 2a   ((int(*)(void *
23b80 29 29 28 61 70 5b 30 5d 29 29 3d 3d 78 42 75 73  ))(ap[0]))==xBus
23b90 79 48 61 6e 64 6c 65 72 20 29 3b 0a 20 20 20 20  yHandler );.    
23ba0 61 73 73 65 72 74 28 20 61 70 5b 31 5d 3d 3d 70  assert( ap[1]==p
23bb0 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 29  BusyHandlerArg )
23bc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46  ;.    sqlite3OsF
23bd0 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70  ileControlHint(p
23be0 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
23bf0 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48 41 4e 44  E_FCNTL_BUSYHAND
23c00 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29 61 70 29  LER, (void *)ap)
23c10 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
23c20 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 73  hange the page s
23c30 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
23c40 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68  Pager object. Th
23c50 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  e new page size 
23c60 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e  .** is passed in
23c70 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a   *pPageSize..**.
23c80 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
23c90 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
23ca0 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
23cb0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
23cc0 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e  ed, it.** is a n
23cd0 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20  o-op. The value 
23ce0 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
23cf0 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f  error state erro
23d00 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a  r code (i.e. .**
23d10 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49   one of SQLITE_I
23d20 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49 54 45 5f  OERR, an SQLITE_
23d30 49 4f 45 52 52 5f 78 78 78 20 73 75 62 2d 63 6f  IOERR_xxx sub-co
23d40 64 65 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  de or SQLITE_FUL
23d50 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  L)..**.** Otherw
23d60 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74  ise, if all of t
23d70 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
23d80 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   true:.**.**   *
23d90 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   the new page si
23da0 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50  ze (value of *pP
23db0 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69  ageSize) is vali
23dc0 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20  d (a power .**  
23dd0 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65     of two betwee
23de0 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45  n 512 and SQLITE
23df0 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20  _MAX_PAGE_SIZE, 
23e00 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a  inclusive), and.
23e10 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20  **.**   * there 
23e20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
23e30 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ng page referenc
23e40 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  es, and.**.**   
23e50 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
23e60 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20  s either not an 
23e70 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
23e80 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20  se or it is.**  
23e90 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20     an in-memory 
23ea0 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75  database that cu
23eb0 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73  rrently consists
23ec0 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a   of zero pages..
23ed0 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70  **.** then the p
23ee0 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65  ager object page
23ef0 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
23f00 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
23f10 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
23f20 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74  ze is changed, t
23f30 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
23f40 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61  n uses sqlite3Pa
23f50 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20  gerMalloc() .** 
23f60 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20  to obtain a new 
23f70 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
23f80 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20  buffer. If this 
23f90 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
23fa0 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  pt .** fails, SQ
23fb0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
23fc0 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70  turned and the p
23fd0 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73  age size remains
23fe0 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20   unchanged. .** 
23ff0 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73  In all other cas
24000 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  es, SQLITE_OK is
24010 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
24020 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
24030 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64  e is not changed
24040 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  , either because
24050 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d   one of the enum
24060 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74  erated.** condit
24070 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f  ions above is no
24080 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65  t true, the page
24090 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73  r was in error s
240a0 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
240b0 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  * function was c
240c0 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73  alled, or becaus
240d0 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  e the memory all
240e0 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
240f0 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e  failed, .** then
24100 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73   *pPageSize is s
24110 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72  et to the old, r
24120 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a  etained page siz
24130 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
24140 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
24150 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
24160 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
24170 2c 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a 65  , u32 *pPageSize
24180 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b  , int nReserve){
24190 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
241a0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74 20  TE_OK;..  /* It 
241b0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
241c0 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73 73  to do a full ass
241d0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
241e0 29 20 68 65 72 65 2c 20 61 73 20 74 68 69 73 0a  ) here, as this.
241f0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61    ** function ma
24200 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d  y be called from
24210 20 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70 65   within PagerOpe
24220 6e 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65 20  n(), before the 
24230 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74 68  state.  ** of th
24240 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 69  e Pager object i
24250 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f 6e  s internally con
24260 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20  sistent..  **.  
24270 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  ** At one point 
24280 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
24290 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20  turned an error 
242a0 69 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73  if the pager was
242b0 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52 5f   in .  ** PAGER_
242c0 45 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75 74  ERROR state. But
242d0 20 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52 52   since PAGER_ERR
242e0 4f 52 20 73 74 61 74 65 20 67 75 61 72 61 6e 74  OR state guarant
242f0 65 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ees that.  ** th
24300 65 72 65 20 69 73 20 61 74 20 6c 65 61 73 74 20  ere is at least 
24310 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  one outstanding 
24320 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c 20  page reference, 
24330 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
24340 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  ** is a no-op fo
24350 72 20 74 68 61 74 20 63 61 73 65 20 61 6e 79 68  r that case anyh
24360 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32 20  ow..  */..  u32 
24370 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67  pageSize = *pPag
24380 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
24390 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20   pageSize==0 || 
243a0 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  (pageSize>=512 &
243b0 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
243c0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
243d0 29 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67  ) );.  if( (pPag
243e0 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20  er->memDb==0 || 
243f0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
24400 30 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  0).   && sqlite3
24410 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
24420 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
24430 3d 30 20 0a 20 20 20 26 26 20 70 61 67 65 53 69  =0 .   && pageSi
24440 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d  ze && pageSize!=
24450 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67  (u32)pPager->pag
24460 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20 20  eSize .  ){.    
24470 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55 4c  char *pNew = NUL
24480 4c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  L;             /
24490 2a 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63 65  * New temp space
244a0 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79 74   */.    i64 nByt
244b0 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  e = 0;..    if( 
244c0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50  pPager->eState>P
244d0 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73 4f  AGER_OPEN && isO
244e0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
244f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
24500 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
24510 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42 79  pPager->fd, &nBy
24520 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  te);.    }.    i
24530 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24540 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   ){.      pNew =
24550 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
24560 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53  PageMalloc(pageS
24570 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
24580 21 70 4e 65 77 20 29 20 72 63 20 3d 20 53 51 4c  !pNew ) rc = SQL
24590 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
245a0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
245b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
245c0 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
245d0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
245e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
245f0 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28 70  cheSetPageSize(p
24600 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
24610 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
24620 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
24630 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24640 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
24650 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
24660 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  e);.      pPager
24670 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e  ->pTmpSpace = pN
24680 65 77 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ew;.      pPager
24690 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f  ->dbSize = (Pgno
246a0 29 28 28 6e 42 79 74 65 2b 70 61 67 65 53 69 7a  )((nByte+pageSiz
246b0 65 2d 31 29 2f 70 61 67 65 53 69 7a 65 29 3b 0a  e-1)/pageSize);.
246c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
246d0 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
246e0 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
246f0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
24700 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 7d  ree(pNew);.    }
24710 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53 69  .  }..  *pPageSi
24720 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
24730 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 72 63 3d  eSize;.  if( rc=
24740 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24750 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
24760 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50   ) nReserve = pP
24770 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a  ager->nReserve;.
24780 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
24790 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
247a0 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20  rve<1000 );.    
247b0 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
247c0 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76 65   = (i16)nReserve
247d0 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
247e0 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  tSize(pPager);. 
247f0 20 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69     pagerFixMapli
24800 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  mit(pPager);.  }
24810 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24820 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
24830 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22  pointer to the "
24840 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20  temporary page" 
24850 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65  buffer held inte
24860 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65  rnally.** by the
24870 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73   pager.  This is
24880 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69   a buffer that i
24890 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  s big enough to 
248a0 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69  hold the.** enti
248b0 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  re content of a 
248c0 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20  database page.  
248d0 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75  This buffer is u
248e0 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  sed internally.*
248f0 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  * during rollbac
24900 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76  k and will be ov
24910 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76  erwritten whenev
24920 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  er a rollback.**
24930 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74   occurs.  But ot
24940 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20  her modules are 
24950 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74  free to use it t
24960 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a  oo, as long as.*
24970 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61  * no rollbacks a
24980 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f  re happening..*/
24990 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
249a0 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67  gerTempSpace(Pag
249b0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
249c0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54  eturn pPager->pT
249d0 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  mpSpace;.}../*.*
249e0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
249f0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74   the maximum dat
24a00 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
24a10 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
24a20 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65  sitive. .** Make
24a30 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d   no changes if m
24a40 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72  xPage is zero or
24a50 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20   negative.  And 
24a60 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65  never reduce the
24a70 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  .** maximum page
24a80 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65   count below the
24a90 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
24aa0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
24ab0 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  *.** Regardless 
24ac0 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
24ad0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  n the current ma
24ae0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
24af0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24b00 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
24b10 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
24b20 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
24b30 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a  if( mxPage>0 ){.
24b40 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
24b50 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  no = mxPage;.  }
24b60 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
24b70 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
24b80 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a  _OPEN );      /*
24b90 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20   Called only by 
24ba0 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20  OP_MaxPgcnt */. 
24bb0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
24bc0 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d  >mxPgno>=pPager-
24bd0 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f 2a 20 4f  >dbSize );  /* O
24be0 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e 66 6f 72  P_MaxPgcnt enfor
24bf0 63 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 72 65  ces this */.  re
24c00 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50  turn pPager->mxP
24c10 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  gno;.}../*.** Th
24c20 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20  e following set 
24c30 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  of routines are 
24c40 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20  used to disable 
24c50 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  the simulated.**
24c60 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61   I/O error mecha
24c70 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75  nism.  These rou
24c80 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
24c90 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65  o avoid simulate
24ca0 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70  d.** errors in p
24cb0 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64  laces where we d
24cc0 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
24cd0 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55   errors..**.** U
24ce0 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54  nless -DSQLITE_T
24cf0 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74  EST=1 is used, t
24d00 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
24d10 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20  e all no-ops.** 
24d20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20  and generate no 
24d30 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  code..*/.#ifdef 
24d40 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65  SQLITE_TEST.exte
24d50 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
24d60 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
24d70 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
24d80 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  te3_io_error_hit
24d90 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
24da0 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73  ed_cnt;.void dis
24db0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
24dc0 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
24dd0 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71    saved_cnt = sq
24de0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
24df0 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65  ending;.  sqlite
24e00 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
24e10 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20  ng = -1;.}.void 
24e20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
24e30 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
24e40 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  {.  sqlite3_io_e
24e50 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73  rror_pending = s
24e60 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73  aved_cnt;.}.#els
24e70 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62  e.# define disab
24e80 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
24e90 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e  errors().# defin
24ea0 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  e enable_simulat
24eb0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
24ec0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
24ed0 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79  d the first N by
24ee0 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67  tes from the beg
24ef0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69  inning of the fi
24f00 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a  le into memory.*
24f10 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69  * that pDest poi
24f20 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  nts to. .**.** I
24f30 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  f the pager was 
24f40 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e  opened on a tran
24f50 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c  sient file (zFil
24f60 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a  ename==""), or.*
24f70 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69  * opened on a fi
24f80 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62  le less than N b
24f90 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68  ytes in size, th
24fa0 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
24fb0 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64  is.** zeroed and
24fc0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
24fd0 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61  ned. The rationa
24fe0 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73 20 74  le for this is t
24ff0 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  hat this .** fun
25000 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
25010 20 72 65 61 64 20 64 61 74 61 62 61 73 65 20 68   read database h
25020 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65  eaders, and a ne
25030 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a  w transient or.*
25040 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74  * zero sized dat
25050 61 62 61 73 65 20 68 61 73 20 61 20 68 65 61 64  abase has a head
25060 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73  er than consists
25070 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72   entirely of zer
25080 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  oes..**.** If an
25090 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74  y IO error apart
250a0 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45   from SQLITE_IOE
250b0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73  RR_SHORT_READ is
250c0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a   encountered,.**
250d0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
250e0 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
250f0 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68  he caller and th
25100 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
25110 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66  e.** output buff
25120 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  er undefined..*/
25130 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
25140 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
25150 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
25160 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63  nt N, unsigned c
25170 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69  har *pDest){.  i
25180 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
25190 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73  K;.  memset(pDes
251a0 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65  t, 0, N);.  asse
251b0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
251c0 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
251d0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20  ->tempFile );.. 
251e0 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
251f0 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
25200 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64 69 61  by btree immedia
25210 74 65 6c 79 20 61 66 74 65 72 20 63 72 65 61 74  tely after creat
25220 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50 61 67  ing.  ** the Pag
25230 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 72  er object.  Ther
25240 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  e has not been a
25250 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
25260 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a   transition.  **
25270 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65 74   to WAL mode yet
25280 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
25290 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
252a0 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  ager) );..  if( 
252b0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
252c0 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  d) ){.    IOTRAC
252d0 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25  E(("DBHDR %p 0 %
252e0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29  d\n", pPager, N)
252f0 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
25300 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
25310 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30  >fd, pDest, N, 0
25320 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
25330 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
25340 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
25350 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
25360 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
25370 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
25380 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
25390 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
253a0 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
253b0 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
253c0 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 72   on.** the pager
253d0 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74 68 65  . It returns the
253e0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
253f0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
25400 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f  tabase..**.** Ho
25410 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 66 69  wever, if the fi
25420 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20 31 20  le is between 1 
25430 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20  and <page-size> 
25440 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  bytes in size, t
25450 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20  hen .** this is 
25460 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20 70  considered a 1 p
25470 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69  age file..*/.voi
25480 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  d sqlite3PagerPa
25490 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
254a0 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61  Pager, int *pnPa
254b0 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
254c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
254d0 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
254e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
254f0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57  >eState!=PAGER_W
25500 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 29  RITER_FINISHED )
25510 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 28 69  ;.  *pnPage = (i
25520 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  nt)pPager->dbSiz
25530 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  e;.}.../*.** Try
25540 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63   to obtain a loc
25550 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79  k of type lockty
25560 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  pe on the databa
25570 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61  se file. If.** a
25580 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61   similar or grea
25590 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  ter lock is alre
255a0 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66  ady held, this f
255b0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
255c0 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67  op.** (returning
255d0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64   SQLITE_OK immed
255e0 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f  iately)..**.** O
255f0 74 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70  therwise, attemp
25600 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  t to obtain the 
25610 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74  lock using sqlit
25620 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f  e3OsLock(). Invo
25630 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20  ke .** the busy 
25640 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20  callback if the 
25650 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c  lock is currentl
25660 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  y not available.
25670 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69   Repeat .** unti
25680 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  l the busy callb
25690 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ack returns fals
256a0 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61  e or until the a
256b0 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62  ttempt to .** ob
256c0 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75  tain the lock su
256d0 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  cceeds..**.** Re
256e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
256f0 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e  n success and an
25700 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
25710 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a  e cannot obtain.
25720 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20  ** the lock. If 
25730 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61  the lock is obta
25740 69 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ined successfull
25750 79 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72  y, set the Pager
25760 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61  .state .** varia
25770 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20  ble to locktype 
25780 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
25790 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
257a0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
257b0 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
257c0 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
257d0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
257e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
25800 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
25810 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20  Check that this 
25820 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f  is either a no-o
25830 70 20 28 62 65 63 61 75 73 65 20 74 68 65 20 72  p (because the r
25840 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73  equested lock is
25850 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68   .  ** already h
25860 65 6c 64 29 2c 20 6f 72 20 6f 6e 65 20 6f 66 20  eld), or one of 
25870 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  the transitions 
25880 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68 61  that the busy-ha
25890 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62  ndler.  ** may b
258a0 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67  e invoked during
258b0 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
258c0 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
258d0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  .  ** sqlite3Pag
258e0 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
258f0 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ()..  */.  asser
25900 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  t( (pPager->eLoc
25910 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20  k>=locktype).   
25920 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
25930 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26  eLock==NO_LOCK &
25940 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  & locktype==SHAR
25950 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20  ED_LOCK).       
25960 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  || (pPager->eLoc
25970 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
25980 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58   && locktype==EX
25990 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20  CLUSIVE_LOCK).  
259a0 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72  );..  do {.    r
259b0 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
259c0 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65  pPager, locktype
259d0 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  );.  }while( rc=
259e0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
259f0 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
25a00 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
25a10 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b  syHandlerArg) );
25a20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25a30 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  ./*.** Function 
25a40 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
25a50 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
25a60 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65   checks that one
25a70 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c   of the .** foll
25a80 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f  owing is true fo
25a90 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  r all dirty page
25aa0 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  s currently in t
25ab0 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a  he page-cache:.*
25ac0 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61  *.**   a) The pa
25ad0 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  ge number is les
25ae0 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
25af0 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
25b00 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72  he .**      curr
25b10 65 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d 61  ent database ima
25b20 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52  ge, in pages, OR
25b30 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74  .**.**   b) if t
25b40 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
25b50 77 65 72 65 20 77 72 69 74 74 65 6e 20 61 74 20  were written at 
25b60 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f  this time, it wo
25b70 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  uld not.**      
25b80 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  be necessary to 
25b90 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
25ba0 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f  t content out to
25bb0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
25bc0 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65 74  .**      (as det
25bd0 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74  ermined by funct
25be0 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73  ion subjRequires
25bf0 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49  Page())..**.** I
25c00 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  f the condition 
25c10 61 73 73 65 72 74 65 64 20 62 79 20 74 68 69 73  asserted by this
25c20 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e   function were n
25c30 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65  ot true, and the
25c40 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 77  .** dirty page w
25c50 65 72 65 20 74 6f 20 62 65 20 64 69 73 63 61 72  ere to be discar
25c60 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63  ded from the cac
25c70 68 65 20 76 69 61 20 74 68 65 20 70 61 67 65 72  he via the pager
25c80 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74  Stress().** rout
25c90 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73 73  ine, pagerStress
25ca0 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69  () would not wri
25cb0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
25cc0 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a  age content to.*
25cd0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
25ce0 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f  ile. If a savepo
25cf0 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  int transaction 
25d00 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  were rolled back
25d10 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68   after.** this h
25d20 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72  appened, the cor
25d30 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 77 6f  rect behavior wo
25d40 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72  uld be to restor
25d50 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  e the current.**
25d60 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
25d70 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73  page. However, s
25d80 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e  ince this conten
25d90 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  t is not present
25da0 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68   in either.** th
25db0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
25dc0 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f  or the portion o
25dd0 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  f the rollback j
25de0 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73  ournal and .** s
25df0 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65  ub-journal rolle
25e00 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65  d back the conte
25e10 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  nt could not be 
25e20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65  restored and the
25e30 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61  .** database ima
25e40 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20  ge would become 
25e50 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20 74  corrupt. It is t
25e60 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61  herefore fortuna
25e70 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73  te that .** this
25e80 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61   circumstance ca
25e90 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23  nnot arise..*/.#
25ea0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
25eb0 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63 20  E_DEBUG).static 
25ec0 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63  void assertTrunc
25ed0 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28  ateConstraintCb(
25ee0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61  PgHdr *pPg){.  a
25ef0 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67  ssert( pPg->flag
25f00 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b  s&PGHDR_DIRTY );
25f10 0a 20 20 61 73 73 65 72 74 28 20 21 73 75 62 6a  .  assert( !subj
25f20 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
25f30 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d  ) || pPg->pgno<=
25f40 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53  pPg->pPager->dbS
25f50 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20  ize );.}.static 
25f60 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63  void assertTrunc
25f70 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61  ateConstraint(Pa
25f80 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
25f90 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65  sqlite3PcacheIte
25fa0 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72  rateDirty(pPager
25fb0 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65 72  ->pPCache, asser
25fc0 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
25fd0 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a  intCb);.}.#else.
25fe0 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 54  # define assertT
25ff0 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
26000 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66  t(pPager).#endif
26010 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
26020 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   the in-memory d
26030 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61  atabase file ima
26040 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65  ge to nPage page
26050 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  s. This .** func
26060 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63  tion does not ac
26070 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68  tually modify th
26080 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
26090 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20  on disk. It .** 
260a0 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69 6e  just sets the in
260b0 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20  ternal state of 
260c0 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
260d0 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a   so that the .**
260e0 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c   truncation will
260f0 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68   be done when th
26100 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
26110 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
26120 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ed..**.** This f
26130 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
26140 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66  called right bef
26150 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ore committing a
26160 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
26170 20 4f 6e 63 65 20 74 68 69 73 20 66 75 6e 63 74   Once this funct
26180 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 61 6c  ion has been cal
26190 6c 65 64 2c 20 74 68 65 20 74 72 61 6e 73 61 63  led, the transac
261a0 74 69 6f 6e 20 6d 75 73 74 20 65 69 74 68 65 72  tion must either
261b0 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61   be.** rolled ba
261c0 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 74 65 64 2e  ck or committed.
261d0 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20   It is not safe 
261e0 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  to call this fun
261f0 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68 65  ction and.** the
26200 6e 20 63 6f 6e 74 69 6e 75 65 20 77 72 69 74 69  n continue writi
26210 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
26220 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
26230 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
26240 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  Image(Pager *pPa
26250 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
26260 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
26270 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67  er->dbSize>=nPag
26280 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
26290 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
262a0 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
262b0 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65 72  EMOD );.  pPager
262c0 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
262d0 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70  ;..  /* At one p
262e0 6f 69 6e 74 20 74 68 65 20 63 6f 64 65 20 68 65  oint the code he
262f0 72 65 20 63 61 6c 6c 65 64 20 61 73 73 65 72 74  re called assert
26300 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
26310 6e 74 28 29 20 74 6f 0a 20 20 2a 2a 20 65 6e 73  nt() to.  ** ens
26320 75 72 65 20 74 68 61 74 20 61 6c 6c 20 70 61 67  ure that all pag
26330 65 73 20 62 65 69 6e 67 20 74 72 75 6e 63 61 74  es being truncat
26340 65 64 20 61 77 61 79 20 62 79 20 74 68 69 73 20  ed away by this 
26350 6f 70 65 72 61 74 69 6f 6e 20 61 72 65 2c 0a 20  operation are,. 
26360 20 2a 2a 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f   ** if one or mo
26370 72 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  re savepoints ar
26380 65 20 6f 70 65 6e 2c 20 70 72 65 73 65 6e 74 20  e open, present 
26390 69 6e 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  in the savepoint
263a0 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 73   .  ** journal s
263b0 6f 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20  o that they can 
263c0 62 65 20 72 65 73 74 6f 72 65 64 20 69 66 20 74  be restored if t
263d0 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  he savepoint is 
263e0 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b  rolled.  ** back
263f0 2e 20 54 68 69 73 20 69 73 20 6e 6f 20 6c 6f 6e  . This is no lon
26400 67 65 72 20 6e 65 63 65 73 73 61 72 79 20 61 73  ger necessary as
26410 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
26420 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a 20  s now only.  ** 
26430 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66  called right bef
26440 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ore committing a
26450 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f   transaction. So
26460 20 61 6c 74 68 6f 75 67 68 20 74 68 65 20 0a 20   although the . 
26470 20 2a 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   ** Pager object
26480 20 6d 61 79 20 73 74 69 6c 6c 20 68 61 76 65 20   may still have 
26490 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
264a0 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e  (Pager.nSavepoin
264b0 74 21 3d 30 29 2c 20 0a 20 20 2a 2a 20 74 68 65  t!=0), .  ** the
264c0 79 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c  y cannot be roll
264d0 65 64 20 62 61 63 6b 2e 20 53 6f 20 74 68 65 20  ed back. So the 
264e0 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
264f0 6e 73 74 72 61 69 6e 74 28 29 20 63 61 6c 6c 0a  nstraint() call.
26500 20 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65    ** is no longe
26510 72 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d 0a  r correct. */.}.
26520 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
26530 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
26540 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
26550 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  g a hot-journal 
26560 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20  rollback. It.** 
26570 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61  syncs the journa
26580 6c 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20  l file to disk, 
26590 74 68 65 6e 20 73 65 74 73 20 70 50 61 67 65 72  then sets pPager
265a0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20  ->journalHdr to 
265b0 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74  the.** size of t
265c0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
265d0 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65  so that the page
265e0 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75  r_playback() rou
265f0 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68  tine knows.** th
26600 61 74 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  at the entire jo
26610 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62  urnal file has b
26620 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a  een synced..**.*
26630 2a 20 53 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d  * Syncing a hot-
26640 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20  journal to disk 
26650 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
26660 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
26670 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68  k ensures .** th
26680 61 74 20 69 66 20 61 20 70 6f 77 65 72 2d 66 61  at if a power-fa
26690 69 6c 75 72 65 20 6f 63 63 75 72 73 20 64 75 72  ilure occurs dur
266a0 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
266b0 2c 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  , the process th
266c0 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 72  at.** attempts r
266d0 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e  ollback followin
266e0 67 20 73 79 73 74 65 6d 20 72 65 63 6f 76 65 72  g system recover
266f0 79 20 73 65 65 73 20 74 68 65 20 73 61 6d 65 20  y sees the same 
26700 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65  journal.** conte
26710 6e 74 20 61 73 20 74 68 69 73 20 70 72 6f 63 65  nt as this proce
26720 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  ss..**.** If eve
26730 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 73 20  rything goes as 
26740 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f  planned, SQLITE_
26750 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
26760 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61  Otherwise, .** a
26770 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
26780 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
26790 6e 74 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a  nt pagerSyncHotJ
267a0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
267b0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
267c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
267d0 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
267e0 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  nc ){.    rc = s
267f0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
26800 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
26810 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20  _SYNC_NORMAL);. 
26820 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
26830 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
26840 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
26850 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
26860 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
26870 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65  alHdr);.  }.  re
26880 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
26890 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66 65 72  * Obtain a refer
268a0 65 6e 63 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79  ence to a memory
268b0 20 6d 61 70 70 65 64 20 70 61 67 65 20 6f 62 6a   mapped page obj
268c0 65 63 74 20 66 6f 72 20 70 61 67 65 20 6e 75 6d  ect for page num
268d0 62 65 72 20 70 67 6e 6f 2e 20 0a 2a 2a 20 54 68  ber pgno. .** Th
268e0 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 77 69 6c  e new object wil
268f0 6c 20 75 73 65 20 74 68 65 20 70 6f 69 6e 74 65  l use the pointe
26900 72 20 70 44 61 74 61 2c 20 6f 62 74 61 69 6e 65  r pData, obtaine
26910 64 20 66 72 6f 6d 20 78 46 65 74 63 68 28 29 2e  d from xFetch().
26920 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
26930 6c 2c 20 73 65 74 20 2a 70 70 50 61 67 65 20 74  l, set *ppPage t
26940 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
26950 65 77 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ew page referenc
26960 65 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20  e.** and return 
26970 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72  SQLITE_OK. Other
26980 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  wise, return an 
26990 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
269a0 65 20 61 6e 64 20 73 65 74 0a 2a 2a 20 2a 70 70  e and set.** *pp
269b0 50 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a  Page to zero..**
269c0 0a 2a 2a 20 50 61 67 65 20 72 65 66 65 72 65 6e  .** Page referen
269d0 63 65 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20  ces obtained by 
269e0 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
269f0 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  ction should be 
26a00 72 65 6c 65 61 73 65 64 0a 2a 2a 20 62 79 20 63  released.** by c
26a10 61 6c 6c 69 6e 67 20 70 61 67 65 72 52 65 6c 65  alling pagerRele
26a20 61 73 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f  aseMapPage()..*/
26a30 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
26a40 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28  rAcquireMapPage(
26a50 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
26a60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26a70 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
26a80 63 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ct */.  Pgno pgn
26a90 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
26aa0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
26ab0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 76 6f 69 64  number */.  void
26ac0 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20 20 20   *pData,        
26ad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
26ae0 46 65 74 63 68 28 29 27 64 20 64 61 74 61 20 66  Fetch()'d data f
26af0 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
26b00 20 20 50 67 48 64 72 20 2a 2a 70 70 50 61 67 65    PgHdr **ppPage
26b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b20 20 20 2f 2a 20 4f 55 54 3a 20 41 63 71 75 69 72    /* OUT: Acquir
26b30 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20 2a  ed page object *
26b40 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b  /.){.  PgHdr *p;
26b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b60 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
26b70 20 6d 61 70 70 65 64 20 70 61 67 65 20 74 6f 20   mapped page to 
26b80 72 65 74 75 72 6e 20 2a 2f 0a 20 20 0a 20 20 69  return */.  .  i
26b90 66 28 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70  f( pPager->pMmap
26ba0 46 72 65 65 6c 69 73 74 20 29 7b 0a 20 20 20 20  Freelist ){.    
26bb0 2a 70 70 50 61 67 65 20 3d 20 70 20 3d 20 70 50  *ppPage = p = pP
26bc0 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c  ager->pMmapFreel
26bd0 69 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ist;.    pPager-
26be0 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 3d  >pMmapFreelist =
26bf0 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20   p->pDirty;.    
26c00 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  p->pDirty = 0;. 
26c10 20 20 20 6d 65 6d 73 65 74 28 70 2d 3e 70 45 78     memset(p->pEx
26c20 74 72 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  tra, 0, pPager->
26c30 6e 45 78 74 72 61 29 3b 0a 20 20 7d 65 6c 73 65  nExtra);.  }else
26c40 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
26c50 70 20 3d 20 28 50 67 48 64 72 20 2a 29 73 71 6c  p = (PgHdr *)sql
26c60 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
26c70 69 7a 65 6f 66 28 50 67 48 64 72 29 20 2b 20 70  izeof(PgHdr) + p
26c80 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a  Pager->nExtra);.
26c90 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a      if( p==0 ){.
26ca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
26cb0 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
26cc0 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29  d, (i64)(pgno-1)
26cd0 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   * pPager->pageS
26ce0 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20  ize, pData);.   
26cf0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26d00 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
26d10 20 7d 0a 20 20 20 20 70 2d 3e 70 45 78 74 72 61   }.    p->pExtra
26d20 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d   = (void *)&p[1]
26d30 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d  ;.    p->flags =
26d40 20 50 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20 20   PGHDR_MMAP;.   
26d50 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20   p->nRef = 1;.  
26d60 20 20 70 2d 3e 70 50 61 67 65 72 20 3d 20 70 50    p->pPager = pP
26d70 61 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  ager;.  }..  ass
26d80 65 72 74 28 20 70 2d 3e 70 45 78 74 72 61 3d 3d  ert( p->pExtra==
26d90 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29 3b  (void *)&p[1] );
26da0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
26db0 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  age==0 );.  asse
26dc0 72 74 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50 47  rt( p->flags==PG
26dd0 48 44 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61 73  HDR_MMAP );.  as
26de0 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65 72 3d  sert( p->pPager=
26df0 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73  =pPager );.  ass
26e00 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31 20  ert( p->nRef==1 
26e10 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d 20  );..  p->pgno = 
26e20 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74 61  pgno;.  p->pData
26e30 20 3d 20 70 44 61 74 61 3b 0a 20 20 70 50 61 67   = pData;.  pPag
26e40 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b 0a  er->nMmapOut++;.
26e50 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
26e60 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
26e70 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e 63  lease a referenc
26e80 65 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20 70  e to page pPg. p
26e90 50 67 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  Pg must have bee
26ea0 6e 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e  n returned by an
26eb0 20 0a 2a 2a 20 65 61 72 6c 69 65 72 20 63 61 6c   .** earlier cal
26ec0 6c 20 74 6f 20 70 61 67 65 72 41 63 71 75 69 72  l to pagerAcquir
26ed0 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73  eMapPage()..*/.s
26ee0 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
26ef0 52 65 6c 65 61 73 65 4d 61 70 50 61 67 65 28 50  ReleaseMapPage(P
26f00 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
26f10 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
26f20 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 50 61  g->pPager;.  pPa
26f30 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2d 2d 3b  ger->nMmapOut--;
26f40 0a 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d  .  pPg->pDirty =
26f50 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72   pPager->pMmapFr
26f60 65 65 6c 69 73 74 3b 0a 20 20 70 50 61 67 65 72  eelist;.  pPager
26f70 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 20  ->pMmapFreelist 
26f80 3d 20 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74  = pPg;..  assert
26f90 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  ( pPager->fd->pM
26fa0 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e  ethods->iVersion
26fb0 3e 3d 33 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  >=3 );.  sqlite3
26fc0 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72  OsUnfetch(pPager
26fd0 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 50 67 2d  ->fd, (i64)(pPg-
26fe0 3e 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d  >pgno-1)*pPager-
26ff0 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 67 2d 3e  >pageSize, pPg->
27000 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pData);.}../*.**
27010 20 46 72 65 65 20 61 6c 6c 20 50 67 48 64 72 20   Free all PgHdr 
27020 6f 62 6a 65 63 74 73 20 73 74 6f 72 65 64 20 69  objects stored i
27030 6e 20 74 68 65 20 50 61 67 65 72 2e 70 4d 6d 61  n the Pager.pMma
27040 70 46 72 65 65 6c 69 73 74 20 6c 69 73 74 2e 0a  pFreelist list..
27050 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
27060 61 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28  agerFreeMapHdrs(
27070 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
27080 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 50 67    PgHdr *p;.  Pg
27090 48 64 72 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f  Hdr *pNext;.  fo
270a0 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 4d 6d 61  r(p=pPager->pMma
270b0 70 46 72 65 65 6c 69 73 74 3b 20 70 3b 20 70 3d  pFreelist; p; p=
270c0 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
270d0 74 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20  t = p->pDirty;. 
270e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
270f0 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  p);.  }.}.../*.*
27100 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
27110 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65  age cache.  Free
27120 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20   all memory and 
27130 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e  close all files.
27140 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
27150 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70  saction was in p
27160 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69  rogress when thi
27170 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
27180 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61  led, that.** tra
27190 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
271a0 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75  ed back.  All ou
271b0 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
271c0 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a  are invalidated.
271d0 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d  ** and their mem
271e0 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41  ory is freed.  A
271f0 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
27200 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61  e a page associa
27210 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73  ted.** with this
27220 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65   page cache afte
27230 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
27240 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b  returns will lik
27250 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  ely.** result in
27260 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a   a coredump..**.
27270 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
27280 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73   always succeeds
27290 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
272a0 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20  on is active an 
272b0 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61  attempt.** is ma
272c0 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  de to roll it ba
272d0 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ck. If an error 
272e0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
272f0 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61  e rollback .** a
27300 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79   hot journal may
27310 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20   be left in the 
27320 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e  filesystem but n
27330 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  o error is retur
27340 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61  ned.** to the ca
27350 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ller..*/.int sql
27360 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50  ite3PagerClose(P
27370 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
27380 20 75 38 20 2a 70 54 6d 70 20 3d 20 28 75 38 20   u8 *pTmp = (u8 
27390 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  *)pPager->pTmpSp
273a0 61 63 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ace;..  assert( 
273b0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
273c0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
273d0 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
273e0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
273f0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
27400 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70  ignMalloc();.  p
27410 61 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28  agerFreeMapHdrs(
27420 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20 70 50  pPager);.  /* pP
27430 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
27440 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
27450 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
27460 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
27470 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71 6c  E_OMIT_WAL.  sql
27480 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61  ite3WalClose(pPa
27490 67 65 72 2d 3e 70 57 61 6c 2c 20 70 50 61 67 65  ger->pWal, pPage
274a0 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73  r->ckptSyncFlags
274b0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
274c0 7a 65 2c 20 70 54 6d 70 29 3b 0a 20 20 70 50 61  ze, pTmp);.  pPa
274d0 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23  ger->pWal = 0;.#
274e0 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65  endif.  pager_re
274f0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
27500 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
27510 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
27520 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
27530 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6f     /* If it is o
27540 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  pen, sync the jo
27550 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
27560 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b  e calling Unlock
27570 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20  AndRollback..   
27580 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e   ** If this is n
27590 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e  ot done, then an
275a0 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f   unsynced portio
275b0 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f  n of the open jo
275c0 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69  urnal .    ** fi
275d0 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65 64  le may be played
275e0 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
275f0 61 74 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f  atabase. If a po
27600 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
27610 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65  rs .    ** while
27620 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69   this is happeni
27630 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ng, the database
27640 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f   could become co
27650 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  rrupt..    **.  
27660 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    ** If an error
27670 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
27680 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68 65  ying to sync the
27690 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74 20   journal, shift 
276a0 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
276b0 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20   into the ERROR 
276c0 73 74 61 74 65 2e 20 54 68 69 73 20 63 61 75 73  state. This caus
276d0 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  es UnlockAndRoll
276e0 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  back to unlock t
276f0 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
27700 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  se and close the
27710 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
27720 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67  thout attempting
27730 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20   to roll it.    
27740 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c  ** back or final
27750 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78 74  ize it. The next
27760 20 64 61 74 61 62 61 73 65 20 75 73 65 72 20 77   database user w
27770 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20 68  ill have to do h
27780 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  ot-journal.    *
27790 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72  * rollback befor
277a0 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  e accessing the 
277b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
277c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73     */.    if( is
277d0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
277e0 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  ) ){.      pager
277f0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70  _error(pPager, p
27800 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
27810 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  al(pPager));.   
27820 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f   }.    pagerUnlo
27830 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
27840 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ager);.  }.  sql
27850 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
27860 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f  loc();.  enable_
27870 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
27880 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52  ors();.  PAGERTR
27890 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e  ACE(("CLOSE %d\n
278a0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
278b0 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  r)));.  IOTRACE(
278c0 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70  ("CLOSE %p\n", p
278d0 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65  Pager)).  sqlite
278e0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
278f0 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  >jfd);.  sqlite3
27900 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
27910 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  fd);.  sqlite3Pa
27920 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20  geFree(pTmp);.  
27930 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f  sqlite3PcacheClo
27940 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  se(pPager->pPCac
27950 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  he);..#ifdef SQL
27960 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
27970 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  if( pPager->xCod
27980 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d  ecFree ) pPager-
27990 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67  >xCodecFree(pPag
279a0 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e  er->pCodec);.#en
279b0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21  dif..  assert( !
279c0 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
279d0 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70  nt && !pPager->p
279e0 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  InJournal );.  a
279f0 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
27a00 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21  Pager->jfd) && !
27a10 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
27a20 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74  jfd) );..  sqlit
27a30 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
27a40 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
27a50 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  _OK;.}..#if !def
27a60 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
27a70 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
27a80 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
27a90 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
27aa0 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  r for page pPg..
27ab0 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50  */.Pgno sqlite3P
27ac0 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44  agerPagenumber(D
27ad0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
27ae0 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b  eturn pPg->pgno;
27af0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
27b00 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
27b10 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
27b20 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
27b30 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
27b40 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  rRef(DbPage *pPg
27b50 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
27b60 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f  heRef(pPg);.}../
27b70 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f  *.** Sync the jo
27b80 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20  urnal. In other 
27b90 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
27ba0 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
27bb0 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
27bc0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
27bd0 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
27be0 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
27bf0 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
27c00 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e  .** disk and can
27c10 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20   be restored in 
27c20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68  the event of a h
27c30 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
27c40 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
27c50 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66  e Pager.noSync f
27c60 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
27c70 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
27c80 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74  s a no-op..** Ot
27c90 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 63 74  herwise, the act
27ca0 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64 65  ions required de
27cb0 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  pend on the jour
27cc0 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65  nal-mode and the
27cd0 20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61 72   .** device char
27ce0 61 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74  acteristics of t
27cf0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
27d00 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
27d10 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75  *   * If the jou
27d20 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20  rnal file is an 
27d30 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
27d40 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f  l file, no actio
27d50 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65  n need.**     be
27d60 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20   taken..**.**   
27d70 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
27d80 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20  the device does 
27d90 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20  not support the 
27da0 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70  SAFE_APPEND prop
27db0 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65  erty,.**     the
27dc0 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  n the nRec field
27dd0 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
27de0 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f  ently written jo
27df0 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20  urnal header.** 
27e00 20 20 20 20 69 73 20 75 70 64 61 74 65 64 20 74      is updated t
27e10 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75  o contain the nu
27e20 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  mber of journal 
27e30 72 65 63 6f 72 64 73 20 74 68 61 74 20 68 61 76  records that hav
27e40 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72  e.**     been wr
27e50 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20  itten following 
27e60 69 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  it. If the pager
27e70 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e   is operating in
27e80 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20   full-sync.**   
27e90 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65    mode, then the
27ea0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
27eb0 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74   synced before t
27ec0 68 69 73 20 66 69 65 6c 64 20 69 73 20 75 70 64  his field is upd
27ed0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ated..**.**   * 
27ee0 49 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f  If the device do
27ef0 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74  es not support t
27f00 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72  he SEQUENTIAL pr
27f10 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a  operty, then .**
27f20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
27f30 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  e is synced..**.
27f40 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f  ** Or, in pseudo
27f50 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  -code:.**.**   i
27f60 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72  f( NOT <in-memor
27f70 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a  y journal> ){.**
27f80 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46       if( NOT SAF
27f90 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20  E_APPEND ){.**  
27fa0 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73       if( <full-s
27fb0 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e  ync mode> ) xSyn
27fc0 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e  c(<journal file>
27fd0 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64  );.**       <upd
27fe0 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a  ate nRec field>.
27ff0 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20  **     } .**    
28000 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54   if( NOT SEQUENT
28010 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75  IAL ) xSync(<jou
28020 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20  rnal file>);.** 
28030 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63    }.**.** If suc
28040 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f  cessful, this ro
28050 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65  utine clears the
28060 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
28070 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a   flag of every .
28080 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c  ** page currentl
28090 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79  y held in memory
280a0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
280b0 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  g SQLITE_OK. If 
280c0 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69  an IO.** error i
280d0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  s encountered, t
280e0 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
280f0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
28100 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
28110 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
28120 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
28130 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 65   *pPager, int ne
28140 77 48 64 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  wHdr){.  int rc;
28150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28160 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
28170 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73  rn code */..  as
28180 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
28190 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
281a0 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
281b0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
281c0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
281d0 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20  ER_DBMOD.  );.  
281e0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
281f0 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
28200 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
28210 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
28220 67 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20  ger) );..  rc = 
28230 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c  sqlite3PagerExcl
28240 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72  usiveLock(pPager
28250 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
28260 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
28270 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67  rc;..  if( !pPag
28280 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
28290 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
282a0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
282b0 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
282c0 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50  ager->jfd) && pP
282d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
282e0 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
282f0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
28300 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
28310 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
28320 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
28330 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
28340 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
28350 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
28360 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  d) );..      if(
28370 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
28380 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
28390 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  D) ){.        /*
283a0 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c   This block deal
283b0 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72  s with an obscur
283c0 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68  e problem. If th
283d0 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f  e last connectio
283e0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  n.        ** tha
283f0 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20  t wrote to this 
28400 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65  database was ope
28410 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73  rating in persis
28420 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20  tent-journal.   
28430 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68       ** mode, th
28440 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
28450 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20  ile may at this 
28460 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62  point actually b
28470 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20  e larger.       
28480 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a   ** than Pager.j
28490 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e  ournalOff bytes.
284a0 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69   If the next thi
284b0 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ng in the journa
284c0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c  l.        ** fil
284d0 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
284e0 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
284f0 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72   (written as par
28500 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  t of the.       
28510 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e   ** previous con
28520 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61  nection's transa
28530 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72  ction), and a cr
28540 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69  ash or power-fai
28550 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  lure .        **
28560 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e 52   occurs after nR
28570 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62 75  ec is updated bu
28580 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f  t before this co
28590 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20  nnection writes 
285a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74  .        ** anyt
285b0 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65  hing else to the
285c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
285d0 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20  r commits/rolls 
285e0 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20  back its .      
285f0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
28600 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d  ), then SQLite m
28610 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73  ay become confus
28620 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68  ed when doing th
28630 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f  e .        ** ho
28640 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
28650 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63  ck following rec
28660 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f  overy. It may ro
28670 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20  ll back all.    
28680 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63      ** of this c
28690 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c  onnections data,
286a0 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f   then proceed to
286b0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68   rolling back th
286c0 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a  e old,.        *
286d0 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61  * out-of-date da
286e0 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  ta that follows 
286f0 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72  it. Database cor
28700 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  ruption..       
28710 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
28720 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
28730 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  is, if the journ
28740 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70  al file does app
28750 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20  ear to contain. 
28760 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69         ** a vali
28770 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69  d header followi
28780 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ng Pager.journal
28790 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20  Off, then write 
287a0 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a  a 0x00.        *
287b0 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73 74  * byte to the st
287c0 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65  art of it to pre
287d0 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69  vent it from bei
287e0 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20  ng recognized.. 
287f0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
28800 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e    ** Variable iN
28810 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73 20  extHdrOffset is 
28820 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65  set to the offse
28830 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73 0a  t at which this.
28840 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c          ** probl
28850 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77 69  ematic header wi
28860 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20  ll occur, if it 
28870 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69  exists. aMagic i
28880 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20  s used .        
28890 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72  ** as a temporar
288a0 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70  y buffer to insp
288b0 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63 6f  ect the first co
288c0 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66  uple of bytes of
288d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
288e0 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61  potential journa
288f0 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20  l header..      
28900 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34    */.        i64
28910 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b   iNextHdrOffset;
28920 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61 67  .        u8 aMag
28930 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75  ic[8];.        u
28940 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  8 zHeader[sizeof
28950 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
28960 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d  4];..        mem
28970 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
28980 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
28990 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
289a0 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33  ));.        put3
289b0 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
289c0 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
289d0 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e  gic)], pPager->n
289e0 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  Rec);..        i
289f0 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20  NextHdrOffset = 
28a00 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
28a10 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
28a20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
28a30 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
28a40 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65  , aMagic, 8, iNe
28a50 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20  xtHdrOffset);.  
28a60 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
28a70 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65  LITE_OK && 0==me
28a80 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
28a90 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29  urnalMagic, 8) )
28aa0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74  {.          stat
28ab0 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f  ic const u8 zero
28ac0 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  byte = 0;.      
28ad0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28ae0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
28af0 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20  jfd, &zerobyte, 
28b00 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  1, iNextHdrOffse
28b10 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
28b20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
28b30 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
28b40 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
28b50 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
28b60 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
28b70 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
28b80 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
28b90 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  Rec value into t
28ba0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
28bb0 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20  header. If in.  
28bc0 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79        ** full-sy
28bd0 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
28be0 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
28bf0 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73   first. This ens
28c00 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20  ures that.      
28c10 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61    ** all data ha
28c20 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65  s really hit the
28c30 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65   disk before nRe
28c40 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  c is updated to 
28c50 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  mark.        ** 
28c60 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74  it as a candidat
28c70 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a  e for rollback..
28c80 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
28c90 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f     ** This is no
28ca0 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68  t required if th
28cb0 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64  e persistent med
28cc0 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a  ia supports the.
28cd0 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f          ** SAFE_
28ce0 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e  APPEND property.
28cf0 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73   Because in this
28d00 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20   case it is not 
28d10 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20  possible .      
28d20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65    ** for garbage
28d30 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65   data to be appe
28d40 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65  nded to the file
28d50 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  , the nRec field
28d60 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70  .        ** is p
28d70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78  opulated with 0x
28d80 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68  FFFFFFFF when th
28d90 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
28da0 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20   is written.    
28db0 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72      ** and never
28dc0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
28dd0 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ated..        */
28de0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
28df0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26  ger->fullSync &&
28e00 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
28e10 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
28e20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  ) ){.          P
28e30 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
28e40 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
28e50 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
28e60 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r)));.          
28e70 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
28e80 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
28e90 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
28ea0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
28eb0 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
28ec0 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20  ->syncFlags);.  
28ed0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
28ee0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
28ef0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
28f00 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
28f10 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c  (("JHDR %p %lld\
28f20 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
28f30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29  er->journalHdr))
28f40 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
28f50 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20  qlite3OsWrite(. 
28f60 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
28f70 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
28f80 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29   sizeof(zHeader)
28f90 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
28fa0 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b 0a  lHdr.        );.
28fb0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
28fc0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
28fd0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
28fe0 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
28ff0 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
29000 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
29010 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
29020 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
29030 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
29040 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
29050 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
29060 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
29070 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d  r)).        rc =
29080 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
29090 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
290a0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a  er->syncFlags| .
290b0 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
290c0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51  r->syncFlags==SQ
290d0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53  LITE_SYNC_FULL?S
290e0 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
290f0 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29  NLY:0).        )
29100 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
29110 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
29120 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
29130 0a 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ..      pPager->
29140 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
29150 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
29160 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 48 64  .      if( newHd
29170 72 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c  r && 0==(iDc&SQL
29180 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
29190 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20  PPEND) ){.      
291a0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
291b0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
291c0 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
291d0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
291e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
291f0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
29200 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
29210 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72  se{.      pPager
29220 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
29230 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
29240 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  f;.    }.  }..  
29250 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61  /* Unless the pa
29260 67 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63  ger is in noSync
29270 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e   mode, the journ
29280 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74  al file was just
29290 20 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75   .  ** successfu
292a0 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74 68  lly synced. Eith
292b0 65 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74 68  er way, clear th
292c0 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
292d0 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20  C flag on .  ** 
292e0 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a  all pages..  */.
292f0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
29300 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50  learSyncFlags(pP
29310 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
29320 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
29330 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f   = PAGER_WRITER_
29340 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74 28  DBMOD;.  assert(
29350 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
29360 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
29370 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
29380 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
29390 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
293a0 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65  first in a linke
293b0 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20  d list of dirty 
293c0 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a  pages connected.
293d0 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72 2e  ** by the PgHdr.
293e0 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20  pDirty pointer. 
293f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72  This function wr
29400 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66  ites each one of
29410 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72   the.** in-memor
29420 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c  y pages in the l
29430 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ist to the datab
29440 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72  ase file. The ar
29450 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65  gument may.** be
29460 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74   NULL, represent
29470 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73  ing an empty lis
29480 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
29490 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
294a0 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a  .** a no-op..**.
294b0 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75 73  ** The pager mus
294c0 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20  t hold at least 
294d0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
294e0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
294f0 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e  on.** is called.
29500 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   Before writing 
29510 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20  anything to the 
29520 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
29530 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75  his lock.** is u
29540 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58  pgraded to an EX
29550 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
29560 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74   the lock cannot
29570 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a   be obtained,.**
29580 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
29590 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20  returned and no 
295a0 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
295b0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
295c0 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  file..** .** If 
295d0 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20 74  the pager is a t
295e0 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61  emp-file pager a
295f0 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66 69  nd the actual fi
29600 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a  le-system file.*
29610 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65  * is not yet ope
29620 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64  n, it is created
29630 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f   and opened befo
29640 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a  re any data is .
29650 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a  ** written out..
29660 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c  **.** Once the l
29670 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67  ock has been upg
29680 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65  raded and, if ne
29690 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c  cessary, the fil
296a0 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65  e opened,.** the
296b0 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74   pages are writt
296c0 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  en out to the da
296d0 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c  tabase file in l
296e0 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69  ist order. Writi
296f0 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20  ng.** a page is 
29700 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d 65  skipped if it me
29710 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74 68  ets either of th
29720 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74  e following crit
29730 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  eria:.**.**   * 
29740 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
29750 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
29760 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72  Pager.dbSize, or
29770 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44  .**   * The PGHD
29780 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61  R_DONT_WRITE fla
29790 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20  g is set on the 
297a0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  page..**.** If w
297b0 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67  riting out a pag
297c0 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74  e causes the dat
297d0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
297e0 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65  ow, Pager.dbFile
297f0 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74  Size.** is updat
29800 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20  ed accordingly. 
29810 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72 69  If page 1 is wri
29820 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74  tten out, then t
29830 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a  he value cached.
29840 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69  ** in Pager.dbFi
29850 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61  leVers[] is upda
29860 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ted to match the
29870 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65   new value store
29880 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61  d in.** the data
29890 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
298a0 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   If everything i
298b0 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  s successful, SQ
298c0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
298d0 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
298e0 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20  ror .** occurs, 
298f0 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
29900 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72   is returned. Or
29910 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53 49  , if the EXCLUSI
29920 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a  VE lock cannot.*
29930 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53  * be obtained, S
29940 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
29950 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
29960 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
29970 65 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65 72  e_pagelist(Pager
29980 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
29990 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 72  *pList){.  int r
299a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
299b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299c0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
299d0 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  /..  /* This fun
299e0 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61  ction is only ca
299f0 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63  lled for rollbac
29a00 6b 20 70 61 67 65 72 73 20 69 6e 20 57 52 49 54  k pagers in WRIT
29a10 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e 20  ER_DBMOD state. 
29a20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61  */.  assert( !pa
29a30 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
29a40 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
29a50 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
29a60 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
29a70 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
29a80 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72  DBMOD );.  asser
29a90 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
29aa0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
29ab0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
29ac0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
29ad0 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 44 69 72 74   || pList->pDirt
29ae0 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  y==0 );..  /* If
29af0 20 74 68 65 20 66 69 6c 65 20 69 73 20 61 20 74   the file is a t
29b00 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74  emp-file has not
29b10 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
29b20 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49  , open it now. I
29b30 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f  t.  ** is not po
29b40 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f  ssible for rc to
29b50 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53   be other than S
29b60 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73  QLITE_OK if this
29b70 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20   branch.  ** is 
29b80 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f  taken, as pager_
29b90 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69  wait_on_lock() i
29ba0 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65  s a no-op for te
29bb0 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20  mp-files..  */. 
29bc0 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
29bd0 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
29be0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
29bf0 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d  tempFile && rc==
29c00 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
29c10 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74   rc = pagerOpent
29c20 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67  emp(pPager, pPag
29c30 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
29c40 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a  vfsFlags);.  }..
29c50 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20    /* Before the 
29c60 66 69 72 73 74 20 77 72 69 74 65 2c 20 67 69 76  first write, giv
29c70 65 20 74 68 65 20 56 46 53 20 61 20 68 69 6e 74  e the VFS a hint
29c80 20 6f 66 20 77 68 61 74 20 74 68 65 20 66 69 6e   of what the fin
29c90 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a  al.  ** file siz
29ca0 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a  e will be..  */.
29cb0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
29cc0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
29cd0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
29ce0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
29cf0 45 5f 4f 4b 20 0a 20 20 20 26 26 20 70 50 61 67  E_OK .   && pPag
29d00 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 3c 70  er->dbHintSize<p
29d10 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 0a 20 20  Pager->dbSize.  
29d20 20 26 26 20 28 70 4c 69 73 74 2d 3e 70 44 69 72   && (pList->pDir
29d30 74 79 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 67 6e  ty || pList->pgn
29d40 6f 3e 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  o>pPager->dbHint
29d50 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 20 73  Size).  ){.    s
29d60 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 46  qlite3_int64 szF
29d70 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ile = pPager->pa
29d80 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65  geSize * (sqlite
29d90 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72 2d 3e  3_int64)pPager->
29da0 64 62 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69  dbSize;.    sqli
29db0 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
29dc0 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c  Hint(pPager->fd,
29dd0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49   SQLITE_FCNTL_SI
29de0 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65  ZE_HINT, &szFile
29df0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
29e00 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67  bHintSize = pPag
29e10 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a  er->dbSize;.  }.
29e20 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
29e30 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74  LITE_OK && pList
29e40 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
29e50 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b  o = pList->pgno;
29e60 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
29e70 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65  e are dirty page
29e80 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
29e90 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75  che with page nu
29ea0 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20  mbers greater.  
29eb0 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
29ec0 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61  dbSize, this mea
29ed0 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  ns sqlite3PagerT
29ee0 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77  runcateImage() w
29ef0 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20  as called to.   
29f00 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c   ** make the fil
29f10 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75  e smaller (presu
29f20 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61  mably by auto-va
29f30 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e  cuum code). Do n
29f40 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20  ot write.    ** 
29f50 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74  any such pages t
29f60 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  o the file..    
29f70 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20  **.    ** Also, 
29f80 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74  do not write out
29f90 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 68   any page that h
29fa0 61 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e  as the PGHDR_DON
29fb0 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20  T_WRITE flag.   
29fc0 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79 20   ** set (set by 
29fd0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
29fe0 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f  Write())..    */
29ff0 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
2a000 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26  Pager->dbSize &&
2a010 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67   0==(pList->flag
2a020 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  s&PGHDR_DONT_WRI
2a030 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34  TE) ){.      i64
2a040 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d   offset = (pgno-
2a050 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
2a060 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f  pageSize;   /* O
2a070 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 2a  ffset to write *
2a080 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44  /.      char *pD
2a090 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
2a0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0b0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 74         /* Data t
2a0c0 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a  o write */    ..
2a0d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
2a0e0 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44  List->flags&PGHD
2a0f0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20  R_NEED_SYNC)==0 
2a100 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  );.      if( pLi
2a110 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61  st->pgno==1 ) pa
2a120 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65  ger_write_change
2a130 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a  counter(pList);.
2a140 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65  .      /* Encode
2a150 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
2a160 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50  .      CODEC2(pP
2a170 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61  ager, pList->pDa
2a180 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74  ta, pgno, 6, ret
2a190 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2a1a0 5f 42 4b 50 54 2c 20 70 44 61 74 61 29 3b 0a 0a  _BKPT, pData);..
2a1b0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f        /* Write o
2a1c0 75 74 20 74 68 65 20 70 61 67 65 20 64 61 74 61  ut the page data
2a1d0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
2a1e0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
2a1f0 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61  Pager->fd, pData
2a200 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
2a210 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20  ze, offset);..  
2a220 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31      /* If page 1
2a230 20 77 61 73 20 6a 75 73 74 20 77 72 69 74 74 65   was just writte
2a240 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65 72 2e  n, update Pager.
2a250 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61  dbFileVers to ma
2a260 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  tch.      ** the
2a270 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65   value now store
2a280 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
2a290 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69  e file. If writi
2a2a0 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a  ng this .      *
2a2b0 2a 20 70 61 67 65 20 63 61 75 73 65 64 20 74 68  * page caused th
2a2c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2a2d0 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20  to grow, update 
2a2e0 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20  dbFileSize. .   
2a2f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
2a300 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pgno==1 ){.     
2a310 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
2a320 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
2a330 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f  pData[24], sizeo
2a340 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
2a350 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
2a360 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70        if( pgno>p
2a370 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
2a380 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  e ){.        pPa
2a390 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
2a3a0 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  = pgno;.      }.
2a3b0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53        pPager->aS
2a3c0 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57  tat[PAGER_STAT_W
2a3d0 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20 20  RITE]++;..      
2a3e0 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20 62 61  /* Update any ba
2a3f0 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70  ckup objects cop
2a400 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
2a410 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e  s of this pager.
2a420 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2a430 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50  3BackupUpdate(pP
2a440 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70  ager->pBackup, p
2a450 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d  gno, (u8*)pList-
2a460 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20  >pData);..      
2a470 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4f  PAGERTRACE(("STO
2a480 52 45 20 25 64 20 70 61 67 65 20 25 64 20 68 61  RE %d page %d ha
2a490 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
2a4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4b0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
2a4c0 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67   pgno, pager_pag
2a4d0 65 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a  ehash(pList)));.
2a4e0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
2a4f0 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20  PGOUT %p %d\n", 
2a500 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
2a510 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
2a520 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  (sqlite3_pager_w
2a530 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20  ritedb_count);. 
2a540 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a550 50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53  PAGERTRACE(("NOS
2a560 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c  TORE %d page %d\
2a570 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
2a580 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  er), pgno));.   
2a590 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74   }.    pager_set
2a5a0 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
2a5b0 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c  ;.    pList = pL
2a5c0 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d  ist->pDirty;.  }
2a5d0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2a5e0 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74  ../*.** Ensure t
2a5f0 68 61 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  hat the sub-jour
2a600 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
2a610 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61  . If it is alrea
2a620 64 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a  dy open, this .*
2a630 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  * function is a 
2a640 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  no-op..**.** SQL
2a650 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2a660 65 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  ed if everything
2a670 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20   goes according 
2a680 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20  to plan. An .** 
2a690 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
2a6a0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
2a6b0 65 74 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c  eturned if a cal
2a6c0 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70  l to sqlite3OsOp
2a6d0 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a  en() .** fails..
2a6e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
2a6f0 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67  enSubJournal(Pag
2a700 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2a710 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2a720 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  K;.  if( !isOpen
2a730 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
2a740 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
2a750 66 6c 61 67 73 20 3d 20 20 53 51 4c 49 54 45 5f  flags =  SQLITE_
2a760 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
2a770 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  | SQLITE_OPEN_RE
2a780 41 44 57 52 49 54 45 20 0a 20 20 20 20 20 20 7c  ADWRITE .      |
2a790 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
2a7a0 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ATE | SQLITE_OPE
2a7b0 4e 5f 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20  N_EXCLUSIVE .   
2a7c0 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e     | SQLITE_OPEN
2a7d0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a  _DELETEONCLOSE;.
2a7e0 20 20 20 20 69 6e 74 20 6e 53 74 6d 74 53 70 69      int nStmtSpi
2a7f0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 43 6f 6e 66  ll = sqlite3Conf
2a800 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b 0a 20  ig.nStmtSpill;. 
2a810 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
2a820 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
2a830 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
2a840 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e  MORY || pPager->
2a850 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a  subjInMemory ){.
2a860 20 20 20 20 20 20 6e 53 74 6d 74 53 70 69 6c 6c        nStmtSpill
2a870 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
2a880 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75   rc = sqlite3Jou
2a890 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
2a8a0 3e 70 56 66 73 2c 20 30 2c 20 70 50 61 67 65 72  >pVfs, 0, pPager
2a8b0 2d 3e 73 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6e  ->sjfd, flags, n
2a8c0 53 74 6d 74 53 70 69 6c 6c 29 3b 0a 20 20 7d 0a  StmtSpill);.  }.
2a8d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2a8e0 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72  /*.** Append a r
2a8f0 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72  ecord of the cur
2a900 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61  rent state of pa
2a910 67 65 20 70 50 67 20 74 6f 20 74 68 65 20 73 75  ge pPg to the su
2a920 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 0a 2a  b-journal. .**.*
2a930 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
2a940 20 73 65 74 20 74 68 65 20 62 69 74 20 63 6f 72   set the bit cor
2a950 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50  responding to pP
2a960 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62  g->pgno in the b
2a970 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c  itvecs.** for al
2a980 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  l open savepoint
2a990 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  s before returni
2a9a0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ng..**.** This f
2a9b0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
2a9c0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
2a9d0 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
2a9e0 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20  ssful, an IO.** 
2a9f0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68  error code if th
2aa00 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  e attempt to wri
2aa10 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  te to the sub-jo
2aa20 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20  urnal fails, or 
2aa30 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
2aa40 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
2aa50 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67  ls while setting
2aa60 20 61 20 62 69 74 20 69 6e 20 61 20 73 61 76 65   a bit in a save
2aa70 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e  point.** bitvec.
2aa80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
2aa90 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67  ubjournalPage(Pg
2aaa0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74  Hdr *pPg){.  int
2aab0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2aac0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2aad0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
2aae0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
2aaf0 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
2ab00 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
2ab10 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e   ){..    /* Open
2ab20 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2ab30 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20  , if it has not 
2ab40 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65  already been ope
2ab50 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ned */.    asser
2ab60 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
2ab70 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73  urnal );.    ass
2ab80 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2ab90 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65  er->jfd) || page
2aba0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2abb0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
2abc0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
2abd0 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  fd) || pPager->n
2abe0 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20  SubRec==0 );.   
2abf0 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
2ac00 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a 20 20  eWal(pPager) .  
2ac10 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65 49 6e         || pageIn
2ac20 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
2ac30 70 50 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c  pPg) .         |
2ac40 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  | pPg->pgno>pPag
2ac50 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a  er->dbOrigSize .
2ac60 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20      );.    rc = 
2ac70 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70  openSubJournal(p
2ac80 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  Pager);..    /* 
2ac90 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  If the sub-journ
2aca0 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75  al was opened su
2acb0 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77  ccessfully (or w
2acc0 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29  as already open)
2acd0 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74  ,.    ** write t
2ace0 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
2acf0 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  d into the file.
2ad00 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
2ad10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ad20 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20      void *pData 
2ad30 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20  = pPg->pData;.  
2ad40 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
2ad50 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e 6e 53   (i64)pPager->nS
2ad60 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
2ad70 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
2ad80 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
2ad90 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28    .      CODEC2(
2ada0 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
2adb0 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74  Pg->pgno, 7, ret
2adc0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2add0 5f 42 4b 50 54 2c 20 70 44 61 74 61 32 29 3b 0a  _BKPT, pData2);.
2ade0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
2adf0 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  (("STMT-JOURNAL 
2ae00 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
2ae10 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
2ae20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
2ae30 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
2ae40 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  its(pPager->sjfd
2ae50 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70  , offset, pPg->p
2ae60 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
2ae70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2ae80 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2ae90 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
2aea0 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61  ger->sjfd, pData
2aeb0 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
2aec0 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a  ize, offset+4);.
2aed0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2aee0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
2aef0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
2af00 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a  ger->nSubRec++;.
2af10 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2af20 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30  er->nSavepoint>0
2af30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64 64   );.    rc = add
2af40 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
2af50 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  cs(pPager, pPg->
2af60 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
2af70 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
2af80 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50   int subjournalP
2af90 61 67 65 49 66 52 65 71 75 69 72 65 64 28 50 67  ageIfRequired(Pg
2afa0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
2afb0 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
2afc0 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 72 65  e(pPg) ){.    re
2afd0 74 75 72 6e 20 73 75 62 6a 6f 75 72 6e 61 6c 50  turn subjournalP
2afe0 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73  age(pPg);.  }els
2aff0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
2b000 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
2b010 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2b020 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
2b030 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79 65   the pcache laye
2b040 72 20 77 68 65 6e 20 69 74 20 68 61 73 20 72 65  r when it has re
2b050 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f  ached some.** so
2b060 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e  ft memory limit.
2b070 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
2b080 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
2b090 20 74 6f 20 61 20 50 61 67 65 72 20 6f 62 6a 65   to a Pager obje
2b0a0 63 74 0a 2a 2a 20 28 63 61 73 74 20 61 73 20 61  ct.** (cast as a
2b0b0 20 76 6f 69 64 2a 29 2e 20 54 68 65 20 70 61 67   void*). The pag
2b0c0 65 72 20 69 73 20 61 6c 77 61 79 73 20 27 70 75  er is always 'pu
2b0d0 72 67 65 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e  rgeable' (not an
2b0e0 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61   in-memory.** da
2b0f0 74 61 62 61 73 65 29 2e 20 54 68 65 20 73 65 63  tabase). The sec
2b100 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
2b110 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
2b120 20 70 61 67 65 20 74 68 61 74 20 69 73 20 0a 2a   page that is .*
2b130 2a 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74  * currently dirt
2b140 79 20 62 75 74 20 68 61 73 20 6e 6f 20 6f 75 74  y but has no out
2b150 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
2b160 63 65 73 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a  ces. The page.**
2b170 20 69 73 20 61 6c 77 61 79 73 20 61 73 73 6f 63   is always assoc
2b180 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 50  iated with the P
2b190 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73  ager object pass
2b1a0 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
2b1b0 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  .** argument..**
2b1c0 0a 2a 2a 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  .** The job of t
2b1d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2b1e0 74 6f 20 6d 61 6b 65 20 70 50 67 20 63 6c 65 61  to make pPg clea
2b1f0 6e 20 62 79 20 77 72 69 74 69 6e 67 20 69 74 73  n by writing its
2b200 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74   contents.** out
2b210 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2b220 20 66 69 6c 65 2c 20 69 66 20 70 6f 73 73 69 62   file, if possib
2b230 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 69 6e 76  le. This may inv
2b240 6f 6c 76 65 20 73 79 6e 63 69 6e 67 20 74 68 65  olve syncing the
2b250 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
2b260 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  . .**.** If succ
2b270 65 73 73 66 75 6c 2c 20 73 71 6c 69 74 65 33 50  essful, sqlite3P
2b280 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29  cacheMakeClean()
2b290 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
2b2a0 65 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51  e page and.** SQ
2b2b0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
2b2c0 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
2b2d0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
2b2e0 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20 74 68 65  ying to make the
2b2f0 0a 2a 2a 20 70 61 67 65 20 63 6c 65 61 6e 2c 20  .** page clean, 
2b300 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
2b310 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  e is returned. I
2b320 66 20 74 68 65 20 70 61 67 65 20 63 61 6e 6e 6f  f the page canno
2b330 74 20 62 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65  t be.** made cle
2b340 61 6e 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  an for some othe
2b350 72 20 72 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f  r reason, but no
2b360 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
2b370 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  hen SQLITE_OK.**
2b380 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20   is returned by 
2b390 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
2b3a0 65 43 6c 65 61 6e 28 29 20 69 73 20 6e 6f 74 20  eClean() is not 
2b3b0 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
2b3c0 63 20 69 6e 74 20 70 61 67 65 72 53 74 72 65 73  c int pagerStres
2b3d0 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64 72  s(void *p, PgHdr
2b3e0 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
2b3f0 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72  *pPager = (Pager
2b400 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d   *)p;.  int rc =
2b410 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
2b420 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
2b430 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
2b440 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
2b450 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
2b460 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f  ;..  /* The doNo
2b470 74 53 70 69 6c 6c 20 4e 4f 53 59 4e 43 20 62 69  tSpill NOSYNC bi
2b480 74 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 20  t is set during 
2b490 74 69 6d 65 73 20 77 68 65 6e 20 64 6f 69 6e 67  times when doing
2b4a0 20 61 20 73 79 6e 63 20 6f 66 0a 20 20 2a 2a 20   a sync of.  ** 
2b4b0 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 64 64  journal (and add
2b4c0 69 6e 67 20 61 20 6e 65 77 20 68 65 61 64 65 72  ing a new header
2b4d0 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  ) is not allowed
2b4e0 2e 20 20 54 68 69 73 20 6f 63 63 75 72 73 0a 20  .  This occurs. 
2b4f0 20 2a 2a 20 64 75 72 69 6e 67 20 63 61 6c 6c 73   ** during calls
2b500 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
2b510 57 72 69 74 65 28 29 20 77 68 69 6c 65 20 74 72  Write() while tr
2b520 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  ying to journal 
2b530 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a 20 70 61  multiple.  ** pa
2b540 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  ges belonging to
2b550 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f 72   the same sector
2b560 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
2b570 64 6f 4e 6f 74 53 70 69 6c 6c 20 52 4f 4c 4c 42  doNotSpill ROLLB
2b580 41 43 4b 20 61 6e 64 20 4f 46 46 20 62 69 74 73  ACK and OFF bits
2b590 20 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63 61   inhibits all ca
2b5a0 63 68 65 20 73 70 69 6c 6c 69 6e 67 0a 20 20 2a  che spilling.  *
2b5b0 2a 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * regardless of 
2b5c0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  whether or not a
2b5d0 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65   sync is require
2b5e0 64 2e 20 20 54 68 69 73 20 69 73 20 73 65 74 20  d.  This is set 
2b5f0 64 75 72 69 6e 67 0a 20 20 2a 2a 20 61 20 72 6f  during.  ** a ro
2b600 6c 6c 62 61 63 6b 20 6f 72 20 62 79 20 75 73 65  llback or by use
2b610 72 20 72 65 71 75 65 73 74 2c 20 72 65 73 70 65  r request, respe
2b620 63 74 69 76 65 6c 79 2e 0a 20 20 2a 2a 0a 20 20  ctively..  **.  
2b630 2a 2a 20 53 70 69 6c 6c 69 6e 67 20 69 73 20 61  ** Spilling is a
2b640 6c 73 6f 20 70 72 6f 68 69 62 69 74 65 64 20 77  lso prohibited w
2b650 68 65 6e 20 69 6e 20 61 6e 20 65 72 72 6f 72 20  hen in an error 
2b660 73 74 61 74 65 20 73 69 6e 63 65 20 74 68 61 74  state since that
2b670 20 63 6f 75 6c 64 0a 20 20 2a 2a 20 6c 65 61 64   could.  ** lead
2b680 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
2b690 72 75 70 74 69 6f 6e 2e 20 20 20 49 6e 20 74 68  ruption.   In th
2b6a0 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
2b6b0 65 6e 74 61 74 69 6f 6e 20 69 74 20 0a 20 20 2a  entation it .  *
2b6c0 2a 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20  * is impossible 
2b6d0 66 6f 72 20 73 71 6c 69 74 65 33 50 63 61 63 68  for sqlite3Pcach
2b6e0 65 46 65 74 63 68 28 29 20 74 6f 20 62 65 20 63  eFetch() to be c
2b6f0 61 6c 6c 65 64 20 77 69 74 68 20 63 72 65 61 74  alled with creat
2b700 65 46 6c 61 67 3d 3d 33 0a 20 20 2a 2a 20 77 68  eFlag==3.  ** wh
2b710 69 6c 65 20 69 6e 20 74 68 65 20 65 72 72 6f 72  ile in the error
2b720 20 73 74 61 74 65 2c 20 68 65 6e 63 65 20 69 74   state, hence it
2b730 20 69 73 20 69 6d 70 6f 73 73 69 62 6c 65 20 66   is impossible f
2b740 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  or this routine 
2b750 74 6f 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65  to.  ** be calle
2b760 64 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  d in the error s
2b770 74 61 74 65 2e 20 20 4e 65 76 65 72 74 68 65 6c  tate.  Neverthel
2b780 65 73 73 2c 20 77 65 20 69 6e 63 6c 75 64 65 20  ess, we include 
2b790 61 20 4e 45 56 45 52 28 29 0a 20 20 2a 2a 20 74  a NEVER().  ** t
2b7a0 65 73 74 20 66 6f 72 20 74 68 65 20 65 72 72 6f  est for the erro
2b7b0 72 20 73 74 61 74 65 20 61 73 20 61 20 73 61 66  r state as a saf
2b7c0 65 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 66  eguard against f
2b7d0 75 74 75 72 65 20 63 68 61 6e 67 65 73 2e 0a 20  uture changes.. 
2b7e0 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28   */.  if( NEVER(
2b7f0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29  pPager->errCode)
2b800 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2b810 5f 4f 4b 3b 0a 20 20 74 65 73 74 63 61 73 65 28  _OK;.  testcase(
2b820 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
2b830 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f  ill & SPILLFLAG_
2b840 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 74 65  ROLLBACK );.  te
2b850 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e  stcase( pPager->
2b860 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49  doNotSpill & SPI
2b870 4c 4c 46 4c 41 47 5f 4f 46 46 20 29 3b 0a 20 20  LLFLAG_OFF );.  
2b880 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72  testcase( pPager
2b890 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53  ->doNotSpill & S
2b8a0 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53 59 4e 43 20  PILLFLAG_NOSYNC 
2b8b0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
2b8c0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 0a 20 20 20 26  >doNotSpill.   &
2b8d0 26 20 28 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  & ((pPager->doNo
2b8e0 74 53 70 69 6c 6c 20 26 20 28 53 50 49 4c 4c 46  tSpill & (SPILLF
2b8f0 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 7c 53 50 49  LAG_ROLLBACK|SPI
2b900 4c 4c 46 4c 41 47 5f 4f 46 46 29 29 21 3d 30 0a  LLFLAG_OFF))!=0.
2b910 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e 66        || (pPg->f
2b920 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45  lags & PGHDR_NEE
2b930 44 5f 53 59 4e 43 29 21 3d 30 29 0a 20 20 29 7b  D_SYNC)!=0).  ){
2b940 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2b950 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50  TE_OK;.  }..  pP
2b960 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  g->pDirty = 0;. 
2b970 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
2b980 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
2b990 2f 2a 20 57 72 69 74 65 20 61 20 73 69 6e 67 6c  /* Write a singl
2b9a0 65 20 66 72 61 6d 65 20 66 6f 72 20 74 68 69 73  e frame for this
2b9b0 20 70 61 67 65 20 74 6f 20 74 68 65 20 6c 6f 67   page to the log
2b9c0 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 75  . */.    rc = su
2b9d0 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66 52 65  bjournalPageIfRe
2b9e0 71 75 69 72 65 64 28 70 50 67 29 3b 20 0a 20 20  quired(pPg); .  
2b9f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ba00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
2ba10 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73  = pagerWalFrames
2ba20 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20 30 2c  (pPager, pPg, 0,
2ba30 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   0);.    }.  }el
2ba40 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 53 79  se{.  .    /* Sy
2ba50 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
2ba60 69 6c 65 20 69 66 20 72 65 71 75 69 72 65 64 2e  ile if required.
2ba70 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 2d   */.    if( pPg-
2ba80 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
2ba90 44 5f 53 59 4e 43 20 0a 20 20 20 20 20 7c 7c 20  D_SYNC .     || 
2baa0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
2bab0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
2bac0 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a 20 20 20  HEMOD.    ){.   
2bad0 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72     rc = syncJour
2bae0 6e 61 6c 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  nal(pPager, 1);.
2baf0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
2bb00 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  Write the conten
2bb10 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f  ts of the page o
2bb20 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
2bb30 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
2bb40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2bb50 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
2bb60 74 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  t( (pPg->flags&P
2bb70 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d  GHDR_NEED_SYNC)=
2bb80 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
2bb90 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
2bba0 65 6c 69 73 74 28 70 50 61 67 65 72 2c 20 70 50  elist(pPager, pP
2bbb0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  g);.    }.  }.. 
2bbc0 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67   /* Mark the pag
2bbd0 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20  e as clean. */. 
2bbe0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2bbf0 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54  OK ){.    PAGERT
2bc00 52 41 43 45 28 28 22 53 54 52 45 53 53 20 25 64  RACE(("STRESS %d
2bc10 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
2bc20 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
2bc30 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73  g->pgno));.    s
2bc40 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
2bc50 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a  Clean(pPg);.  }.
2bc60 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
2bc70 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
2bc80 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75  ); .}../*.** Flu
2bc90 73 68 20 61 6c 6c 20 75 6e 72 65 66 65 72 65 6e  sh all unreferen
2bca0 63 65 64 20 64 69 72 74 79 20 70 61 67 65 73 20  ced dirty pages 
2bcb0 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20  to disk..*/.int 
2bcc0 73 71 6c 69 74 65 33 50 61 67 65 72 46 6c 75 73  sqlite3PagerFlus
2bcd0 68 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  h(Pager *pPager)
2bce0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61  {.  int rc = pPa
2bcf0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
2bd00 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
2bd10 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 20 3d    PgHdr *pList =
2bd20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69   sqlite3PcacheDi
2bd30 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e  rtyList(pPager->
2bd40 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 61 73  pPCache);.    as
2bd50 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
2bd60 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
2bd70 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72   );.    while( r
2bd80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2bd90 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 50  pList ){.      P
2bda0 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c  gHdr *pNext = pL
2bdb0 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  ist->pDirty;.   
2bdc0 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 52     if( pList->nR
2bdd0 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ef==0 ){.       
2bde0 20 72 63 20 3d 20 70 61 67 65 72 53 74 72 65 73   rc = pagerStres
2bdf0 73 28 28 76 6f 69 64 2a 29 70 50 61 67 65 72 2c  s((void*)pPager,
2be00 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d   pList);.      }
2be10 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70  .      pList = p
2be20 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
2be30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2be40 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
2be50 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61  and initialize a
2be60 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65 63   new Pager objec
2be70 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e  t and put a poin
2be80 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20  ter to it.** in 
2be90 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20 70 61  *ppPager. The pa
2bea0 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e 74  ger should event
2beb0 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20 62  ually be freed b
2bec0 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20  y passing it.** 
2bed0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
2bee0 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  lose()..**.** Th
2bef0 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75  e zFilename argu
2bf00 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61 74 68  ment is the path
2bf10 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2bf20 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a   file to open..*
2bf30 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
2bf40 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61  s NULL then a ra
2bf50 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d  ndomly-named tem
2bf60 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63  porary file is c
2bf70 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73  reated.** and us
2bf80 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74  ed as the file t
2bf90 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54 65 6d  o be cached. Tem
2bfa0 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72 65  porary files are
2bfb0 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61   be deleted.** a
2bfc0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65  utomatically whe
2bfd0 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65  n they are close
2bfe0 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  d. If zFilename 
2bff0 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
2c000 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72  en .** all infor
2c010 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69  mation is held i
2c020 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73 20 6e  n cache. It is n
2c030 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20  ever written to 
2c040 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63  disk. .** This c
2c050 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d  an be used to im
2c060 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65  plement an in-me
2c070 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
2c080 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 20  *.** The nExtra 
2c090 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69 66  parameter specif
2c0a0 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ies the number o
2c0b0 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
2c0c0 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c   allocated.** al
2c0d0 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20 70 61  ong with each pa
2c0e0 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68  ge reference. Th
2c0f0 69 73 20 73 70 61 63 65 20 69 73 20 61 76 61 69  is space is avai
2c100 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65  lable to the use
2c110 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71 6c  r.** via the sql
2c120 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
2c130 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20 54  a() API..**.** T
2c140 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  he flags argumen
2c150 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 70 65  t is used to spe
2c160 63 69 66 79 20 70 72 6f 70 65 72 74 69 65 73 20  cify properties 
2c170 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65 0a  that affect the.
2c180 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ** operation of 
2c190 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 73 68  the pager. It sh
2c1a0 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 73  ould be passed s
2c1b0 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d 62  ome bitwise comb
2c1c0 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68  ination.** of th
2c1d0 65 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 2e  e PAGER_* flags.
2c1e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c  .**.** The vfsFl
2c1f0 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 69 73  ags parameter is
2c200 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20 70 61   a bitmask to pa
2c210 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67 73 20  ss to the flags 
2c220 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20  parameter.** of 
2c230 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65 74 68  the xOpen() meth
2c240 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  od of the suppli
2c250 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70 65 6e  ed VFS when open
2c260 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a  ing files. .**.*
2c270 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 6f  * If the pager o
2c280 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74  bject is allocat
2c290 65 64 20 61 6e 64 20 74 68 65 20 73 70 65 63 69  ed and the speci
2c2a0 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e 65 64  fied file opened
2c2b0 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c   .** successfull
2c2c0 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  y, SQLITE_OK is 
2c2d0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
2c2e0 50 61 67 65 72 20 73 65 74 20 74 6f 20 70 6f 69  Pager set to poi
2c2f0 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77  nt to.** the new
2c300 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49   pager object. I
2c310 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2c320 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73 20 73  s, *ppPager is s
2c330 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e  et to NULL.** an
2c340 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65 74  d error code ret
2c350 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75 6e 63  urned. This func
2c360 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20  tion may return 
2c370 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20  SQLITE_NOMEM.** 
2c380 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29  (sqlite3Malloc()
2c390 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f   is used to allo
2c3a0 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51  cate memory), SQ
2c3b0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72  LITE_CANTOPEN or
2c3c0 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53 51 4c   .** various SQL
2c3d0 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72  ITE_IO_XXX error
2c3e0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
2c3f0 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71  3PagerOpen(.  sq
2c400 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2c410 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
2c420 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65  rtual file syste
2c430 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61  m to use */.  Pa
2c440 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20  ger **ppPager,  
2c450 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
2c460 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20  eturn the Pager 
2c470 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
2c480 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2c490 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20  zFilename,   /* 
2c4a0 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
2c4b0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
2c4c0 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  n */.  int nExtr
2c4d0 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
2c4e0 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61  /* Extra bytes a
2c4f0 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e  ppend to each in
2c500 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
2c510 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
2c520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
2c530 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20  ags controlling 
2c540 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69  this file */.  i
2c550 6e 74 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20  nt vfsFlags,    
2c560 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
2c570 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
2c580 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78  to sqlite3_vfs.x
2c590 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64  Open() */.  void
2c5a0 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61   (*xReinit)(DbPa
2c5b0 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e  ge*) /* Function
2c5c0 20 74 6f 20 72 65 69 6e 69 74 69 61 6c 69 7a 65   to reinitialize
2c5d0 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75   pages */.){.  u
2c5e0 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72  8 *pPtr;.  Pager
2c5f0 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20 20 20   *pPager = 0;   
2c600 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
2c610 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ect to allocate 
2c620 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20  and return */.  
2c630 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2c640 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  OK;      /* Retu
2c650 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
2c660 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20   tempFile = 0;  
2c670 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
2c680 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28 69 6e  r temp files (in
2c690 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69  cl. in-memory fi
2c6a0 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65  les) */.  int me
2c6b0 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  mDb = 0;        
2c6c0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2c6d0 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
2c6e0 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ry file */.  int
2c6f0 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20 20   readOnly = 0;  
2c700 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2c710 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 2d   this is a read-
2c720 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69  only file */.  i
2c730 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  nt journalFileSi
2c740 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65 73  ze;     /* Bytes
2c750 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72   to allocate for
2c760 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 64   each journal fd
2c770 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 74   */.  char *zPat
2c780 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f  hname = 0;     /
2c790 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20 64  * Full path to d
2c7a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2c7b0 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20    int nPathname 
2c7c0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75  = 0;       /* Nu
2c7d0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
2c7e0 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20   zPathname */.  
2c7f0 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  int useJournal =
2c800 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
2c810 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30  OMIT_JOURNAL)==0
2c820 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f 6d  ; /* False to om
2c830 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  it journal */.  
2c840 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20 3d  int pcacheSize =
2c850 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 69   sqlite3PcacheSi
2c860 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 42  ze();       /* B
2c870 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ytes to allocate
2c880 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a 20   for PCache */. 
2c890 20 75 33 32 20 73 7a 50 61 67 65 44 66 6c 74 20   u32 szPageDflt 
2c8a0 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
2c8b0 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a 20  _PAGE_SIZE;  /* 
2c8c0 44 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  Default page siz
2c8d0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
2c8e0 72 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20 20  r *zUri = 0;    
2c8f0 2f 2a 20 55 52 49 20 61 72 67 73 20 74 6f 20 63  /* URI args to c
2c900 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 72  opy */.  int nUr
2c910 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  i = 0;          
2c920 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2c930 79 74 65 73 20 6f 66 20 55 52 49 20 61 72 67 73  ytes of URI args
2c940 20 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20 20   at *zUri */..  
2c950 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
2c960 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20  w much space is 
2c970 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63  required for eac
2c980 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68  h journal file-h
2c990 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72  andle.  ** (ther
2c9a0 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65  e are two of the
2c9b0 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  m, the main jour
2c9c0 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d  nal and the sub-
2c9d0 6a 6f 75 72 6e 61 6c 29 2e 20 20 2a 2f 0a 20 20  journal).  */.  
2c9e0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2c9f0 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
2ca00 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
2ca10 29 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  ));..  /* Set th
2ca20 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
2ca30 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73  e to NULL in cas
2ca40 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  e an error occur
2ca50 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72  s. */.  *ppPager
2ca60 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53   = 0;..#ifndef S
2ca70 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
2ca80 59 44 42 0a 20 20 69 66 28 20 66 6c 61 67 73 20  YDB.  if( flags 
2ca90 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20 29  & PAGER_MEMORY )
2caa0 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b  {.    memDb = 1;
2cab0 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  .    if( zFilena
2cac0 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
2cad0 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 50 61 74  0] ){.      zPat
2cae0 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  hname = sqlite3D
2caf0 62 53 74 72 44 75 70 28 30 2c 20 7a 46 69 6c 65  bStrDup(0, zFile
2cb00 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  name);.      if(
2cb10 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 20 29   zPathname==0  )
2cb20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2cb30 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
2cb40 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   nPathname = sql
2cb50 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
2cb60 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a  thname);.      z
2cb70 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
2cb80 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
2cb90 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64    /* Compute and
2cba0 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20   store the full 
2cbb0 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61  pathname in an a
2cbc0 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20  llocated buffer 
2cbd0 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20  pointed.  ** to 
2cbe0 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65  by zPathname, le
2cbf0 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20  ngth nPathname. 
2cc00 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61  Or, if this is a
2cc10 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c   temporary file,
2cc20 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68  .  ** leave both
2cc30 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a   nPathname and z
2cc40 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20  Pathname set to 
2cc50 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  0..  */.  if( zF
2cc60 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
2cc70 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 63  name[0] ){.    c
2cc80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
2cc90 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56    nPathname = pV
2cca0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
2ccb0 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20  ;.    zPathname 
2ccc0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
2ccd0 63 52 61 77 28 30 2c 20 6e 50 61 74 68 6e 61 6d  cRaw(0, nPathnam
2cce0 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50  e*2);.    if( zP
2ccf0 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  athname==0 ){.  
2cd00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2cd10 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
2cd20 20 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d    }.    zPathnam
2cd30 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61 6b  e[0] = 0; /* Mak
2cd40 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69 7a  e sure initializ
2cd50 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c 50  ed even if FullP
2cd60 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73 20  athname() fails 
2cd70 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2cd80 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
2cd90 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  e(pVfs, zFilenam
2cda0 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50  e, nPathname, zP
2cdb0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e 50  athname);.    nP
2cdc0 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
2cdd0 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e  3Strlen30(zPathn
2cde0 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a 55  ame);.    z = zU
2cdf0 72 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65 5b  ri = &zFilename[
2ce00 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2ce10 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a 20  zFilename)+1];. 
2ce20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a     while( *z ){.
2ce30 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69 74        z += sqlit
2ce40 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31 3b  e3Strlen30(z)+1;
2ce50 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69  .      z += sqli
2ce60 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31  te3Strlen30(z)+1
2ce70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 72 69  ;.    }.    nUri
2ce80 20 3d 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20 2d   = (int)(&z[1] -
2ce90 20 7a 55 72 69 29 3b 0a 20 20 20 20 61 73 73 65   zUri);.    asse
2cea0 72 74 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a 20  rt( nUri>=0 );. 
2ceb0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2cec0 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61 6d  E_OK && nPathnam
2ced0 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  e+8>pVfs->mxPath
2cee0 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  name ){.      /*
2cef0 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
2cf00 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20 6a  taken when the j
2cf10 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71 75  ournal path requ
2cf20 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a  ired by.      **
2cf30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
2cf40 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c 20  ing opened will 
2cf50 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56 66  be more than pVf
2cf60 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20 20  s->mxPathname.  
2cf70 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20      ** bytes in 
2cf80 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65 61  length. This mea
2cf90 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
2cfa0 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64  cannot be opened
2cfb0 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 74  ,.      ** as it
2cfc0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73   will not be pos
2cfd0 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68  sible to open th
2cfe0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
2cff0 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20  r even.      ** 
2d000 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74 2d  check for a hot-
2d010 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 72  journal before r
2d020 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f  eading..      */
2d030 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2d040 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
2d050 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2d060 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2d070 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
2d080 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d  Free(0, zPathnam
2d090 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
2d0a0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
2d0b0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
2d0c0 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61 67  mory for the Pag
2d0d0 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 50 43  er structure, PC
2d0e0 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65  ache object, the
2d0f0 0a 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65  .  ** three file
2d100 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68   descriptors, th
2d110 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2d120 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75  name and the jou
2d130 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
2d140 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74  name. The layout
2d150 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73   in memory is as
2d160 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
2d170 20 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62   **     Pager ob
2d180 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20  ject            
2d190 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28          (sizeof(
2d1a0 50 61 67 65 72 29 20 62 79 74 65 73 29 0a 20 20  Pager) bytes).  
2d1b0 2a 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f 62  **     PCache ob
2d1c0 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20  ject            
2d1d0 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 50         (sqlite3P
2d1e0 63 61 63 68 65 53 69 7a 65 28 29 20 62 79 74 65  cacheSize() byte
2d1f0 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61  s).  **     Data
2d200 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65  base file handle
2d210 20 20 20 20 20 20 20 20 20 20 20 20 28 70 56 66              (pVf
2d220 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65  s->szOsFile byte
2d230 73 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d  s).  **     Sub-
2d240 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
2d250 64 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75  dle         (jou
2d260 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74  rnalFileSize byt
2d270 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69  es).  **     Mai
2d280 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  n journal file h
2d290 61 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f  andle        (jo
2d2a0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79  urnalFileSize by
2d2b0 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61  tes).  **     Da
2d2c0 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
2d2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
2d2e0 50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73  Pathname+1 bytes
2d2f0 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ).  **     Journ
2d300 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20  al file name    
2d310 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74             (nPat
2d320 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29  hname+8+1 bytes)
2d330 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28  .  */.  pPtr = (
2d340 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  u8 *)sqlite3Mall
2d350 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55 4e  ocZero(.    ROUN
2d360 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  D8(sizeof(*pPage
2d370 72 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50 61  r)) +      /* Pa
2d380 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ger structure */
2d390 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61 63  .    ROUND8(pcac
2d3a0 68 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20 20  heSize) +       
2d3b0 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f 62      /* PCache ob
2d3c0 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55 4e  ject */.    ROUN
2d3d0 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  D8(pVfs->szOsFil
2d3e0 65 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68  e) +       /* Th
2d3f0 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a  e main db file *
2d400 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  /.    journalFil
2d410 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20  eSize * 2 +     
2d420 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20       /* The two 
2d430 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
2d440 20 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20   .    nPathname 
2d450 2b 20 31 20 2b 20 6e 55 72 69 20 2b 20 20 20 20  + 1 + nUri +    
2d460 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
2d470 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e 61  e */.    nPathna
2d480 6d 65 20 2b 20 38 20 2b 20 32 20 20 20 20 20 20  me + 8 + 2      
2d490 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72          /* zJour
2d4a0 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  nal */.#ifndef S
2d4b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
2d4c0 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20 2b     + nPathname +
2d4d0 20 34 20 2b 20 32 20 20 20 20 20 20 20 20 20 20   4 + 2          
2d4e0 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65 6e    /* zWal */.#en
2d4f0 64 69 66 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  dif.  );.  asser
2d500 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
2d510 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49  IGNMENT(SQLITE_I
2d520 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61  NT_TO_PTR(journa
2d530 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20  lFileSize)) );. 
2d540 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20   if( !pPtr ){.  
2d550 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2d560 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  0, zPathname);. 
2d570 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2d580 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
2d590 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20 20 20  .  pPager =     
2d5a0 20 20 20 20 20 20 20 20 20 28 50 61 67 65 72 2a           (Pager*
2d5b0 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65  )(pPtr);.  pPage
2d5c0 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20  r->pPCache =    
2d5d0 28 50 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b  (PCache*)(pPtr +
2d5e0 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
2d5f0 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50  *pPager)));.  pP
2d600 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71  ager->fd =   (sq
2d610 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
2d620 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63  r += ROUND8(pcac
2d630 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67  heSize));.  pPag
2d640 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69  er->sjfd = (sqli
2d650 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20  te3_file*)(pPtr 
2d660 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e  += ROUND8(pVfs->
2d670 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50  szOsFile));.  pP
2d680 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71  ager->jfd =  (sq
2d690 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
2d6a0 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  r += journalFile
2d6b0 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  Size);.  pPager-
2d6c0 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20  >zFilename =    
2d6d0 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20  (char*)(pPtr += 
2d6e0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
2d6f0 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
2d700 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
2d710 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
2d720 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
2d730 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61  he Pager.zFilena
2d740 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f  me and Pager.zJo
2d750 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69  urnal buffers, i
2d760 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  f required. */. 
2d770 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29   if( zPathname )
2d780 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 50  {.    assert( nP
2d790 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20 20  athname>0 );.   
2d7a0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2d7b0 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50  l =   (char*)(pP
2d7c0 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20  tr += nPathname 
2d7d0 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20 20 20  + 1 + nUri);.   
2d7e0 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
2d7f0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68  zFilename, zPath
2d800 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
2d810 3b 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20 29  ;.    if( nUri )
2d820 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2d830 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68  >zFilename[nPath
2d840 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e  name+1], zUri, n
2d850 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Uri);.    memcpy
2d860 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
2d870 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  l, zPathname, nP
2d880 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
2d890 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a  mcpy(&pPager->zJ
2d8a0 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
2d8b0 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30 30  ], "-journal\000
2d8c0 22 2c 20 38 2b 32 29 3b 0a 20 20 20 20 73 71 6c  ", 8+2);.    sql
2d8d0 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
2d8e0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2d8f0 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  e, pPager->zJour
2d900 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  nal);.#ifndef SQ
2d910 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
2d920 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d    pPager->zWal =
2d930 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e   &pPager->zJourn
2d940 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31  al[nPathname+8+1
2d950 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  ];.    memcpy(pP
2d960 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74  ager->zWal, zPat
2d970 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2d980 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
2d990 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74  Pager->zWal[nPat
2d9a0 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30 30  hname], "-wal\00
2d9b0 30 22 2c 20 34 2b 31 29 3b 0a 20 20 20 20 73 71  0", 4+1);.    sq
2d9c0 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
2d9d0 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
2d9e0 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  me, pPager->zWal
2d9f0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
2da00 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a  lite3DbFree(0, z
2da10 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  Pathname);.  }. 
2da20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20   pPager->pVfs = 
2da30 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pVfs;.  pPager->
2da40 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c  vfsFlags = vfsFl
2da50 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  ags;..  /* Open 
2da60 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
2da70 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
2da80 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
2da90 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20  e[0] ){.    int 
2daa0 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20  fout = 0;       
2dab0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2dac0 56 46 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e  VFS flags return
2dad0 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f  ed by xOpen() */
2dae0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2daf0 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
2db00 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
2db10 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73   pPager->fd, vfs
2db20 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20  Flags, &fout);. 
2db30 20 20 20 61 73 73 65 72 74 28 20 21 6d 65 6d 44     assert( !memD
2db40 62 20 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c  b );.    readOnl
2db50 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45  y = (fout&SQLITE
2db60 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
2db70 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
2db80 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73 73  file was success
2db90 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72  fully opened for
2dba0 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
2dbb0 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73  ss,.    ** choos
2dbc0 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65  e a default page
2dbd0 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65   size in case we
2dbe0 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20   have to create 
2dbf0 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
2dc00 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65  ase file. The de
2dc10 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
2dc20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f  is the maximum o
2dc30 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  f:.    **.    **
2dc40 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46      + SQLITE_DEF
2dc50 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a  AULT_PAGE_SIZE,.
2dc60 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20      **    + The 
2dc70 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
2dc80 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  y sqlite3OsSecto
2dc90 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20  rSize().    **  
2dca0 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20    + The largest 
2dcb0 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20 63  page size that c
2dcc0 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  an be written at
2dcd0 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f  omically..    */
2dce0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2dcf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2dd00 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
2dd10 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
2dd20 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
2dd30 3e 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >fd);.      if( 
2dd40 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  !readOnly ){.   
2dd50 20 20 20 20 20 73 65 74 53 65 63 74 6f 72 53 69       setSectorSi
2dd60 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ze(pPager);.    
2dd70 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
2dd80 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
2dd90 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  IZE<=SQLITE_MAX_
2dda0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2ddb0 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  E);.        if( 
2ddc0 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65  szPageDflt<pPage
2ddd0 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b  r->sectorSize ){
2dde0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2ddf0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
2de00 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  e>SQLITE_MAX_DEF
2de10 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29  AULT_PAGE_SIZE )
2de20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a  {.            sz
2de30 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54  PageDflt = SQLIT
2de40 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2de50 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  GE_SIZE;.       
2de60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2de70 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
2de80 20 3d 20 28 75 33 32 29 70 50 61 67 65 72 2d 3e   = (u32)pPager->
2de90 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
2dea0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2deb0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
2dec0 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
2ded0 49 54 45 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  ITE.        {.  
2dee0 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a          int ii;.
2def0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2df00 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
2df10 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
2df20 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ));.          as
2df30 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
2df40 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35  P_ATOMIC64K==(65
2df50 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  536>>8));.      
2df60 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
2df70 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2df80 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b  GE_SIZE<=65536);
2df90 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
2dfa0 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20 69 69  i=szPageDflt; ii
2dfb0 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  <=SQLITE_MAX_DEF
2dfc0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20  AULT_PAGE_SIZE; 
2dfd0 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20 20 20  ii=ii*2){.      
2dfe0 20 20 20 20 20 20 69 66 28 20 69 44 63 26 28 53        if( iDc&(S
2dff0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
2e000 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20  IC|(ii>>8)) ){. 
2e010 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50               szP
2e020 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20  ageDflt = ii;.  
2e030 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e040 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e050 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  }.#endif.      }
2e060 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
2e070 6f 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33 5f  oLock = sqlite3_
2e080 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 46 69 6c  uri_boolean(zFil
2e090 65 6e 61 6d 65 2c 20 22 6e 6f 6c 6f 63 6b 22 2c  ename, "nolock",
2e0a0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28   0);.      if( (
2e0b0 69 44 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43  iDc & SQLITE_IOC
2e0c0 41 50 5f 49 4d 4d 55 54 41 42 4c 45 29 21 3d 30  AP_IMMUTABLE)!=0
2e0d0 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74  .       || sqlit
2e0e0 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a  e3_uri_boolean(z
2e0f0 46 69 6c 65 6e 61 6d 65 2c 20 22 69 6d 6d 75 74  Filename, "immut
2e100 61 62 6c 65 22 2c 20 30 29 20 29 7b 0a 20 20 20  able", 0) ){.   
2e110 20 20 20 20 20 20 20 76 66 73 46 6c 61 67 73 20         vfsFlags 
2e120 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  |= SQLITE_OPEN_R
2e130 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20  EADONLY;.       
2e140 20 20 20 67 6f 74 6f 20 61 63 74 5f 6c 69 6b 65     goto act_like
2e150 5f 74 65 6d 70 5f 66 69 6c 65 3b 0a 20 20 20 20  _temp_file;.    
2e160 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
2e170 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74  e{.    /* If a t
2e180 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
2e190 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69   requested, it i
2e1a0 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d  s not opened imm
2e1b0 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a  ediately..    **
2e1c0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65   In this case we
2e1d0 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66 61   accept the defa
2e1e0 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ult page size an
2e1f0 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79  d delay actually
2e200 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20  .    ** opening 
2e210 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74  the file until t
2e220 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
2e230 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20   OsWrite()..    
2e240 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  **.    ** This b
2e250 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75  ranch is also ru
2e260 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  n for an in-memo
2e270 72 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20  ry database. An 
2e280 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a  in-memory.    **
2e290 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65   database is the
2e2a0 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d   same as a temp-
2e2b0 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76  file that is nev
2e2c0 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  er written out t
2e2d0 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e  o.    ** disk an
2e2e0 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d  d uses an in-mem
2e2f0 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ory rollback jou
2e300 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  rnal..    **.   
2e310 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   ** This branch 
2e320 61 6c 73 6f 20 72 75 6e 73 20 66 6f 72 20 66 69  also runs for fi
2e330 6c 65 73 20 6d 61 72 6b 65 64 20 61 73 20 69 6d  les marked as im
2e340 6d 75 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 20  mutable..    */ 
2e350 0a 61 63 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66  .act_like_temp_f
2e360 69 6c 65 3a 0a 20 20 20 20 74 65 6d 70 46 69 6c  ile:.    tempFil
2e370 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e = 1;.    pPage
2e380 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
2e390 52 5f 52 45 41 44 45 52 3b 20 20 20 20 20 2f 2a  R_READER;     /*
2e3a0 20 50 72 65 74 65 6e 64 20 77 65 20 61 6c 72 65   Pretend we alre
2e3b0 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 20  ady have a lock 
2e3c0 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  */.    pPager->e
2e3d0 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53 49 56 45  Lock = EXCLUSIVE
2e3e0 5f 4c 4f 43 4b 3b 20 20 20 20 2f 2a 20 50 72 65  _LOCK;    /* Pre
2e3f0 74 65 6e 64 20 77 65 20 61 72 65 20 69 6e 20 45  tend we are in E
2e400 58 43 4c 55 53 49 56 45 20 6d 6f 64 65 20 2a 2f  XCLUSIVE mode */
2e410 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 4c  .    pPager->noL
2e420 6f 63 6b 20 3d 20 31 3b 20 20 20 20 20 20 20 20  ock = 1;        
2e430 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
2e440 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 20 20   locking */.    
2e450 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46  readOnly = (vfsF
2e460 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e  lags&SQLITE_OPEN
2e470 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a  _READONLY);.  }.
2e480 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
2e490 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65  ing call to Page
2e4a0 72 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 73  rSetPagesize() s
2e4b0 65 72 76 65 73 20 74 6f 20 73 65 74 20 74 68 65  erves to set the
2e4c0 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20   value of .  ** 
2e4d0 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61  Pager.pageSize a
2e4e0 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74  nd to allocate t
2e4f0 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  he Pager.pTmpSpa
2e500 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a  ce buffer..  */.
2e510 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2e520 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
2e530 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  t( pPager->memDb
2e540 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
2e550 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
2e560 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20  agesize(pPager, 
2e570 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29  &szPageDflt, -1)
2e580 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
2e590 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
2e5a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
2e5b0 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68 65  alize the PCache
2e5c0 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 69 66   object. */.  if
2e5d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2e5e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
2e5f0 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20  Extra<1000 );.  
2e600 20 20 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44    nExtra = ROUND
2e610 38 28 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 72  8(nExtra);.    r
2e620 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  c = sqlite3Pcach
2e630 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74  eOpen(szPageDflt
2e640 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62  , nExtra, !memDb
2e650 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2e660 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f           !memDb?
2e670 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28  pagerStress:0, (
2e680 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70  void *)pPager, p
2e690 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
2e6a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
2e6b0 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
2e6c0 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20  above, free the 
2e6d0 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
2e6e0 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66   and close the f
2e6f0 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
2e700 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2e710 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
2e720 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ose(pPager->fd);
2e730 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
2e740 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  Free(pPager->pTm
2e750 70 53 70 61 63 65 29 3b 0a 20 20 20 20 73 71 6c  pSpace);.    sql
2e760 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
2e770 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
2e780 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
2e790 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE(("OPEN %d %s
2e7a0 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
2e7b0 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70  D(pPager->fd), p
2e7c0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2e7d0 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
2e7e0 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70  OPEN %p %s\n", p
2e7f0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a  Pager, pPager->z
2e800 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50  Filename))..  pP
2e810 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
2e820 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61   = (u8)useJourna
2e830 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  l;.  /* pPager->
2e840 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  stmtOpen = 0; */
2e850 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2e860 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a  mtInUse = 0; */.
2e870 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65    /* pPager->nRe
2e880 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  f = 0; */.  /* p
2e890 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
2e8a0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2e8b0 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
2e8c0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2e8d0 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a  er->nPage = 0; *
2e8e0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  /.  pPager->mxPg
2e8f0 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  no = SQLITE_MAX_
2e900 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a  PAGE_COUNT;.  /*
2e910 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
2e920 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a   PAGER_UNLOCK; *
2e930 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65  /.  /* pPager->e
2e940 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20  rrMask = 0; */. 
2e950 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2e960 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65  e = (u8)tempFile
2e970 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70  ;.  assert( temp
2e980 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
2e990 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a  INGMODE_NORMAL .
2e9a0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d            || tem
2e9b0 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
2e9c0 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
2e9d0 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  VE );.  assert( 
2e9e0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2e9f0 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29  E_EXCLUSIVE==1 )
2ea00 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  ;.  pPager->excl
2ea10 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29  usiveMode = (u8)
2ea20 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61  tempFile; .  pPa
2ea30 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
2ea40 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
2ea50 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
2ea60 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d  r->memDb = (u8)m
2ea70 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
2ea80 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72  readOnly = (u8)r
2ea90 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72  eadOnly;.  asser
2eaa0 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c  t( useJournal ||
2eab0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2eac0 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  e );.  pPager->n
2ead0 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  oSync = pPager->
2eae0 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
2eaf0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 70  er->fullSync = p
2eb00 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 30  Pager->noSync ?0
2eb10 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79  :1;.  pPager->sy
2eb20 6e 63 46 6c 61 67 73 20 3d 20 70 50 61 67 65 72  ncFlags = pPager
2eb30 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 20 3a 20 53  ->noSync ? 0 : S
2eb40 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
2eb50 4c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 70  L;.  pPager->ckp
2eb60 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 70 50 61  tSyncFlags = pPa
2eb70 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a  ger->syncFlags;.
2eb80 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
2eb90 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65  Sync ){.    asse
2eba0 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  rt( pPager->full
2ebb0 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Sync==0 );.    a
2ebc0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
2ebd0 78 74 72 61 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  xtraSync==0 );. 
2ebe0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2ebf0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 30 20  r->syncFlags==0 
2ec00 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2ec10 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
2ec20 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ags==0 );.    as
2ec30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 63 6b  sert( pPager->ck
2ec40 70 74 53 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29  ptSyncFlags==0 )
2ec50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2ec60 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
2ec70 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
2ec80 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 30 3b 0a  >extraSync = 0;.
2ec90 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
2eca0 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  Flags = SQLITE_S
2ecb0 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  YNC_NORMAL;.    
2ecc0 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46  pPager->walSyncF
2ecd0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
2ece0 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 57 41 4c 5f  NC_NORMAL | WAL_
2ecf0 53 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e  SYNC_TRANSACTION
2ed00 53 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  S;.    pPager->c
2ed10 6b 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53  kptSyncFlags = S
2ed20 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
2ed30 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67  L;.  }.  /* pPag
2ed40 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20  er->pFirst = 0; 
2ed50 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2ed60 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
2ed70 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2ed80 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a  ->pLast = 0; */.
2ed90 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61    pPager->nExtra
2eda0 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a   = (u16)nExtra;.
2edb0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2edc0 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c  lSizeLimit = SQL
2edd0 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52  ITE_DEFAULT_JOUR
2ede0 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a  NAL_SIZE_LIMIT;.
2edf0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
2ee00 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
2ee10 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65  tempFile );.  se
2ee20 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
2ee30 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65 4a  er);.  if( !useJ
2ee40 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50  ournal ){.    pP
2ee50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2ee60 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
2ee70 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c  LMODE_OFF;.  }el
2ee80 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a  se if( memDb ){.
2ee90 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2eea0 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
2eeb0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
2eec0 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61  RY;.  }.  /* pPa
2eed0 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
2eee0 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  r = 0; */.  /* p
2eef0 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
2ef00 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20  lerArg = 0; */. 
2ef10 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
2ef20 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20  er = xReinit;.  
2ef30 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  /* memset(pPager
2ef40 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
2ef50 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
2ef60 29 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67  )); */.  /* pPag
2ef70 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 53 51 4c  er->szMmap = SQL
2ef80 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50  ITE_DEFAULT_MMAP
2ef90 5f 53 49 5a 45 20 2f 2f 20 77 69 6c 6c 20 62 65  _SIZE // will be
2efa0 20 73 65 74 20 62 79 20 62 74 72 65 65 2e 63 20   set by btree.c 
2efb0 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d  */..  *ppPager =
2efc0 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72   pPager;.  retur
2efd0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2efe0 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
2eff0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2f000 65 20 68 61 73 20 6e 6f 74 20 62 65 20 64 65 6c  e has not be del
2f010 65 74 65 64 20 6f 72 20 72 65 6e 61 6d 65 64 20  eted or renamed 
2f020 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64 65  out from.** unde
2f030 72 20 74 68 65 20 70 61 67 65 72 2e 20 20 52 65  r the pager.  Re
2f040 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
2f050 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
2f060 73 20 73 74 69 6c 6c 20 77 65 72 65 20 69 74 20  s still were it 
2f070 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 62 65 20 6f  ought.** to be o
2f080 6e 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20  n disk.  Return 
2f090 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c 49 54 45  non-zero (SQLITE
2f0a0 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45  _READONLY_DBMOVE
2f0b0 44 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  D or some other 
2f0c0 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 66 72  error.** code fr
2f0d0 6f 6d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  om sqlite3OsAcce
2f0e0 73 73 28 29 29 20 69 66 20 74 68 65 20 64 61 74  ss()) if the dat
2f0f0 61 62 61 73 65 20 68 61 73 20 67 6f 6e 65 20 6d  abase has gone m
2f100 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  issing..*/.stati
2f110 63 20 69 6e 74 20 64 61 74 61 62 61 73 65 49 73  c int databaseIs
2f120 55 6e 6d 6f 76 65 64 28 50 61 67 65 72 20 2a 70  Unmoved(Pager *p
2f130 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 62 48  Pager){.  int bH
2f140 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 69  asMoved = 0;.  i
2f150 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50  nt rc;..  if( pP
2f160 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
2f170 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2f180 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
2f190 3e 64 62 53 69 7a 65 3d 3d 30 20 29 20 72 65 74  >dbSize==0 ) ret
2f1a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2f1b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2f1c0 3e 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 70 50  >zFilename && pP
2f1d0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b  ager->zFilename[
2f1e0 30 5d 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  0] );.  rc = sql
2f1f0 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
2f200 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  l(pPager->fd, SQ
2f210 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d  LITE_FCNTL_HAS_M
2f220 4f 56 45 44 2c 20 26 62 48 61 73 4d 6f 76 65 64  OVED, &bHasMoved
2f230 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2f240 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a  ITE_NOTFOUND ){.
2f250 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 48 41      /* If the HA
2f260 53 5f 4d 4f 56 45 44 20 66 69 6c 65 2d 63 6f 6e  S_MOVED file-con
2f270 74 72 6f 6c 20 69 73 20 75 6e 69 6d 70 6c 65 6d  trol is unimplem
2f280 65 6e 74 65 64 2c 20 61 73 73 75 6d 65 20 74 68  ented, assume th
2f290 61 74 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  at the file.    
2f2a0 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  ** has not been 
2f2b0 6d 6f 76 65 64 2e 20 20 54 68 61 74 20 69 73 20  moved.  That is 
2f2c0 74 68 65 20 68 69 73 74 6f 72 69 63 61 6c 20 62  the historical b
2f2d0 65 68 61 76 69 6f 72 20 6f 66 20 53 51 4c 69 74  ehavior of SQLit
2f2e0 65 3a 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20  e: prior to.    
2f2f0 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 38 2e 33  ** version 3.8.3
2f300 2c 20 69 74 20 6e 65 76 65 72 20 63 68 65 63 6b  , it never check
2f310 65 64 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  ed */.    rc = S
2f320 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
2f330 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
2f340 5f 4f 4b 20 26 26 20 62 48 61 73 4d 6f 76 65 64  _OK && bHasMoved
2f350 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
2f360 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d  ITE_READONLY_DBM
2f370 4f 56 45 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75  OVED;.  }.  retu
2f380 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2f390 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2f3a0 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74  s called after t
2f3b0 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f  ransitioning fro
2f3c0 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74  m PAGER_UNLOCK t
2f3d0 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45  o.** PAGER_SHARE
2f3e0 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73 74  D state. It test
2f3f0 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
2f400 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73  hot journal pres
2f410 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69  ent in.** the fi
2f420 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68  le-system for th
2f430 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41  e given pager. A
2f440 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20   hot journal is 
2f450 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65  one that .** nee
2f460 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
2f470 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20  back. According 
2f480 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
2f490 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a  , a hot-journal.
2f4a0 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  ** file exists i
2f4b0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
2f4c0 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65 74  criteria are met
2f4d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
2f4e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
2f4f0 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  sts in the file 
2f500 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20  system, and.**  
2f510 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f   * No process ho
2f520 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6f  lds a RESERVED o
2f530 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f  r greater lock o
2f540 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2f550 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ile, and.**   * 
2f560 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
2f570 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65 61  e itself is grea
2f580 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73  ter than 0 bytes
2f590 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a   in size, and.**
2f5a0 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20 62     * The first b
2f5b0 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  yte of the journ
2f5c0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
2f5d0 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a  nd is not 0x00..
2f5e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
2f5f0 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
2f600 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2f610 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61  s 0 but a journa
2f620 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73  l file.** exists
2f630 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62  , that is probab
2f640 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ly an old journa
2f650 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d  l left over from
2f660 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61   a prior.** data
2f670 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61  base with the sa
2f680 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  me name. In this
2f690 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61   case the journa
2f6a0 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73  l file is.** jus
2f6b0 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  t deleted using 
2f6c0 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73  OsDelete, *pExis
2f6d0 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  ts is set to 0 a
2f6e0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  nd SQLITE_OK.** 
2f6f0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
2f700 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2f710 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69  does not check i
2f720 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61 73  f there is a mas
2f730 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
2f740 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65  name.** at the e
2f750 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20  nd of the file. 
2f760 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64  If there is, and
2f770 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75   that master jou
2f780 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65  rnal file.** doe
2f790 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65  s not exist, the
2f7a0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
2f7b0 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  le is not really
2f7c0 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a   hot. In this.**
2f7d0 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69   case this routi
2f7e0 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  ne will return a
2f7f0 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e   false-positive.
2f800 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   The pager_playb
2f810 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ack().** routine
2f820 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74   will discover t
2f830 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
2f840 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  file is not real
2f850 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77  ly hot and .** w
2f860 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20  ill not roll it 
2f870 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  back. .**.** If 
2f880 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
2f890 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65  le is found to e
2f8a0 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69  xist, *pExists i
2f8b0 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a  s set to 1 and .
2f8c0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
2f8d0 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74  urned. If no hot
2f8e0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
2f8f0 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73   present, *pExis
2f900 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ts is.** set to 
2f910 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  0 and SQLITE_OK 
2f920 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
2f930 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
2f940 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20  while trying.** 
2f950 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
2f960 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f  ther or not a ho
2f970 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  t-journal file e
2f980 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72  xists, the IO er
2f990 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72  ror.** code is r
2f9a0 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
2f9b0 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74  value of *pExist
2f9c0 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a  s is undefined..
2f9d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
2f9e0 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sHotJournal(Page
2f9f0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a  r *pPager, int *
2fa00 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69  pExists){.  sqli
2fa10 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
2fa20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
2fa30 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Vfs;.  int rc = 
2fa40 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2fa50 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2fa60 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69  ode */.  int exi
2fa70 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  sts = 1;        
2fa80 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2fa90 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
2faa0 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
2fab0 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20   int jrnlOpen = 
2fac0 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  !!isOpen(pPager-
2fad0 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74  >jfd);..  assert
2fae0 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
2faf0 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
2fb00 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2fb10 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74  >fd) );.  assert
2fb20 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
2fb30 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
2fb40 0a 20 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f  .  assert( jrnlO
2fb50 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69  pen==0 || ( sqli
2fb60 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
2fb70 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
2fb80 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51  r->jfd) &.    SQ
2fb90 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
2fba0 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
2fbb0 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73  .  ));..  *pExis
2fbc0 74 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a  ts = 0;.  if( !j
2fbd0 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  rnlOpen ){.    r
2fbe0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
2fbf0 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72  ess(pVfs, pPager
2fc00 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  ->zJournal, SQLI
2fc10 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
2fc20 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a  , &exists);.  }.
2fc30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2fc40 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b  _OK && exists ){
2fc50 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20  .    int locked 
2fc60 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2fc70 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65   /* True if some
2fc80 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
2fc90 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
2fca0 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63  /..    /* Race c
2fcb0 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20  ondition here:  
2fcc0 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  Another process 
2fcd0 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
2fce0 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20  holding the.    
2fcf0 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ** the RESERVED 
2fd00 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20  lock and have a 
2fd10 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20  journal open at 
2fd20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63  the sqlite3OsAcc
2fd30 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61  ess() .    ** ca
2fd40 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68  ll above, but th
2fd50 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  en delete the jo
2fd60 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74  urnal and drop t
2fd70 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20  he lock before. 
2fd80 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20     ** we get to 
2fd90 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71  the following sq
2fda0 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
2fdb0 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e  rvedLock() call.
2fdc0 20 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a    If that.    **
2fdd0 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
2fde0 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
2fdf0 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20   think there is 
2fe00 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68  a hot journal wh
2fe10 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63  en.    ** in fac
2fe20 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e  t there is none.
2fe30 20 20 54 68 69 73 20 72 65 73 75 6c 74 73 20 69    This results i
2fe40 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  n a false-positi
2fe50 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20  ve which will.  
2fe60 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69    ** be dealt wi
2fe70 74 68 20 62 79 20 74 68 65 20 70 6c 61 79 62 61  th by the playba
2fe80 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63  ck routine.  Tic
2fe90 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a  ket #3883..    *
2fea0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2feb0 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
2fec0 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  dLock(pPager->fd
2fed0 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20  , &locked);.    
2fee0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2fef0 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a  K && !locked ){.
2ff00 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65        Pgno nPage
2ff10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ff20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
2ff30 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
2ff40 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20   file */..      
2ff50 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2ff60 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 3b 0a 20  tempFile==0 );. 
2ff70 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50       rc = pagerP
2ff80 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
2ff90 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
2ffa0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2ffb0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K ){.        /* 
2ffc0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
2ffd0 69 73 20 7a 65 72 6f 20 70 61 67 65 73 20 69 6e  is zero pages in
2ffe0 20 73 69 7a 65 2c 20 74 68 61 74 20 6d 65 61 6e   size, that mean
2fff0 73 20 74 68 61 74 20 65 69 74 68 65 72 20 28 31  s that either (1
30000 29 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  ) the.        **
30010 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 20 72 65   journal is a re
30020 6d 6e 61 6e 74 20 66 72 6f 6d 20 61 20 70 72 69  mnant from a pri
30030 6f 72 20 64 61 74 61 62 61 73 65 20 77 69 74 68  or database with
30040 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 77   the same name w
30050 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  here.        ** 
30060 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30070 65 20 62 75 74 20 6e 6f 74 20 74 68 65 20 6a 6f  e but not the jo
30080 75 72 6e 61 6c 20 77 61 73 20 64 65 6c 65 74 65  urnal was delete
30090 64 2c 20 6f 72 20 28 32 29 20 74 68 65 20 69 6e  d, or (2) the in
300a0 69 74 69 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  itial.        **
300b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
300c0 74 20 70 6f 70 75 6c 61 74 65 73 20 61 20 6e 65  t populates a ne
300d0 77 20 64 61 74 61 62 61 73 65 20 69 73 20 62 65  w database is be
300e0 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  ing rolled back.
300f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 65  .        ** In e
30100 69 74 68 65 72 20 63 61 73 65 2c 20 74 68 65 20  ither case, the 
30110 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e  journal file can
30120 20 62 65 20 64 65 6c 65 74 65 64 2e 20 20 48 6f   be deleted.  Ho
30130 77 65 76 65 72 2c 20 74 61 6b 65 20 63 61 72 65  wever, take care
30140 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20  .        ** not 
30150 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
30160 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74  urnal file if it
30170 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
30180 20 64 75 65 20 74 6f 0a 20 20 20 20 20 20 20 20   due to.        
30190 2a 2a 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  ** journal_mode=
301a0 50 45 52 53 49 53 54 2e 0a 20 20 20 20 20 20 20  PERSIST..       
301b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
301c0 6e 50 61 67 65 3d 3d 30 20 26 26 20 21 6a 72 6e  nPage==0 && !jrn
301d0 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  lOpen ){.       
301e0 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
301f0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
30200 20 20 20 20 20 20 20 20 20 69 66 28 20 70 61 67           if( pag
30210 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
30220 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d   RESERVED_LOCK)=
30230 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30240 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
30250 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
30260 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
30270 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
30280 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
30290 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 20 70  xclusiveMode ) p
302a0 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
302b0 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
302c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
302d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
302e0 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
302f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
30300 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
30310 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
30320 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74  exists and no ot
30330 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  her connection h
30340 61 73 20 61 20 72 65 73 65 72 76 65 64 0a 20 20  as a reserved.  
30350 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72          ** or gr
30360 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68  eater lock on th
30370 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
30380 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20   Now check that 
30390 74 68 65 72 65 20 69 73 0a 20 20 20 20 20 20 20  there is.       
303a0 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f     ** at least o
303b0 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65  ne non-zero byte
303c0 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  s at the start o
303d0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
303e0 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  le..          **
303f0 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 74 68   If there is, th
30400 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74  en we consider t
30410 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62  his journal to b
30420 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a  e hot. If not, .
30430 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
30440 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a  can be ignored..
30450 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
30460 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c         if( !jrnl
30470 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Open ){.        
30480 20 20 20 20 69 6e 74 20 66 20 3d 20 0a 23 69 66      int f = .#if
30490 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44   SQLITE_ENABLE_D
304a0 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20  ATA_PROTECTION. 
304b0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 50               (pP
304c0 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 26 53  ager->vfsFlags&S
304d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 49 4c 45 50  QLITE_OPEN_FILEP
304e0 52 4f 54 45 43 54 49 4f 4e 5f 4d 41 53 4b 29 7c  ROTECTION_MASK)|
304f0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
30500 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
30510 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
30520 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
30530 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  NAL;.           
30540 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
30550 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
30560 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
30570 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b  er->jfd, f, &f);
30580 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
30590 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
305a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
305b0 20 20 20 20 20 20 20 20 75 38 20 66 69 72 73 74          u8 first
305c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
305d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
305e0 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
305f0 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72 73 74  , (void *)&first
30600 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 1, 0);.       
30610 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
30620 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
30630 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
30640 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
30650 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
30660 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
30670 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b  if( !jrnlOpen ){
30680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
30690 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
306a0 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
306b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
306c0 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d        *pExists =
306d0 20 28 66 69 72 73 74 21 3d 30 29 3b 0a 20 20 20   (first!=0);.   
306e0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
306f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54   rc==SQLITE_CANT
30700 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  OPEN ){.        
30710 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e      /* If we can
30720 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 72 6f 6c  not open the rol
30730 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69  lback journal fi
30740 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  le in order to s
30750 65 65 20 69 66 0a 20 20 20 20 20 20 20 20 20 20  ee if.          
30760 20 20 2a 2a 20 69 74 20 68 61 73 20 61 20 7a 65    ** it has a ze
30770 72 6f 20 68 65 61 64 65 72 2c 20 74 68 61 74 20  ro header, that 
30780 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20  might be due to 
30790 61 6e 20 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72  an I/O error, or
307a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
307b0 69 74 20 6d 69 67 68 74 20 62 65 20 64 75 65 20  it might be due 
307c0 74 6f 20 74 68 65 20 72 61 63 65 20 63 6f 6e 64  to the race cond
307d0 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ition described 
307e0 61 62 6f 76 65 20 61 6e 64 20 69 6e 0a 20 20 20  above and in.   
307f0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 69 63 6b           ** tick
30800 65 74 20 23 33 38 38 33 2e 20 20 45 69 74 68 65  et #3883.  Eithe
30810 72 20 77 61 79 2c 20 61 73 73 75 6d 65 20 74 68  r way, assume th
30820 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
30830 73 20 68 6f 74 2e 0a 20 20 20 20 20 20 20 20 20  s hot..         
30840 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
30850 20 62 65 20 61 20 66 61 6c 73 65 20 70 6f 73 69   be a false posi
30860 74 69 76 65 2e 20 20 42 75 74 20 69 66 20 69 74  tive.  But if it
30870 20 69 73 2c 20 74 68 65 6e 20 74 68 65 0a 20 20   is, then the.  
30880 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 75 74            ** aut
30890 6f 6d 61 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70  omatic journal p
308a0 6c 61 79 62 61 63 6b 20 61 6e 64 20 72 65 63 6f  layback and reco
308b0 76 65 72 79 20 6d 65 63 68 61 6e 69 73 6d 20 77  very mechanism w
308c0 69 6c 6c 20 64 65 61 6c 0a 20 20 20 20 20 20 20  ill deal.       
308d0 20 20 20 20 20 2a 2a 20 77 69 74 68 20 69 74 20       ** with it 
308e0 75 6e 64 65 72 20 61 6e 20 45 58 43 4c 55 53 49  under an EXCLUSI
308f0 56 45 20 6c 6f 63 6b 20 77 68 65 72 65 20 77 65  VE lock where we
30900 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a   do not need to.
30910 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77              ** w
30920 6f 72 72 79 20 73 6f 20 6d 75 63 68 20 77 69 74  orry so much wit
30930 68 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  h race condition
30940 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  s..            *
30950 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  /.            *p
30960 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20  Exists = 1;.    
30970 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
30980 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
30990 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
309a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
309b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
309c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
309d0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
309e0 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65  o obtain a share
309f0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
30a00 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
30a10 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f  It is illegal to
30a20 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
30a30 65 72 47 65 74 28 29 20 75 6e 74 69 6c 20 61 66  erGet() until af
30a40 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
30a50 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73 75  n.** has been su
30a60 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65  ccessfully calle
30a70 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d 6c  d. If a shared-l
30a80 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
30a90 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73  eld when.** this
30aa0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
30ab0 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
30ac0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  op..**.** The fo
30ad0 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69 6f  llowing operatio
30ae0 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72 66  ns are also perf
30af0 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66 75  ormed by this fu
30b00 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  nction..**.**   
30b10 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20  1) If the pager 
30b20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  is currently in 
30b30 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
30b40 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a   (no lock held.*
30b50 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61  *      on the da
30b60 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68  tabase file), th
30b70 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
30b80 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20   made to obtain 
30b90 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44  a.**      SHARED
30ba0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
30bb0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65  abase file. Imme
30bc0 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62  diately after ob
30bd0 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20  taining.**      
30be0 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
30bf0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
30c00 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20   is checked for 
30c10 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a  a hot-journal,.*
30c20 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73 20  *      which is 
30c30 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20 70  played back if p
30c40 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e  resent. Followin
30c50 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61  g any hot-journa
30c60 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62  l .**      rollb
30c70 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  ack, the content
30c80 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 61  s of the cache a
30c90 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79 20  re validated by 
30ca0 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20  checking.**     
30cb0 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75   the 'change-cou
30cc0 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74  nter' field of t
30cd0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30ce0 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20   header and.**  
30cf0 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69 66      discarded if
30d00 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20   they are found 
30d10 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a  to be invalid..*
30d20 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65  *.**   2) If the
30d30 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
30d40 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d  g in exclusive-m
30d50 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61  ode, and there a
30d60 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  re currently.** 
30d70 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64       no outstand
30d80 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
30d90 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64  o any pages, and
30da0 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
30db0 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20   state,.**      
30dc0 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
30dd0 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72  is made to clear
30de0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
30df0 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a   by discarding.*
30e00 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65  *      the conte
30e10 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
30e20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e  cache and rollin
30e30 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20  g back any open 
30e40 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
30e50 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  file..**.** If e
30e60 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
30e70 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
30e80 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
30e90 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  If an IO error .
30ea0 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  ** occurs while 
30eb0 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61  locking the data
30ec0 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66  base, checking f
30ed0 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
30ee0 20 66 69 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c   file or .** rol
30ef0 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72  ling back a jour
30f00 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f  nal file, the IO
30f10 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
30f20 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
30f30 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72  sqlite3PagerShar
30f40 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  edLock(Pager *pP
30f50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
30f60 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
30f70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
30f80 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
30f90 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
30fa0 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
30fb0 66 72 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20  from b-tree and 
30fc0 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20  only when there 
30fd0 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73  are no.  ** outs
30fe0 74 61 6e 64 69 6e 67 20 70 61 67 65 73 2e 20 54  tanding pages. T
30ff0 68 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74  his implies that
31000 20 74 68 65 20 70 61 67 65 72 20 73 74 61 74 65   the pager state
31010 20 73 68 6f 75 6c 64 20 65 69 74 68 65 72 0a 20   should either. 
31020 20 2a 2a 20 62 65 20 4f 50 45 4e 20 6f 72 20 52   ** be OPEN or R
31030 45 41 44 45 52 2e 20 52 45 41 44 45 52 20 69 73  EADER. READER is
31040 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 69   only possible i
31050 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f  f the pager is o
31060 72 20 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65  r was in .  ** e
31070 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
31080 6d 6f 64 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65  mode.  */.  asse
31090 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
310a0 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
310b0 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b  ->pPCache)==0 );
310c0 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
310d0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
310e0 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
310f0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
31100 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c  e==PAGER_OPEN ||
31110 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
31120 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
31130 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
31140 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
31150 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20  TE_OK );..  if( 
31160 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
31170 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e  ger) && pPager->
31180 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
31190 45 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 48  EN ){.    int bH
311a0 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 20 20  otJournal = 1;  
311b0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
311c0 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  if there exists 
311d0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2d 66 69  a hot journal-fi
311e0 6c 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  le */..    asser
311f0 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
31200 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
31210 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
31220 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45  pPager->eLock==E
31230 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
31240 0a 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ..    rc = pager
31250 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
31260 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
31270 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  K);.    if( rc!=
31280 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31290 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
312a0 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  r->eLock==NO_LOC
312b0 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  K || pPager->eLo
312c0 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck==UNKNOWN_LOCK
312d0 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   );.      goto f
312e0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  ailed;.    }..  
312f0 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61    /* If a journa
31300 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61  l file exists, a
31310 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52  nd there is no R
31320 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
31330 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
31340 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  ase file, then i
31350 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74  t either needs t
31360 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
31370 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20   or deleted..   
31380 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
31390 65 72 2d 3e 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  er->eLock<=SHARE
313a0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  D_LOCK ){.      
313b0 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e  rc = hasHotJourn
313c0 61 6c 28 70 50 61 67 65 72 2c 20 26 62 48 6f 74  al(pPager, &bHot
313d0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a  Journal);.    }.
313e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
313f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
31400 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
31410 7d 0a 20 20 20 20 69 66 28 20 62 48 6f 74 4a 6f  }.    if( bHotJo
31420 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69  urnal ){.      i
31430 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  f( pPager->readO
31440 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72  nly ){.        r
31450 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
31460 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  NLY_ROLLBACK;.  
31470 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
31480 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
31490 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c    /* Get an EXCL
314a0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
314b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
314c0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   At this point i
314d0 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d  t is.      ** im
314e0 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52  portant that a R
314f0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
31500 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20  not obtained on 
31510 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20  the way to the. 
31520 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56       ** EXCLUSIV
31530 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65  E lock. If it we
31540 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63  re, another proc
31550 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74  ess might open t
31560 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
31570 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63  base file, detec
31580 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  t the RESERVED l
31590 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64  ock, and conclud
315a0 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
315b0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
315c0 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69  safe to read whi
315d0 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  le this process 
315e0 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67  is still rolling
315f0 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68   the .      ** h
31600 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e  ot-journal back.
31610 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20  .      ** .     
31620 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20   ** Because the 
31630 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53  intermediate RES
31640 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
31650 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79  t requested, any
31660 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
31670 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69  process attempti
31680 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ng to access the
31690 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
316a0 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20  ill get to .    
316b0 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20    ** this point 
316c0 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20  in the code and 
316d0 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69  fail to obtain i
316e0 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45  ts own EXCLUSIVE
316f0 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20   lock .      ** 
31700 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
31710 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  file..      **. 
31720 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73 73 20 74       ** Unless t
31730 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6c  he pager is in l
31740 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
31750 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20  usive mode, the 
31760 6c 6f 63 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a  lock is.      **
31770 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 53   downgraded to S
31780 48 41 52 45 44 5f 4c 4f 43 4b 20 62 65 66 6f 72  HARED_LOCK befor
31790 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
317a0 72 65 74 75 72 6e 73 2e 0a 20 20 20 20 20 20 2a  returns..      *
317b0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  /.      rc = pag
317c0 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
317d0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
317e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
317f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
31800 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
31810 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20  ;.      }. .    
31820 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6e 6f    /* If it is no
31830 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 61  t already open a
31840 6e 64 20 74 68 65 20 66 69 6c 65 20 65 78 69 73  nd the file exis
31850 74 73 20 6f 6e 20 64 69 73 6b 2c 20 6f 70 65 6e  ts on disk, open
31860 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a   the .      ** j
31870 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f  ournal for read/
31880 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 57 72  write access. Wr
31890 69 74 65 20 61 63 63 65 73 73 20 69 73 20 72 65  ite access is re
318a0 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20 0a  quired because .
318b0 20 20 20 20 20 20 2a 2a 20 69 6e 20 65 78 63 6c        ** in excl
318c0 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
318d0 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
318e0 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65  iptor will be ke
318f0 70 74 20 6f 70 65 6e 20 0a 20 20 20 20 20 20 2a  pt open .      *
31900 2a 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 75  * and possibly u
31910 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61  sed for a transa
31920 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20  ction later on. 
31930 41 6c 73 6f 2c 20 77 72 69 74 65 2d 61 63 63 65  Also, write-acce
31940 73 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ss .      ** is 
31950 75 73 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64  usually required
31960 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
31970 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 6a 6f 75 72   journal in jour
31980 6e 61 6c 5f 6d 6f 64 65 3d 70 65 72 73 69 73 74  nal_mode=persist
31990 20 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 20   .      ** mode 
319a0 28 61 6e 64 20 61 6c 73 6f 20 66 6f 72 20 6a 6f  (and also for jo
319b0 75 72 6e 61 6c 5f 6d 6f 64 65 3d 74 72 75 6e 63  urnal_mode=trunc
319c0 61 74 65 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74  ate on some syst
319d0 65 6d 73 29 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ems)..      **. 
319e0 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6a       ** If the j
319f0 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20  ournal does not 
31a00 65 78 69 73 74 2c 20 69 74 20 75 73 75 61 6c 6c  exist, it usuall
31a10 79 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d  y means that som
31a20 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  e .      ** othe
31a30 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6e  r connection man
31a40 61 67 65 64 20 74 6f 20 67 65 74 20 69 6e 20 61  aged to get in a
31a50 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20  nd roll it back 
31a60 62 65 66 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a  before .      **
31a70 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
31a80 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65 78   obtained the ex
31a90 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f  clusive lock abo
31aa0 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20  ve. Or, it .    
31ab0 20 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68    ** may mean th
31ac0 61 74 20 74 68 65 20 70 61 67 65 72 20 77 61 73  at the pager was
31ad0 20 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74   in the error-st
31ae0 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20  ate when this.  
31af0 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20      ** function 
31b00 77 61 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 74  was called and t
31b10 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
31b20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a  does not exist..
31b30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
31b40 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
31b50 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
31b60 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
31b70 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
31b80 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20  ager->pVfs;.    
31b90 20 20 20 20 69 6e 74 20 62 45 78 69 73 74 73 3b      int bExists;
31ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31bb0 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c   True if journal
31bc0 20 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a   file exists */.
31bd0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
31be0 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20  ite3OsAccess(.  
31bf0 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20            pVfs, 
31c00 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
31c10 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
31c20 45 58 49 53 54 53 2c 20 26 62 45 78 69 73 74 73  EXISTS, &bExists
31c30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
31c40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
31c50 62 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20  bExists ){.     
31c60 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20       int fout = 
31c70 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  0;.          int
31c80 20 66 20 3d 20 0a 23 69 66 20 53 51 4c 49 54 45   f = .#if SQLITE
31c90 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f  _ENABLE_DATA_PRO
31ca0 54 45 43 54 49 4f 4e 0a 20 20 20 20 20 20 20 20  TECTION.        
31cb0 20 20 20 20 28 70 50 61 67 65 72 2d 3e 76 66 73      (pPager->vfs
31cc0 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  Flags&SQLITE_OPE
31cd0 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54 49 4f 4e  N_FILEPROTECTION
31ce0 5f 4d 41 53 4b 29 7c 0a 23 65 6e 64 69 66 0a 20  _MASK)|.#endif. 
31cf0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
31d00 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
31d10 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
31d20 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20  N_JOURNAL;.     
31d30 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
31d40 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
31d50 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
31d60 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
31d70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
31d80 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
31d90 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20  fd, f, &fout);. 
31da0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
31db0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
31dc0 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
31dd0 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20  >jfd) );.       
31de0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
31df0 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c  E_OK && fout&SQL
31e00 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
31e10 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  Y ){.           
31e20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
31e30 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
31e40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
31e50 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
31e60 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  fd);.          }
31e70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31e80 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c   }. .      /* Pl
31e90 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74  ayback and delet
31ea0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  e the journal.  
31eb0 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73  Drop the databas
31ec0 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  e write.      **
31ed0 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75   lock and reacqu
31ee0 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
31ef0 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63 61 63  k. Purge the cac
31f00 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20  he before.      
31f10 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  ** playing back 
31f20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  the hot-journal 
31f30 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74  so that we don't
31f40 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20   end up with.   
31f50 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69     ** an inconsi
31f60 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79  stent cache.  Sy
31f70 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e  nc the hot journ
31f80 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e  al before playin
31f90 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61  g.      ** it ba
31fa0 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f  ck since the pro
31fb0 63 65 73 73 20 74 68 61 74 20 63 72 61 73 68 65  cess that crashe
31fc0 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68  d and left the h
31fd0 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  ot journal.     
31fe0 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64   ** probably did
31ff0 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64   not sync it and
32000 20 77 65 20 61 72 65 20 72 65 71 75 69 72 65 64   we are required
32010 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a   to always sync.
32020 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75        ** the jou
32030 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79  rnal before play
32040 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20  ing it back..   
32050 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
32060 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
32070 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  fd) ){.        a
32080 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
32090 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
320a0 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f  rc = pagerSyncHo
320b0 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  tJournal(pPager)
320c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
320d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
320e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
320f0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
32100 67 65 72 2c 20 21 70 50 61 67 65 72 2d 3e 74 65  ger, !pPager->te
32110 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  mpFile);.       
32120 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
32130 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a  e = PAGER_OPEN;.
32140 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32150 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65  }else if( !pPage
32160 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
32170 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
32180 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72  rUnlockDb(pPager
32190 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
321a0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
321b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
321c0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
321d0 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
321e0 6b 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ken if an error 
321f0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
32200 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20  ing to open.    
32210 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62      ** or roll b
32220 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
32230 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  l while holding 
32240 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
32250 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  k. The.        *
32260 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  * pager_unlock()
32270 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
32280 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72   called before r
32290 65 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f  eturning to unlo
322a0 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ck.        ** th
322b0 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 75  e file. If the u
322c0 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20 66 61  nlock attempt fa
322d0 69 6c 73 2c 20 74 68 65 6e 20 50 61 67 65 72 2e  ils, then Pager.
322e0 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20 20  eLock must be.  
322f0 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20        ** set to 
32300 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65  UNKNOWN_LOCK (se
32310 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  e the comment ab
32320 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20  ove the #define 
32330 66 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  for .        ** 
32340 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f  UNKNOWN_LOCK abo
32350 76 65 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e  ve for an explan
32360 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20  ation). .       
32370 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49   **.        ** I
32380 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 70  n order to get p
32390 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f  ager_unlock() to
323a0 20 64 6f 20 74 68 69 73 2c 20 73 65 74 20 50 61   do this, set Pa
323b0 67 65 72 2e 65 53 74 61 74 65 20 74 6f 0a 20 20  ger.eState to.  
323c0 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45        ** PAGER_E
323d0 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20 69  RROR now. This i
323e0 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63  s not actually c
323f0 6f 75 6e 74 65 64 20 61 73 20 61 20 74 72 61 6e  ounted as a tran
32400 73 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a  sition.        *
32410 2a 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65  * to ERROR state
32420 20 69 6e 20 74 68 65 20 73 74 61 74 65 20 64 69   in the state di
32430 61 67 72 61 6d 20 61 74 20 74 68 65 20 74 6f 70  agram at the top
32440 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2c 0a 20   of this file,. 
32450 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20         ** since 
32460 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
32470 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61   same call to pa
32480 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c  ger_unlock() wil
32490 6c 20 76 65 72 79 0a 20 20 20 20 20 20 20 20 2a  l very.        *
324a0 2a 20 73 68 6f 72 74 6c 79 20 74 72 61 6e 73 69  * shortly transi
324b0 74 69 6f 6e 20 74 68 65 20 70 61 67 65 72 20 6f  tion the pager o
324c0 62 6a 65 63 74 20 74 6f 20 74 68 65 20 4f 50 45  bject to the OPE
324d0 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67  N state. Calling
324e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 73 65  .        ** asse
324f0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29  rt_pager_state()
32500 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c   would fail now,
32510 20 61 73 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f   as it should no
32520 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20  t be possible.  
32530 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69        ** to be i
32540 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68  n ERROR state wh
32550 65 6e 20 74 68 65 72 65 20 61 72 65 20 7a 65 72  en there are zer
32560 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  o outstanding pa
32570 67 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  ge .        ** r
32580 65 66 65 72 65 6e 63 65 73 2e 0a 20 20 20 20 20  eferences..     
32590 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61     */.        pa
325a0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
325b0 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67  , rc);.        g
325c0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
325d0 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
325e0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
325f0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b  e==PAGER_OPEN );
32600 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
32610 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53  pPager->eLock==S
32620 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20  HARED_LOCK).    
32630 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
32640 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
32650 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   && pPager->eLoc
32660 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20  k>SHARED_LOCK). 
32670 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20       );.    }.. 
32680 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
32690 74 65 6d 70 46 69 6c 65 20 26 26 20 70 50 61 67  tempFile && pPag
326a0 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65  er->hasHeldShare
326b0 64 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f  dLock ){.      /
326c0 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63  * The shared-loc
326d0 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  k has just been 
326e0 61 63 71 75 69 72 65 64 20 74 68 65 6e 20 63 68  acquired then ch
326f0 65 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  eck to.      ** 
32700 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62  see if the datab
32710 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64  ase has been mod
32720 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64  ified.  If the d
32730 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e  atabase has chan
32740 67 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 66 6c  ged,.      ** fl
32750 75 73 68 20 74 68 65 20 63 61 63 68 65 2e 20 20  ush the cache.  
32760 54 68 65 20 68 61 73 48 65 6c 64 53 68 61 72 65  The hasHeldShare
32770 64 4c 6f 63 6b 20 66 6c 61 67 20 70 72 65 76 65  dLock flag preve
32780 6e 74 73 20 74 68 69 73 20 66 72 6f 6d 0a 20 20  nts this from.  
32790 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 69 6e 67      ** occurring
327a0 20 6f 6e 20 74 68 65 20 76 65 72 79 20 66 69 72   on the very fir
327b0 73 74 20 61 63 63 65 73 73 20 74 6f 20 61 20 66  st access to a f
327c0 69 6c 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  ile, in order to
327d0 20 73 61 76 65 20 61 0a 20 20 20 20 20 20 2a 2a   save a.      **
327e0 20 73 69 6e 67 6c 65 20 75 6e 6e 65 63 65 73 73   single unnecess
327f0 61 72 79 20 73 71 6c 69 74 65 33 4f 73 52 65 61  ary sqlite3OsRea
32800 64 28 29 20 63 61 6c 6c 20 61 74 20 74 68 65 20  d() call at the 
32810 73 74 61 72 74 2d 75 70 2e 0a 20 20 20 20 20 20  start-up..      
32820 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61  **.      ** Data
32830 62 61 73 65 20 63 68 61 6e 67 65 73 20 61 72 65  base changes are
32840 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f   detected by loo
32850 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73  king at 15 bytes
32860 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
32870 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34   ** at offset 24
32880 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
32890 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20   The first 4 of 
328a0 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61  these 16 bytes a
328b0 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32  re.      ** a 32
328c0 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61  -bit counter tha
328d0 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
328e0 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67   with each chang
328f0 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  e.  The.      **
32900 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61   other bytes cha
32910 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74  nge randomly wit
32920 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e  h each file chan
32930 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ge when.      **
32940 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75   a codec is in u
32950 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  se..      ** .  
32960 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
32970 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  a vanishingly sm
32980 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20  all chance that 
32990 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f  a change will no
329a0 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64  t be .      ** d
329b0 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68  etected.  The ch
329c0 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74  ance of an undet
329d0 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20  ected change is 
329e0 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20  so small that.  
329f0 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
32a00 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20   neglected..    
32a10 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20    */.      Pgno 
32a20 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
32a30 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
32a40 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  [sizeof(pPager->
32a50 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20  dbFileVers)];.. 
32a60 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50       rc = pagerP
32a70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
32a80 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
32a90 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 61  if( rc ) goto fa
32aa0 69 6c 65 64 3b 0a 0a 20 20 20 20 20 20 69 66 28  iled;..      if(
32ab0 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
32ac0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b      IOTRACE(("CK
32ad0 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70  VERS %p %d\n", p
32ae0 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62  Pager, sizeof(db
32af0 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20  FileVers)));.   
32b00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32b10 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
32b20 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c  fd, &dbFileVers,
32b30 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
32b40 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20  rs), 24);.      
32b50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32b60 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
32b70 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
32b80 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AD ){.          
32b90 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
32ba0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
32bb0 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  se{.        mems
32bc0 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30  et(dbFileVers, 0
32bd0 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
32be0 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  ers));.      }..
32bf0 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70        if( memcmp
32c00 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
32c10 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c  ers, dbFileVers,
32c20 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
32c30 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  rs))!=0 ){.     
32c40 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
32c50 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20  Pager);..       
32c60 20 2f 2a 20 55 6e 6d 61 70 20 74 68 65 20 64 61   /* Unmap the da
32c70 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20  tabase file. It 
32c80 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
32c90 20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65 73   external proces
32ca0 73 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  ses.        ** m
32cb0 61 79 20 68 61 76 65 20 74 72 75 6e 63 61 74 65  ay have truncate
32cc0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
32cd0 69 6c 65 20 61 6e 64 20 74 68 65 6e 20 65 78 74  ile and then ext
32ce0 65 6e 64 65 64 20 69 74 20 62 61 63 6b 0a 20 20  ended it back.  
32cf0 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 74 73 20        ** to its 
32d00 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 20 77 68  original size wh
32d10 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
32d20 20 77 61 73 20 6e 6f 74 20 68 6f 6c 64 69 6e 67   was not holding
32d30 20 61 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20   a lock..       
32d40 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
32d50 20 74 68 65 72 65 20 6d 61 79 20 65 78 69 73 74   there may exist
32d60 20 61 20 50 61 67 65 72 2e 70 4d 61 70 20 6d 61   a Pager.pMap ma
32d70 70 70 69 6e 67 20 74 68 61 74 20 61 70 70 65 61  pping that appea
32d80 72 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  rs.        ** to
32d90 20 62 65 20 74 68 65 20 72 69 67 68 74 20 73 69   be the right si
32da0 7a 65 20 62 75 74 20 69 73 20 6e 6f 74 20 61 63  ze but is not ac
32db0 74 75 61 6c 6c 79 20 76 61 6c 69 64 2e 20 41 76  tually valid. Av
32dc0 6f 69 64 20 74 68 69 73 0a 20 20 20 20 20 20 20  oid this.       
32dd0 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 79 20   ** possibility 
32de0 62 79 20 75 6e 6d 61 70 70 69 6e 67 20 74 68 65  by unmapping the
32df0 20 64 62 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20   db here. */.   
32e00 20 20 20 20 20 69 66 28 20 55 53 45 46 45 54 43       if( USEFETC
32e10 48 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  H(pPager) ){.   
32e20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
32e30 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
32e40 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  fd, 0, 0);.     
32e50 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
32e60 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
32e70 65 72 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c  ere is a WAL fil
32e80 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  e in the file-sy
32e90 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20  stem, open this 
32ea0 64 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c 0a  database in WAL.
32eb0 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68      ** mode. Oth
32ec0 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c  erwise, the foll
32ed0 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63  owing function c
32ee0 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
32ef0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
32f00 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
32f10 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 23  esent(pPager);.#
32f20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
32f30 49 54 5f 57 41 4c 0a 20 20 20 20 61 73 73 65 72  IT_WAL.    asser
32f40 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d  t( pPager->pWal=
32f50 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
32f60 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  _OK );.#endif.  
32f70 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  }..  if( pagerUs
32f80 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
32f90 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
32fa0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
32fb0 20 72 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e   rc = pagerBegin
32fc0 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
32fd0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
32fe0 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
32ff0 46 69 6c 65 3d 3d 30 20 26 26 20 70 50 61 67 65  File==0 && pPage
33000 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
33010 5f 4f 50 45 4e 20 26 26 20 72 63 3d 3d 53 51 4c  _OPEN && rc==SQL
33020 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
33030 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
33040 74 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  t(pPager, &pPage
33050 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a  r->dbSize);.  }.
33060 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  . failed:.  if( 
33070 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
33080 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
33090 4d 44 42 20 29 3b 0a 20 20 20 20 70 61 67 65 72  MDB );.    pager
330a0 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
330b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
330c0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
330d0 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 7d 65 6c  ER_OPEN );.  }el
330e0 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
330f0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  eState = PAGER_R
33100 45 41 44 45 52 3b 0a 20 20 20 20 70 50 61 67 65  EADER;.    pPage
33110 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64  r->hasHeldShared
33120 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Lock = 1;.  }.  
33130 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
33140 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65 72  .** If the refer
33150 65 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72  ence count has r
33160 65 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c  eached zero, rol
33170 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
33180 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
33190 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70  and unlock the p
331a0 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65  ager..**.** Exce
331b0 70 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  pt, in locking_m
331c0 6f 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68  ode=EXCLUSIVE wh
331d0 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68  en there is noth
331e0 69 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65  ing to in.** the
331f0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
33200 6c 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73  l, the unlock is
33210 20 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61   not performed a
33220 6e 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  nd there is.** n
33230 6f 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  othing to rollba
33240 63 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74  ck, so this rout
33250 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
33260 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
33270 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
33280 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65  sed(Pager *pPage
33290 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
332a0 2d 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20 26 26  ->nMmapOut==0 &&
332b0 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52   (sqlite3PcacheR
332c0 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
332d0 70 50 43 61 63 68 65 29 3d 3d 30 29 20 29 7b 0a  pPCache)==0) ){.
332e0 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41      pagerUnlockA
332f0 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
33300 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
33310 20 41 63 71 75 69 72 65 20 61 20 72 65 66 65 72   Acquire a refer
33320 65 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d  ence to page num
33330 62 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65  ber pgno in page
33340 72 20 70 50 61 67 65 72 20 28 61 20 70 61 67 65  r pPager (a page
33350 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61  .** reference ha
33360 73 20 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e  s type DbPage*).
33370 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
33380 64 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a  d reference is .
33390 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ** successfully 
333a0 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20  obtained, it is 
333b0 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67  copied to *ppPag
333c0 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  e and SQLITE_OK 
333d0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
333e0 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
333f0 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
33400 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69   in the cache, i
33410 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a  t is returned. .
33420 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  ** Otherwise, a 
33430 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20  new page object 
33440 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
33450 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
33460 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f  data.** read fro
33470 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
33480 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73  ile. In some cas
33490 65 73 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d  es, the pcache m
334a0 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f  odule may.** cho
334b0 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63  ose not to alloc
334c0 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f  ate a new page o
334d0 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65  bject and may re
334e0 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  use an existing.
334f0 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e  ** object with n
33500 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
33510 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20  ferences..**.** 
33520 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61  The extra data a
33530 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67  ppended to a pag
33540 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74  e is always init
33550 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73  ialized to zeros
33560 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74   the .** first t
33570 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f  ime a page is lo
33580 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  aded into memory
33590 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65  . If the page re
335a0 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61  quested is .** a
335b0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61  lready in the ca
335c0 63 68 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  che when this fu
335d0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
335e0 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74 72 61  , then the extra
335f0 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74  .** data is left
33600 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20   as it was when 
33610 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20  the page object 
33620 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a  was last used..*
33630 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
33640 62 61 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d  base image is sm
33650 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72  aller than the r
33660 65 71 75 65 73 74 65 64 20 70 61 67 65 20 6f 72  equested page or
33670 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65   if a .** non-ze
33680 72 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73 73  ro value is pass
33690 65 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74  ed as the noCont
336a0 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e  ent parameter an
336b0 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73  d the .** reques
336c0 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20  ted page is not 
336d0 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20 69  already stored i
336e0 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74 68 65  n the cache, the
336f0 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20  n no .** actual 
33700 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73  disk read occurs
33710 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
33720 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  he memory image 
33730 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20  of the .** page 
33740 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
33750 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a  o all zeros. .**
33760 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74  .** If noContent
33770 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61   is true, it mea
33780 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ns that we do no
33790 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  t care about the
337a0 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20   contents.** of 
337b0 74 68 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f  the page. This o
337c0 63 63 75 72 73 20 69 6e 20 74 77 6f 20 73 63 65  ccurs in two sce
337d0 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  narios:.**.**   
337e0 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20  a) When reading 
337f0 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
33800 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
33810 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a  atabase, and.**.
33820 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20 73  **   b) When a s
33830 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e  avepoint is bein
33840 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  g rolled back an
33850 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61  d we need to loa
33860 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20  d.**      a new 
33870 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61  page into the ca
33880 63 68 65 20 74 6f 20 62 65 20 66 69 6c 6c 65 64  che to be filled
33890 20 77 69 74 68 20 74 68 65 20 64 61 74 61 20 72   with the data r
338a0 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  ead.**      from
338b0 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a   the savepoint j
338c0 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
338d0 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72   noContent is tr
338e0 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ue, then the dat
338f0 61 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65  a returned is ze
33900 72 6f 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a  roed instead of.
33910 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20 66 72  ** being read fr
33920 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
33930 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74   Additionally, t
33940 68 65 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f  he bits correspo
33950 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f  nding.** to pgno
33960 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75   in Pager.pInJou
33970 72 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20  rnal (bitvec of 
33980 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 77 72  pages already wr
33990 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20  itten to the.** 
339a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e  journal file) an
339b0 64 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70  d the PagerSavep
339c0 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
339d0 74 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79  t bitvecs of any
339e0 20 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69   open.** savepoi
339f0 6e 74 73 20 61 72 65 20 73 65 74 2e 20 54 68 69  nts are set. Thi
33a00 73 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70  s means if the p
33a10 61 67 65 20 69 73 20 6d 61 64 65 20 77 72 69 74  age is made writ
33a20 61 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70  able at any.** p
33a30 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
33a40 72 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c  re, using a call
33a50 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
33a60 57 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e  Write(), its con
33a70 74 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  tents.** will no
33a80 74 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20  t be journaled. 
33a90 54 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a  This saves IO..*
33aa0 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69  *.** The acquisi
33ab0 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20  tion might fail 
33ac0 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73  for several reas
33ad0 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73  ons.  In all cas
33ae0 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70  es,.** an approp
33af0 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
33b00 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
33b10 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
33b20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53  to NULL..**.** S
33b30 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50  ee also sqlite3P
33b40 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42  agerLookup().  B
33b50 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oth this routine
33b60 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74   and Lookup() at
33b70 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64  tempt.** to find
33b80 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69   a page in the i
33b90 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66  n-memory cache f
33ba0 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61  irst.  If the pa
33bb0 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
33bc0 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  y.** in memory, 
33bd0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65  this routine goe
33be0 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61  s to disk to rea
33bf0 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20  d it in whereas 
33c00 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74  Lookup().** just
33c10 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69   returns 0.  Thi
33c20 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72  s routine acquir
33c30 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74  es a read-lock t
33c40 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
33c50 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f  .** has to go to
33c60 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64   disk, and could
33c70 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61   also playback a
33c80 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66  n old journal if
33c90 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53   necessary..** S
33ca0 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65  ince Lookup() ne
33cb0 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ver goes to disk
33cc0 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74  , it never has t
33cd0 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b  o deal with lock
33ce0 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  s.** or journal 
33cf0 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  files..*/.int sq
33d00 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 0a 20  lite3PagerGet(. 
33d10 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
33d20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
33d30 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  r open on the da
33d40 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
33d50 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
33d60 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
33d70 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  ber to fetch */.
33d80 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67    DbPage **ppPag
33d90 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  e,    /* Write a
33da0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
33db0 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  page here */.  i
33dc0 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
33dd0 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f     /* PAGER_GET_
33de0 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  XXX flags */.){.
33df0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
33e00 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70  E_OK;.  PgHdr *p
33e10 50 67 20 3d 20 30 3b 0a 20 20 75 33 32 20 69 46  Pg = 0;.  u32 iF
33e20 72 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  rame = 0;       
33e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 61            /* Fra
33e40 6d 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  me to read from 
33e50 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 6f  WAL file */.  co
33e60 6e 73 74 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e  nst int noConten
33e70 74 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  t = (flags & PAG
33e80 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
33e90 29 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 61  );..  /* It is a
33ea0 63 63 65 70 74 61 62 6c 65 20 74 6f 20 75 73 65  cceptable to use
33eb0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d 6d   a read-only (mm
33ec0 61 70 29 20 70 61 67 65 20 66 6f 72 20 61 6e 79  ap) page for any
33ed0 20 70 61 67 65 20 65 78 63 65 70 74 0a 20 20 2a   page except.  *
33ee0 2a 20 70 61 67 65 20 31 20 69 66 20 74 68 65 72  * page 1 if ther
33ef0 65 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72  e is no write-tr
33f00 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f  ansaction open o
33f10 72 20 74 68 65 20 41 43 51 55 49 52 45 5f 52 45  r the ACQUIRE_RE
33f20 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61 67  ADONLY.  ** flag
33f30 20 77 61 73 20 73 70 65 63 69 66 69 65 64 20 62   was specified b
33f40 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 41 6e  y the caller. An
33f50 64 20 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68 65  d so long as the
33f60 20 64 62 20 69 73 20 6e 6f 74 20 61 20 0a 20 20   db is not a .  
33f70 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20  ** temporary or 
33f80 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
33f90 73 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  se.  */.  const 
33fa0 69 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28 70  int bMmapOk = (p
33fb0 67 6e 6f 3e 31 20 26 26 20 55 53 45 46 45 54 43  gno>1 && USEFETC
33fc0 48 28 70 50 61 67 65 72 29 0a 20 20 20 26 26 20  H(pPager).   && 
33fd0 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d  (pPager->eState=
33fe0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 7c 7c  =PAGER_READER ||
33ff0 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
34000 47 45 54 5f 52 45 41 44 4f 4e 4c 59 29 29 0a 23  GET_READONLY)).#
34010 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
34020 5f 43 4f 44 45 43 0a 20 20 20 26 26 20 70 50 61  _CODEC.   && pPa
34030 67 65 72 2d 3e 78 43 6f 64 65 63 3d 3d 30 0a 23  ger->xCodec==0.#
34040 65 6e 64 69 66 0a 20 20 29 3b 0a 0a 20 20 2f 2a  endif.  );..  /*
34050 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6e 6f   Optimization no
34060 74 65 3a 20 20 41 64 64 69 6e 67 20 74 68 65 20  te:  Adding the 
34070 22 70 67 6e 6f 3c 3d 31 22 20 74 65 72 6d 20 62  "pgno<=1" term b
34080 65 66 6f 72 65 20 22 70 67 6e 6f 3d 3d 30 22 20  efore "pgno==0" 
34090 68 65 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 77 73  here.  ** allows
340a0 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 6f 70   the compiler op
340b0 74 69 6d 69 7a 65 72 20 74 6f 20 72 65 75 73 65  timizer to reuse
340c0 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
340d0 74 68 65 20 22 70 67 6e 6f 3e 31 22 0a 20 20 2a  the "pgno>1".  *
340e0 2a 20 74 65 73 74 20 69 6e 20 74 68 65 20 70 72  * test in the pr
340f0 65 76 69 6f 75 73 20 73 74 61 74 65 6d 65 6e 74  evious statement
34100 2c 20 61 6e 64 20 61 76 6f 69 64 20 74 65 73 74  , and avoid test
34110 69 6e 67 20 70 67 6e 6f 3d 3d 30 20 69 6e 20 74  ing pgno==0 in t
34120 68 65 0a 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 63  he.  ** common c
34130 61 73 65 20 77 68 65 72 65 20 70 67 6e 6f 20 69  ase where pgno i
34140 73 20 6c 61 72 67 65 2e 20 2a 2f 0a 20 20 69 66  s large. */.  if
34150 28 20 70 67 6e 6f 3c 3d 31 20 26 26 20 70 67 6e  ( pgno<=1 && pgn
34160 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  o==0 ){.    retu
34170 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
34180 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73  T_BKPT;.  }.  as
34190 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
341a0 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
341b0 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ER );.  assert( 
341c0 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
341d0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
341e0 61 73 73 65 72 74 28 20 6e 6f 43 6f 6e 74 65 6e  assert( noConten
341f0 74 3d 3d 30 20 7c 7c 20 62 4d 6d 61 70 4f 6b 3d  t==0 || bMmapOk=
34200 3d 30 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  =0 );..  assert(
34210 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64   pPager->hasHeld
34220 53 68 61 72 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b  SharedLock==1 );
34230 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
34240 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72  ger is in the er
34250 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75 72  ror state, retur
34260 6e 20 61 6e 20 65 72 72 6f 72 20 69 6d 6d 65 64  n an error immed
34270 69 61 74 65 6c 79 2e 20 0a 20 20 2a 2a 20 4f 74  iately. .  ** Ot
34280 68 65 72 77 69 73 65 2c 20 72 65 71 75 65 73 74  herwise, request
34290 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
342a0 68 65 20 50 43 61 63 68 65 20 6c 61 79 65 72 2e  he PCache layer.
342b0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
342c0 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
342d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
342e0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
342f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
34300 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 70 61  f( bMmapOk && pa
34310 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
34320 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
34330 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72  sqlite3WalFindFr
34340 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ame(pPager->pWal
34350 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29  , pgno, &iFrame)
34360 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
34370 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
34380 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
34390 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rr;.    }..    i
343a0 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 69 46  f( bMmapOk && iF
343b0 72 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rame==0 ){.     
343c0 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 30   void *pData = 0
343d0 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ;..      rc = sq
343e0 6c 69 74 65 33 4f 73 46 65 74 63 68 28 70 50 61  lite3OsFetch(pPa
343f0 67 65 72 2d 3e 66 64 2c 20 0a 20 20 20 20 20 20  ger->fd, .      
34400 20 20 20 20 28 69 36 34 29 28 70 67 6e 6f 2d 31      (i64)(pgno-1
34410 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ) * pPager->page
34420 53 69 7a 65 2c 20 70 50 61 67 65 72 2d 3e 70 61  Size, pPager->pa
34430 67 65 53 69 7a 65 2c 20 26 70 44 61 74 61 0a 20  geSize, &pData. 
34440 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 69       );..      i
34450 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
34460 20 26 26 20 70 44 61 74 61 20 29 7b 0a 20 20 20   && pData ){.   
34470 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
34480 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 52 45  >eState>PAGER_RE
34490 41 44 45 52 20 7c 7c 20 70 50 61 67 65 72 2d 3e  ADER || pPager->
344a0 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
344b0 20 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69        pPg = sqli
344c0 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
344d0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
344e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
344f0 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
34500 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
34510 65 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65  erAcquireMapPage
34520 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70  (pPager, pgno, p
34530 44 61 74 61 2c 20 26 70 50 67 29 3b 0a 20 20 20  Data, &pPg);.   
34540 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
34550 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
34560 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66  nfetch(pPager->f
34570 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29  d, (i64)(pgno-1)
34580 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  *pPager->pageSiz
34590 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20  e, pData);.     
345a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
345b0 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 20 20   pPg ){.        
345c0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
345d0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
345e0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
345f0 50 67 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  Pg;.          re
34600 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
34610 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34620 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  }.      if( rc!=
34630 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34640 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
34650 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
34660 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
34670 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
34680 70 63 61 63 68 65 5f 70 61 67 65 20 2a 70 42 61  pcache_page *pBa
34690 73 65 3b 0a 20 20 20 20 20 20 70 42 61 73 65 20  se;.      pBase 
346a0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  = sqlite3PcacheF
346b0 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
346c0 61 63 68 65 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a  ache, pgno, 3);.
346d0 20 20 20 20 20 20 69 66 28 20 70 42 61 73 65 3d        if( pBase=
346e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
346f0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
34700 46 65 74 63 68 53 74 72 65 73 73 28 70 50 61 67  FetchStress(pPag
34710 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
34720 6f 2c 20 26 70 42 61 73 65 29 3b 0a 20 20 20 20  o, &pBase);.    
34730 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
34740 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 70 61 67  TE_OK ) goto pag
34750 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a  er_acquire_err;.
34760 20 20 20 20 20 20 20 20 69 66 28 20 70 42 61 73          if( pBas
34770 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
34780 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65 20    pPg = *ppPage 
34790 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
347a0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
347b0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
347c0 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
347d0 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 20  ire_err;.       
347e0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
347f0 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65 20 3d   pPg = *ppPage =
34800 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
34810 74 63 68 46 69 6e 69 73 68 28 70 50 61 67 65 72  tchFinish(pPager
34820 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
34830 20 70 42 61 73 65 29 3b 0a 20 20 20 20 20 20 61   pBase);.      a
34840 73 73 65 72 74 28 20 70 50 67 21 3d 30 20 29 3b  ssert( pPg!=0 );
34850 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
34860 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34870 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72  ){.    /* Either
34880 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
34890 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
348a0 29 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72  ) returned an er
348b0 72 6f 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ror or the.    *
348c0 2a 20 70 61 67 65 72 20 77 61 73 20 61 6c 72 65  * pager was alre
348d0 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72  ady in the error
348e0 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73  -state when this
348f0 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
34900 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 53 65 74  lled..    ** Set
34910 20 70 50 67 20 74 6f 20 30 20 61 6e 64 20 6a 75   pPg to 0 and ju
34920 6d 70 20 74 6f 20 74 68 65 20 65 78 63 65 70 74  mp to the except
34930 69 6f 6e 20 68 61 6e 64 6c 65 72 2e 20 20 2a 2f  ion handler.  */
34940 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20  .    pPg = 0;.  
34950 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
34960 75 69 72 65 5f 65 72 72 3b 0a 20 20 7d 0a 20 20  uire_err;.  }.  
34970 61 73 73 65 72 74 28 20 70 50 67 3d 3d 28 2a 70  assert( pPg==(*p
34980 70 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  pPage) );.  asse
34990 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 70  rt( pPg->pgno==p
349a0 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
349b0 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
349c0 61 67 65 72 20 7c 7c 20 70 50 67 2d 3e 70 50 61  ager || pPg->pPa
349d0 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  ger==0 );..  if(
349e0 20 70 50 67 2d 3e 70 50 61 67 65 72 20 26 26 20   pPg->pPager && 
349f0 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  !noContent ){.  
34a00 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
34a10 65 20 74 68 65 20 70 63 61 63 68 65 20 61 6c 72  e the pcache alr
34a20 65 61 64 79 20 63 6f 6e 74 61 69 6e 73 20 61 6e  eady contains an
34a30 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 6f 70   initialized cop
34a40 79 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  y of.    ** the 
34a50 70 61 67 65 2e 20 52 65 74 75 72 6e 20 77 69 74  page. Return wit
34a60 68 6f 75 74 20 66 75 72 74 68 65 72 20 61 64 6f  hout further ado
34a70 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
34a80 28 20 70 67 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41  ( pgno<=PAGER_MA
34a90 58 5f 50 47 4e 4f 20 26 26 20 70 67 6e 6f 21 3d  X_PGNO && pgno!=
34aa0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
34ab0 61 67 65 72 29 20 29 3b 0a 20 20 20 20 70 50 61  ager) );.    pPa
34ac0 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52  ger->aStat[PAGER
34ad0 5f 53 54 41 54 5f 48 49 54 5d 2b 2b 3b 0a 20 20  _STAT_HIT]++;.  
34ae0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
34af0 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  OK;..  }else{.  
34b00 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63    /* The pager c
34b10 61 63 68 65 20 68 61 73 20 63 72 65 61 74 65 64  ache has created
34b20 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73   a new page. Its
34b30 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74   content needs t
34b40 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69  o .    ** be ini
34b50 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 0a 20  tialized.  */.. 
34b60 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d     pPg->pPager =
34b70 20 70 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f 2a   pPager;..    /*
34b80 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   The maximum pag
34b90 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31  e number is 2^31
34ba0 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
34bb0 43 4f 52 52 55 50 54 20 69 66 20 61 20 70 61 67  CORRUPT if a pag
34bc0 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20  e.    ** number 
34bd0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69  greater than thi
34be0 73 2c 20 6f 72 20 74 68 65 20 75 6e 75 73 65 64  s, or the unused
34bf0 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20 69   locking-page, i
34c00 73 20 72 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a  s requested. */.
34c10 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47      if( pgno>PAG
34c20 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70  ER_MAX_PGNO || p
34c30 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
34c40 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
34c50 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
34c60 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
34c70 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
34c80 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
34c90 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  }..    assert( !
34ca0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
34cb0 64 29 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a  d) || !MEMDB );.
34cc0 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
34cd0 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
34ce0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 67  Pager->dbSize<pg
34cf0 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20  no || noContent 
34d00 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  ){.      if( pgn
34d10 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  o>pPager->mxPgno
34d20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
34d30 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
34d40 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
34d50 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
34d60 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
34d70 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
34d80 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20       /* Failure 
34d90 74 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 20  to set the bits 
34da0 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c  in the InJournal
34db0 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20   bit-vectors is 
34dc0 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20  benign..        
34dd0 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61  ** It merely mea
34de0 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67 68 74  ns that we might
34df0 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77   do some extra w
34e00 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61  ork to journal a
34e10 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67   .        ** pag
34e20 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
34e30 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e  need to be journ
34e40 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c  aled.  Neverthel
34e50 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20  ess, be sure .  
34e60 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74        ** to test
34e70 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20   the case where 
34e80 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  a malloc error o
34e90 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
34ea0 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20  ng to set .     
34eb0 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61     ** a bit in a
34ec0 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20   bit vector..   
34ed0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
34ee0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
34ef0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
34f00 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50      if( pgno<=pP
34f10 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
34f20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45   ){.          TE
34f30 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73  STONLY( rc = ) s
34f40 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
34f50 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
34f60 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  al, pgno);.     
34f70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
34f80 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
34f90 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
34fa0 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72       TESTONLY( r
34fb0 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70  c = ) addToSavep
34fc0 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
34fd0 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  er, pgno);.     
34fe0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
34ff0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
35000 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
35010 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
35020 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
35030 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61   memset(pPg->pDa
35040 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  ta, 0, pPager->p
35050 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
35060 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25  IOTRACE(("ZERO %
35070 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
35080 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c   pgno));.    }el
35090 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70 61  se{.      if( pa
350a0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
350b0 29 20 26 26 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20  ) && bMmapOk==0 
350c0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
350d0 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72  sqlite3WalFindFr
350e0 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ame(pPager->pWal
350f0 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61 6d 65 29  , pgno, &iFrame)
35100 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
35110 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
35120 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
35130 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
35140 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
35150 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
35160 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
35170 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
35180 54 5f 4d 49 53 53 5d 2b 2b 3b 0a 20 20 20 20 20  T_MISS]++;.     
35190 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65   rc = readDbPage
351a0 28 70 50 67 2c 20 69 46 72 61 6d 65 29 3b 0a 20  (pPg, iFrame);. 
351b0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
351c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
351d0 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
351e0 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20  uire_err;.      
351f0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  }.    }.    page
35200 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70  r_set_pagehash(p
35210 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  Pg);.  }..  retu
35220 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
35230 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
35240 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  :.  assert( rc!=
35250 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
35260 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71  f( pPg ){.    sq
35270 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
35280 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  pPg);.  }.  page
35290 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
352a0 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50  pPager);..  *ppP
352b0 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  age = 0;.  retur
352c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
352d0 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
352e0 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
352f0 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
35300 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
35310 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
35320 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
35330 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
35340 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
35350 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
35360 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 0a   not in cache. .
35370 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
35380 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
35390 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  .  The differenc
353a0 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
353b0 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71  outine.** and sq
353c0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
353d0 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77  is that _get() w
353e0 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69  ill go to the di
353f0 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69  sk and read.** i
35400 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68  n the page if th
35410 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
35420 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20  ready in cache. 
35430 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
35440 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
35450 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
35460 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20   in cache or if 
35470 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72  a disk I/O error
35480 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61   .** has ever ha
35490 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67  ppened..*/.DbPag
354a0 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c  e *sqlite3PagerL
354b0 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
354c0 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
354d0 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68  .  sqlite3_pcach
354e0 65 5f 70 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  e_page *pPage;. 
354f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
35500 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
35510 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73  pgno!=0 );.  ass
35520 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50 43  ert( pPager->pPC
35530 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 70 50 61  ache!=0 );.  pPa
35540 67 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  ge = sqlite3Pcac
35550 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
35560 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30  pPCache, pgno, 0
35570 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
35580 67 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  ge==0 || pPager-
35590 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f  >hasHeldSharedLo
355a0 63 6b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ck );.  if( pPag
355b0 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
355c0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
355d0 33 50 63 61 63 68 65 46 65 74 63 68 46 69 6e 69  3PcacheFetchFini
355e0 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  sh(pPager->pPCac
355f0 68 65 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 29  he, pgno, pPage)
35600 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
35610 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72 65  se a page refere
35620 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  nce..**.** If th
35630 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
35640 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
35650 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c  ge drop to zero,
35660 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67   then the.** pag
35670 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
35680 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65  e LRU list.  Whe
35690 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  n all references
356a0 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a   to all pages.**
356b0 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61   are released, a
356c0 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
356d0 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
356e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
356f0 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  .** removed..*/.
35700 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
35710 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 44 62  rUnrefNotNull(Db
35720 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61  Page *pPg){.  Pa
35730 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 61  ger *pPager;.  a
35740 73 73 65 72 74 28 20 70 50 67 21 3d 30 20 29 3b  ssert( pPg!=0 );
35750 0a 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d  .  pPager = pPg-
35760 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70  >pPager;.  if( p
35770 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
35780 52 5f 4d 4d 41 50 20 29 7b 0a 20 20 20 20 70 61  R_MMAP ){.    pa
35790 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67  gerReleaseMapPag
357a0 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b  e(pPg);.  }else{
357b0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
357c0 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
357d0 20 20 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63    }.  pagerUnloc
357e0 6b 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72  kIfUnused(pPager
357f0 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  );.}.void sqlite
35800 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61  3PagerUnref(DbPa
35810 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  ge *pPg){.  if( 
35820 70 50 67 20 29 20 73 71 6c 69 74 65 33 50 61 67  pPg ) sqlite3Pag
35830 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70  erUnrefNotNull(p
35840 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Pg);.}../*.** Th
35850 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
35860 61 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74 61  alled at the sta
35870 72 74 20 6f 66 20 65 76 65 72 79 20 77 72 69 74  rt of every writ
35880 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
35890 2a 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72  * There must alr
358a0 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56  eady be a RESERV
358b0 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
358c0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
358d0 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68  base .** file wh
358e0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
358f0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
35900 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
35910 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
35920 20 70 50 61 67 65 72 20 61 6e 64 20 77 72 69 74   pPager and writ
35930 65 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  e a journal head
35940 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61  er.** to the sta
35950 72 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65  rt of it. If the
35960 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61  re are active sa
35970 76 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74  vepoints, open t
35980 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a  he sub-journal.*
35990 2a 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20  * as well. This 
359a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
359b0 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a   used when the j
359c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62  ournal file is b
359d0 65 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20  eing .** opened 
359e0 74 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62  to write a rollb
359f0 61 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72  ack log for a tr
35a00 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
35a10 20 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68   not used .** wh
35a20 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74  en opening a hot
35a30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
35a40 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a   roll it back..*
35a50 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
35a60 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65  nal file is alre
35a70 61 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20  ady open (as it 
35a80 6d 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73  may be in exclus
35a90 69 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68  ive mode),.** th
35aa0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
35ab0 20 6a 75 73 74 20 77 72 69 74 65 73 20 61 20 6a   just writes a j
35ac0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
35ad0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
35ae0 65 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65  e.** already ope
35af0 6e 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57  n file. .**.** W
35b00 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
35b10 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
35b20 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73  s opened by this
35b30 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a   function, the.*
35b40 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  * Pager.pInJourn
35b50 61 6c 20 62 69 74 76 65 63 20 73 74 72 75 63 74  al bitvec struct
35b60 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
35b70 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
35b80 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
35b90 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
35ba0 73 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c  sful. Otherwise,
35bb0 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
35bc0 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20  TE_NOMEM if the 
35bd0 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63  attempt to alloc
35be0 61 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  ate Pager.pInJou
35bf0 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a  rnal fails, or .
35c00 2a 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  ** an IO error c
35c10 6f 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f  ode if opening o
35c20 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f  r writing the jo
35c30 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73  urnal file fails
35c40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
35c50 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
35c60 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
35c70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
35c80 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
35c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ca0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
35cb0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  /.  sqlite3_vfs 
35cc0 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
35cd0 50 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f  Pager->pVfs;   /
35ce0 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
35cf0 20 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a   vfs pointer */.
35d00 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
35d10 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
35d20 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
35d30 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  ;.  assert( asse
35d40 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
35d50 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
35d60 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
35d70 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a  ournal==0 );.  .
35d80 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20    /* If already 
35d90 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
35da0 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  te, this functio
35db0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42  n is a no-op.  B
35dc0 75 74 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f  ut on.  ** the o
35dd0 74 68 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20  ther hand, this 
35de0 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
35df0 20 63 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72   called if we ar
35e00 65 20 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a  e already in.  *
35e10 2a 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  * an error state
35e20 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  . */.  if( NEVER
35e30 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65  (pPager->errCode
35e40 29 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65  ) ) return pPage
35e50 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 69  r->errCode;..  i
35e60 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  f( !pagerUseWal(
35e70 70 50 61 67 65 72 29 20 26 26 20 70 50 61 67 65  pPager) && pPage
35e80 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
35e90 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
35ea0 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 70 50 61  E_OFF ){.    pPa
35eb0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
35ec0 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
35ed0 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62  reate(pPager->db
35ee0 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Size);.    if( p
35ef0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
35f00 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  l==0 ){.      re
35f10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
35f20 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
35f30 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  .    /* Open the
35f40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
35f50 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
35f60 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20  dy open. */.    
35f70 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
35f80 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
35f90 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
35fa0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
35fb0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
35fc0 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ORY ){.        s
35fd0 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
35fe0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
35ff0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
36000 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67          int flag
36010 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
36020 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
36030 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20  _OPEN_CREATE;.  
36040 20 20 20 20 20 20 69 6e 74 20 6e 53 70 69 6c 6c        int nSpill
36050 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  ;..#if SQLITE_EN
36060 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43  ABLE_DATA_PROTEC
36070 54 49 4f 4e 0a 20 20 20 20 20 20 20 20 66 6c 61  TION.        fla
36080 67 73 20 7c 3d 20 28 70 50 61 67 65 72 2d 3e 76  gs |= (pPager->v
36090 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
360a0 50 45 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54 49  PEN_FILEPROTECTI
360b0 4f 4e 5f 4d 41 53 4b 29 3b 0a 23 65 6e 64 69 66  ON_MASK);.#endif
360c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
360d0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
360e0 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73  .          flags
360f0 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e   |= (SQLITE_OPEN
36100 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53  _DELETEONCLOSE|S
36110 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
36120 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20  JOURNAL);.      
36130 20 20 20 20 6e 53 70 69 6c 6c 20 3d 20 73 71 6c      nSpill = sql
36140 69 74 65 33 43 6f 6e 66 69 67 2e 6e 53 74 6d 74  ite3Config.nStmt
36150 53 70 69 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d  Spill;.        }
36160 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
36170 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
36180 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
36190 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 53 70  L;.          nSp
361a0 69 6c 6c 20 3d 20 6a 72 6e 6c 42 75 66 66 65 72  ill = jrnlBuffer
361b0 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
361c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
361d0 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 65    .        /* Ve
361e0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64 61  rify that the da
361f0 74 61 62 61 73 65 20 73 74 69 6c 6c 20 68 61 73  tabase still has
36200 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61   the same name a
36210 73 20 69 74 20 64 69 64 20 77 68 65 6e 0a 20 20  s it did when.  
36220 20 20 20 20 20 20 2a 2a 20 69 74 20 77 61 73 20        ** it was 
36230 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65  originally opene
36240 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  d. */.        rc
36250 20 3d 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d   = databaseIsUnm
36260 6f 76 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20  oved(pPager);.  
36270 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
36280 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36290 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
362a0 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 20 28 0a 20  3JournalOpen (. 
362b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56 66               pVf
362c0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
362d0 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
362e0 2c 20 66 6c 61 67 73 2c 20 6e 53 70 69 6c 6c 0a  , flags, nSpill.
362f0 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
36300 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
36310 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
36320 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
36330 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
36340 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  ) );.    }.  .  
36350 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
36360 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
36370 68 65 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f  header to the jo
36380 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f  urnal file and o
36390 70 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  pen .    ** the 
363a0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  sub-journal if n
363b0 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f  ecessary..    */
363c0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
363d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
363e0 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69  /* TODO: Check i
363f0 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61  f all of these a
36400 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72  re really requir
36410 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61  ed. */.      pPa
36420 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
36430 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
36440 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
36450 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61     pPager->setMa
36460 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ster = 0;.      
36470 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
36480 64 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  dr = 0;.      rc
36490 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
364a0 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
364b0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  }.  }..  if( rc!
364c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
364d0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
364e0 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
364f0 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  InJournal);.    
36500 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
36510 61 6c 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  al = 0;.  }else{
36520 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
36530 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
36540 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
36550 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
36560 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57  eState = PAGER_W
36570 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a  RITER_CACHEMOD;.
36580 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
36590 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  ;.}../*.** Begin
365a0 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
365b0 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63  tion on the spec
365c0 69 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65  ified pager obje
365d0 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69  ct. If a .** wri
365e0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  te-transaction h
365f0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
36600 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e  opened, this fun
36610 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
36620 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
36630 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69  xFlag argument i
36640 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 63  s false, then ac
36650 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 20 61  quire at least a
36660 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63   RESERVED.** loc
36670 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
36680 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61  e file. If exFla
36690 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  g is true, then 
366a0 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74  acquire at least
366b0 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45  .** an EXCLUSIVE
366c0 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61   lock. If such a
366d0 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79   lock is already
366e0 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e   held, no lockin
366f0 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  g .** functions 
36700 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a  need be called..
36710 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62  **.** If the sub
36720 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65  jInMemory argume
36730 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  nt is non-zero, 
36740 74 68 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75  then any sub-jou
36750 72 6e 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77  rnal opened.** w
36760 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
36770 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f  action will be o
36780 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
36790 65 6d 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73  emory file. This
367a0 0a 2a 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63  .** has no effec
367b0 74 20 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75  t if the sub-jou
367c0 72 6e 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20  rnal is already 
367d0 6f 70 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61  opened (as it ma
367e0 79 20 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e  y be when.** run
367f0 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
36800 65 20 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68  e mode) or if th
36810 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f  e transaction do
36820 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
36830 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  .** sub-journal.
36840 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65   If the subjInMe
36850 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73  mory argument is
36860 20 7a 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20   zero, then any 
36870 72 65 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d  required.** sub-
36880 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65  journal is imple
36890 6d 65 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79  mented in-memory
368a0 20 69 66 20 70 50 61 67 65 72 20 69 73 20 61 6e   if pPager is an
368b0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
368c0 61 73 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e  ase, .** or usin
368d0 67 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  g a temporary fi
368e0 6c 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  le otherwise..*/
368f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
36900 72 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50  rBegin(Pager *pP
36910 61 67 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67  ager, int exFlag
36920 2c 20 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f  , int subjInMemo
36930 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ry){.  int rc = 
36940 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
36950 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
36960 65 20 29 20 72 65 74 75 72 6e 20 70 50 61 67 65  e ) return pPage
36970 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 73  r->errCode;.  as
36980 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
36990 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44  tate>=PAGER_READ
369a0 45 52 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53  ER && pPager->eS
369b0 74 61 74 65 3c 50 41 47 45 52 5f 45 52 52 4f 52  tate<PAGER_ERROR
369c0 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75   );.  pPager->su
369d0 62 6a 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38  bjInMemory = (u8
369e0 29 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a  )subjInMemory;..
369f0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 50 61    if( ALWAYS(pPa
36a00 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
36a10 45 52 5f 52 45 41 44 45 52 29 20 29 7b 0a 20 20  ER_READER) ){.  
36a20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
36a30 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
36a40 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65  );..    if( page
36a50 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
36a60 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
36a70 68 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e 66  he pager is conf
36a80 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c 6f  igured to use lo
36a90 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
36aa0 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20  sive, and an.   
36ab0 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20     ** exclusive 
36ac0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
36ad0 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  base is not alre
36ae0 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e  ady held, obtain
36af0 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a   it now..      *
36b00 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  /.      if( pPag
36b10 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
36b20 65 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45  e && sqlite3WalE
36b30 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
36b40 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29  ger->pWal, -1) )
36b50 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
36b60 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
36b70 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
36b80 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  K);.        if( 
36b90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
36ba0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
36bb0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
36bc0 20 20 20 20 20 20 20 20 28 76 6f 69 64 29 73 71          (void)sq
36bd0 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76  lite3WalExclusiv
36be0 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57  eMode(pPager->pW
36bf0 61 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 1);.      }.
36c00 0a 20 20 20 20 20 20 2f 2a 20 47 72 61 62 20 74  .      /* Grab t
36c10 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
36c20 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49   the log file. I
36c30 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 75 70  f successful, up
36c40 67 72 61 64 65 20 74 6f 0a 20 20 20 20 20 20 2a  grade to.      *
36c50 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  * PAGER_RESERVED
36c60 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73   state. Otherwis
36c70 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  e, return an err
36c80 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
36c90 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20  aller..      ** 
36ca0 54 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  The busy-handler
36cb0 20 69 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20   is not invoked 
36cc0 69 66 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65  if another conne
36cd0 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20  ction already.  
36ce0 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65      ** holds the
36cf0 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20   write-lock. If 
36d00 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 75 70  possible, the up
36d10 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 63  per layer will c
36d20 61 6c 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f  all it..      */
36d30 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
36d40 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65  te3WalBeginWrite
36d50 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
36d60 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d  er->pWal);.    }
36d70 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  else{.      /* O
36d80 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44  btain a RESERVED
36d90 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
36da0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
36db0 68 65 20 65 78 46 6c 61 67 20 70 61 72 61 6d 65  he exFlag parame
36dc0 74 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ter.      ** is 
36dd0 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64  true, then immed
36de0 69 61 74 65 6c 79 20 75 70 67 72 61 64 65 20 74  iately upgrade t
36df0 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  his to an EXCLUS
36e00 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20  IVE lock. The.  
36e10 20 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64      ** busy-hand
36e20 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e  ler callback can
36e30 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 75 70   be used when up
36e40 67 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45  grading to the E
36e50 58 43 4c 55 53 49 56 45 0a 20 20 20 20 20 20 2a  XCLUSIVE.      *
36e60 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20  * lock, but not 
36e70 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74  when obtaining t
36e80 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
36e90 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
36ea0 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
36eb0 62 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56  b(pPager, RESERV
36ec0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
36ed0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
36ee0 4b 20 26 26 20 65 78 46 6c 61 67 20 29 7b 0a 20  K && exFlag ){. 
36ef0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
36f00 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
36f10 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
36f20 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
36f30 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
36f40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
36f50 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20        /* Change 
36f60 74 6f 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  to WRITER_LOCKED
36f70 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a   state..      **
36f80 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f  .      ** WAL mo
36f90 64 65 20 73 65 74 73 20 50 61 67 65 72 2e 65 53  de sets Pager.eS
36fa0 74 61 74 65 20 74 6f 20 50 41 47 45 52 5f 57 52  tate to PAGER_WR
36fb0 49 54 45 52 5f 4c 4f 43 4b 45 44 20 6f 72 20 43  ITER_LOCKED or C
36fc0 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a  ACHEMOD.      **
36fd0 20 77 68 65 6e 20 69 74 20 68 61 73 20 61 6e 20   when it has an 
36fe0 6f 70 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  open transaction
36ff0 2c 20 62 75 74 20 6e 65 76 65 72 20 74 6f 20 44  , but never to D
37000 42 4d 4f 44 20 6f 72 20 46 49 4e 49 53 48 45 44  BMOD or FINISHED
37010 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  ..      ** This 
37020 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 74 68  is because in th
37030 6f 73 65 20 73 74 61 74 65 73 20 74 68 65 20 63  ose states the c
37040 6f 64 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  ode to roll back
37050 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20   savepoint .    
37060 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
37070 73 20 6d 61 79 20 63 6f 70 79 20 64 61 74 61 20  s may copy data 
37080 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
37090 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 61  rnal into the da
370a0 74 61 62 61 73 65 20 0a 20 20 20 20 20 20 2a 2a  tabase .      **
370b0 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 20 61 73   file as well as
370c0 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20 63   into the page c
370d0 61 63 68 65 2e 20 57 68 69 63 68 20 77 6f 75 6c  ache. Which woul
370e0 64 20 62 65 20 69 6e 63 6f 72 72 65 63 74 20 69  d be incorrect i
370f0 6e 20 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20  n .      ** WAL 
37100 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  mode..      */. 
37110 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74       pPager->eSt
37120 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54  ate = PAGER_WRIT
37130 45 52 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20  ER_LOCKED;.     
37140 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53   pPager->dbHintS
37150 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
37160 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Size;.      pPag
37170 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
37180 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
37190 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
371a0 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67  bOrigSize = pPag
371b0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
371c0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
371d0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  lOff = 0;.    }.
371e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
371f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
37200 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
37210 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
37220 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
37230 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
37240 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
37250 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
37260 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 73  ;.    assert( as
37270 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
37280 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d 0a  (pPager) );.  }.
37290 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
372a0 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e  TRANSACTION %d\n
372b0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
372c0 72 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  r)));.  return r
372d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
372e0 65 20 70 61 67 65 20 70 50 67 20 6f 6e 74 6f 20  e page pPg onto 
372f0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72  the end of the r
37300 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
37310 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
37320 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 70  E_NOINLINE int p
37330 61 67 65 72 41 64 64 50 61 67 65 54 6f 52 6f 6c  agerAddPageToRol
37340 6c 62 61 63 6b 4a 6f 75 72 6e 61 6c 28 50 67 48  lbackJournal(PgH
37350 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
37360 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
37370 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
37380 63 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a  c;.  u32 cksum;.
37390 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
373a0 20 20 69 36 34 20 69 4f 66 66 20 3d 20 70 50 61    i64 iOff = pPa
373b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
373c0 0a 0a 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64  ..  /* We should
373d0 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20   never write to 
373e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
373f0 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20   the page that. 
37400 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
37410 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e   database locks.
37420 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
37430 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a  assert verifies.
37440 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20    ** that we do 
37450 6e 6f 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  not. */.  assert
37460 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47  ( pPg->pgno!=PAG
37470 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
37480 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  r) );..  assert(
37490 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
374a0 48 64 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  Hdr<=pPager->jou
374b0 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 43 4f 44  rnalOff );.  COD
374c0 45 43 32 28 70 50 61 67 65 72 2c 20 70 50 67 2d  EC2(pPager, pPg-
374d0 3e 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e  >pData, pPg->pgn
374e0 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 7, return SQL
374f0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20  ITE_NOMEM_BKPT, 
37500 70 44 61 74 61 32 29 3b 0a 20 20 63 6b 73 75 6d  pData2);.  cksum
37510 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70   = pager_cksum(p
37520 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74  Pager, (u8*)pDat
37530 61 32 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20  a2);..  /* Even 
37540 69 66 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b  if an IO or disk
37550 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75 72  full error occur
37560 73 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c  s while journall
37570 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  ing the.  ** pag
37580 65 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61  e in the block a
37590 62 6f 76 65 2c 20 73 65 74 20 74 68 65 20 6e 65  bove, set the ne
375a0 65 64 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f 72  ed-sync flag for
375b0 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20   the page..  ** 
375c0 4f 74 68 65 72 77 69 73 65 2c 20 77 68 65 6e 20  Otherwise, when 
375d0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
375e0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
375f0 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20 2a  the logic in.  *
37600 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  * playback_one_p
37610 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b  age() will think
37620 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
37630 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f  eeds to be resto
37640 72 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  red.  ** in the 
37650 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
37660 6e 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f  nd if an IO erro
37670 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64  r occurs while d
37680 6f 69 6e 67 20 73 6f 2c 0a 20 20 2a 2a 20 74 68  oing so,.  ** th
37690 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61  en corruption ma
376a0 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 2a 2f 0a 20  y follow..  */. 
376b0 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
376c0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
376d0 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62  .  rc = write32b
376e0 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
376f0 20 69 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f   iOff, pPg->pgno
37700 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
37710 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
37720 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
37730 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
37740 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70  ->jfd, pData2, p
37750 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
37760 20 69 4f 66 66 2b 34 29 3b 0a 20 20 69 66 28 20   iOff+4);.  if( 
37770 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
37780 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
37790 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
377a0 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4f 66 66 2b  ager->jfd, iOff+
377b0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
377c0 2b 34 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 69 66  +4, cksum);.  if
377d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
377e0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
377f0 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25  IOTRACE(("JOUT %
37800 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  p %d %lld %d\n",
37810 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
37820 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  no, .           
37830 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
37840 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ff, pPager->page
37850 53 69 7a 65 29 29 3b 0a 20 20 50 41 47 45 52 5f  Size));.  PAGER_
37860 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
37870 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29  er_writej_count)
37880 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
37890 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  "JOURNAL %d page
378a0 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20   %d needSync=%d 
378b0 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
378c0 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
378d0 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
378e0 2c 20 0a 20 20 20 20 20 20 20 28 28 70 50 67 2d  , .       ((pPg-
378f0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
37900 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61  D_SYNC)?1:0), pa
37910 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
37920 29 29 29 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e  )));..  pPager->
37930 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 38 20  journalOff += 8 
37940 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  + pPager->pageSi
37950 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52  ze;.  pPager->nR
37960 65 63 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20  ec++;.  assert( 
37970 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
37980 61 6c 21 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  al!=0 );.  rc = 
37990 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
379a0 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
379b0 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  nal, pPg->pgno);
379c0 0a 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d  .  testcase( rc=
379d0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
379e0 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
379f0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  QLITE_OK || rc==
37a00 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
37a10 20 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76    rc |= addToSav
37a20 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
37a30 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
37a40 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
37a50 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d  SQLITE_OK || rc=
37a60 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
37a70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
37a80 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69  ./*.** Mark a si
37a90 6e 67 6c 65 20 64 61 74 61 20 70 61 67 65 20 61  ngle data page a
37aa0 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 65  s writeable. The
37ab0 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
37ac0 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61   into the .** ma
37ad0 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75  in journal or su
37ae0 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65 71  b-journal as req
37af0 75 69 72 65 64 2e 20 49 66 20 74 68 65 20 70 61  uired. If the pa
37b00 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
37b10 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65  to.** one of the
37b20 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20 63   journals, the c
37b30 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
37b40 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 0a   is set in the .
37b50 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  ** Pager.pInJour
37b60 6e 61 6c 20 62 69 74 76 65 63 20 61 6e 64 20 74  nal bitvec and t
37b70 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
37b80 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62  t.pInSavepoint b
37b90 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79  itvecs.** of any
37ba0 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
37bb0 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   as appropriate.
37bc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
37bd0 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72  ager_write(PgHdr
37be0 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
37bf0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
37c00 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
37c10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
37c20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
37c30 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 75 6e  is not called un
37c40 6c 65 73 73 20 61 20 77 72 69 74 65 2d 74 72 61  less a write-tra
37c50 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
37c60 65 61 64 79 20 0a 20 20 2a 2a 20 62 65 65 6e 20  eady .  ** been 
37c70 73 74 61 72 74 65 64 2e 20 54 68 65 20 6a 6f 75  started. The jou
37c80 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72  rnal file may or
37c90 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e   may not be open
37ca0 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a   at this point..
37cb0 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72    ** It is never
37cc0 20 63 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 45   called in the E
37cd0 52 52 4f 52 20 73 74 61 74 65 2e 0a 20 20 2a 2f  RROR state..  */
37ce0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
37cf0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
37d00 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 0a 20  _WRITER_LOCKED. 
37d10 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
37d20 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
37d30 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
37d40 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
37d50 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
37d60 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b  RITER_DBMOD.  );
37d70 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72  .  assert( asser
37d80 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
37d90 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
37da0 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
37db0 64 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  de==0 );.  asser
37dc0 74 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  t( pPager->readO
37dd0 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 43 48 45 43  nly==0 );.  CHEC
37de0 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20  K_PAGE(pPg);..  
37df0 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  /* The journal f
37e00 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ile needs to be 
37e10 6f 70 65 6e 65 64 2e 20 48 69 67 68 65 72 20 6c  opened. Higher l
37e20 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20 68 61  evel routines ha
37e30 76 65 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ve already.  ** 
37e40 6f 62 74 61 69 6e 65 64 20 74 68 65 20 6e 65 63  obtained the nec
37e50 65 73 73 61 72 79 20 6c 6f 63 6b 73 20 74 6f 20  essary locks to 
37e60 62 65 67 69 6e 20 74 68 65 20 77 72 69 74 65 2d  begin the write-
37e70 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74  transaction, but
37e80 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61   the.  ** rollba
37e90 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  ck journal might
37ea0 20 6e 6f 74 20 79 65 74 20 62 65 20 6f 70 65 6e   not yet be open
37eb0 2e 20 4f 70 65 6e 20 69 74 20 6e 6f 77 20 69 66  . Open it now if
37ec0 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
37ed0 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
37ee0 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65  s is done before
37ef0 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
37f00 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
37f10 29 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 0a  ) on the page. .
37f20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
37f30 69 66 20 69 74 20 77 65 72 65 20 64 6f 6e 65 20  if it were done 
37f40 61 66 74 65 72 20 63 61 6c 6c 69 6e 67 20 73 71  after calling sq
37f50 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
37f60 69 72 74 79 28 29 2c 20 74 68 65 6e 0a 20 20 2a  irty(), then.  *
37f70 2a 20 61 6e 20 65 72 72 6f 72 20 6d 69 67 68 74  * an error might
37f80 20 6f 63 63 75 72 20 61 6e 64 20 74 68 65 20 70   occur and the p
37f90 61 67 65 72 20 77 6f 75 6c 64 20 65 6e 64 20 75  ager would end u
37fa0 70 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b  p in WRITER_LOCK
37fb0 45 44 20 73 74 61 74 65 0a 20 20 2a 2a 20 77 69  ED state.  ** wi
37fc0 74 68 20 70 61 67 65 73 20 6d 61 72 6b 65 64 20  th pages marked 
37fd0 61 73 20 64 69 72 74 79 20 69 6e 20 74 68 65 20  as dirty in the 
37fe0 63 61 63 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  cache..  */.  if
37ff0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
38000 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  ==PAGER_WRITER_L
38010 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 72 63 20  OCKED ){.    rc 
38020 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
38030 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
38040 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
38050 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
38060 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
38070 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
38080 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
38090 45 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72 74  EMOD );.  assert
380a0 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  ( assert_pager_s
380b0 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a  tate(pPager) );.
380c0 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70  .  /* Mark the p
380d0 61 67 65 20 74 68 61 74 20 69 73 20 61 62 6f 75  age that is abou
380e0 74 20 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64  t to be modified
380f0 20 61 73 20 64 69 72 74 79 2e 20 2a 2f 0a 20 20   as dirty. */.  
38100 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
38110 65 44 69 72 74 79 28 70 50 67 29 3b 0a 0a 20 20  eDirty(pPg);..  
38120 2f 2a 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b  /* If a rollback
38130 20 6a 6f 75 72 6e 61 6c 20 69 73 20 69 6e 20 75   journal is in u
38140 73 65 2c 20 74 68 65 6d 20 6d 61 6b 65 20 73 75  se, them make su
38150 72 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74  re the page that
38160 20 69 73 20 61 62 6f 75 74 0a 20 20 2a 2a 20 74   is about.  ** t
38170 6f 20 63 68 61 6e 67 65 20 69 73 20 69 6e 20 74  o change is in t
38180 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
38190 6e 61 6c 2c 20 6f 72 20 69 66 20 74 68 65 20 70  nal, or if the p
381a0 61 67 65 20 69 73 20 61 20 6e 65 77 20 70 61 67  age is a new pag
381b0 65 20 6f 66 66 0a 20 20 2a 2a 20 74 68 65 6e 20  e off.  ** then 
381c0 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2c  end of the file,
381d0 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73   make sure it is
381e0 20 6d 61 72 6b 65 64 20 61 73 20 50 47 48 44 52   marked as PGHDR
381f0 5f 4e 45 45 44 5f 53 59 4e 43 2e 0a 20 20 2a 2f  _NEED_SYNC..  */
38200 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67  .  assert( (pPag
38210 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->pInJournal!=
38220 30 29 20 3d 3d 20 69 73 4f 70 65 6e 28 70 50 61  0) == isOpen(pPa
38230 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 69  ger->jfd) );.  i
38240 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  f( pPager->pInJo
38250 75 72 6e 61 6c 21 3d 30 0a 20 20 20 26 26 20 73  urnal!=0.   && s
38260 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
38270 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 72 2d 3e  NotNull(pPager->
38280 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d  pInJournal, pPg-
38290 3e 70 67 6e 6f 29 3d 3d 30 0a 20 20 29 7b 0a 20  >pgno)==0.  ){. 
382a0 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72     assert( pager
382b0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
382c0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67  0 );.    if( pPg
382d0 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
382e0 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20  dbOrigSize ){.  
382f0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 41 64      rc = pagerAd
38300 64 50 61 67 65 54 6f 52 6f 6c 6c 62 61 63 6b 4a  dPageToRollbackJ
38310 6f 75 72 6e 61 6c 28 70 50 67 29 3b 0a 20 20 20  ournal(pPg);.   
38320 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
38330 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
38340 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
38350 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
38360 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
38370 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57 52  eState!=PAGER_WR
38380 49 54 45 52 5f 44 42 4d 4f 44 20 29 7b 0a 20 20  ITER_DBMOD ){.  
38390 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73        pPg->flags
383a0 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53   |= PGHDR_NEED_S
383b0 59 4e 43 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  YNC;.      }.   
383c0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
383d0 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25  APPEND %d page %
383e0 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
383f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
38400 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
38410 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20   pPg->pgno,.    
38420 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e           ((pPg->
38430 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
38440 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20  _SYNC)?1:0)));. 
38450 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
38460 68 65 20 50 47 48 44 52 5f 44 49 52 54 59 20 62  he PGHDR_DIRTY b
38470 69 74 20 69 73 20 73 65 74 20 61 62 6f 76 65 20  it is set above 
38480 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 77 61  when the page wa
38490 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 64  s added to the d
384a0 69 72 74 79 2d 6c 69 73 74 0a 20 20 2a 2a 20 61  irty-list.  ** a
384b0 6e 64 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  nd before writin
384c0 67 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  g the page into 
384d0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
384e0 72 6e 61 6c 2e 20 20 57 61 69 74 20 75 6e 74 69  rnal.  Wait unti
384f0 6c 20 6e 6f 77 2c 0a 20 20 2a 2a 20 61 66 74 65  l now,.  ** afte
38500 72 20 74 68 65 20 70 61 67 65 20 68 61 73 20 62  r the page has b
38510 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  een successfully
38520 20 6a 6f 75 72 6e 61 6c 6c 65 64 2c 20 62 65 66   journalled, bef
38530 6f 72 65 20 73 65 74 74 69 6e 67 20 74 68 65 0a  ore setting the.
38540 20 20 2a 2a 20 50 47 48 44 52 5f 57 52 49 54 45    ** PGHDR_WRITE
38550 41 42 4c 45 20 62 69 74 20 74 68 61 74 20 69 6e  ABLE bit that in
38560 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
38570 20 70 61 67 65 20 63 61 6e 20 62 65 20 73 61 66   page can be saf
38580 65 6c 79 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20  ely modified..  
38590 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  */.  pPg->flags 
385a0 7c 3d 20 50 47 48 44 52 5f 57 52 49 54 45 41 42  |= PGHDR_WRITEAB
385b0 4c 45 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 74  LE;.  .  /* If t
385c0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
385d0 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64  rnal is open and
385e0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
385f0 20 69 6e 20 69 74 2c 0a 20 20 2a 2a 20 74 68 65   in it,.  ** the
38600 6e 20 77 72 69 74 65 20 74 68 65 20 70 61 67 65  n write the page
38610 20 69 6e 74 6f 20 74 68 65 20 73 74 61 74 65 6d   into the statem
38620 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  ent journal..  *
38630 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
38640 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 7b 0a  nSavepoint>0 ){.
38650 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72      rc = subjour
38660 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69 72 65  nalPageIfRequire
38670 64 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f  d(pPg);.  }..  /
38680 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74  * Update the dat
38690 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72  abase size and r
386a0 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 69 66 28 20  eturn. */.  if( 
386b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70  pPager->dbSize<p
386c0 50 67 2d 3e 70 67