/ Hex Artifact Content
Login

Artifact 2e68df46d4086027cb6b527d47a6dedbf1a6b7ec:


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 61 72 69 6c 79 20 77 69 74 68 6f 75 74  bitarily without
0d90: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6c   effecting the l
0da0: 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65 6e  ogical equivalen
0db0: 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74  ce.** of the dat
0dc0: 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 37  abase..** .** (7
0dd0: 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20 69  ) At any time, i
0de0: 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69 6e  f any subset, in
0df0: 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70 74  cluding the empt
0e00: 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74 6f  y set and the to
0e10: 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20 20  tal set,.**     
0e20: 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  of the unsynced 
0e30: 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f 6c  changes to a rol
0e40: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 72  lback journal ar
0e50: 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74 68  e removed and th
0e60: 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  e .**     journa
0e70: 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l is rolled back
0e80: 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20  , the resulting 
0e90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
0ea0: 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 0a 2a 2a  ll be logical.**
0eb0: 20 20 20 20 20 65 71 75 69 76 61 6c 65 6e 74 20       equivalent 
0ec0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
0ed0: 66 69 6c 65 20 61 74 20 74 68 65 20 62 65 67 69  file at the begi
0ee0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0ef0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
0f00: 20 28 38 29 20 57 68 65 6e 20 61 20 74 72 61 6e   (8) When a tran
0f10: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
0f20: 64 20 62 61 63 6b 2c 20 74 68 65 20 78 54 72 75  d back, the xTru
0f30: 6e 63 61 74 65 20 6d 65 74 68 6f 64 20 6f 66 20  ncate method of 
0f40: 74 68 65 20 56 46 53 0a 2a 2a 20 20 20 20 20 69  the VFS.**     i
0f50: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 73 74  s called to rest
0f60: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
0f70: 20 66 69 6c 65 20 74 6f 20 74 68 65 20 73 61 6d   file to the sam
0f80: 65 20 73 69 7a 65 20 69 74 20 77 61 73 20 61 74  e size it was at
0f90: 0a 2a 2a 20 20 20 20 20 74 68 65 20 62 65 67 69  .**     the begi
0fa0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 72 61  nning of the tra
0fb0: 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49 6e 20 73  nsaction.  (In s
0fc0: 6f 6d 65 20 56 46 53 65 73 2c 20 74 68 65 20 78  ome VFSes, the x
0fd0: 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20 20 20 20  Truncate.**     
0fe0: 6d 65 74 68 6f 64 20 69 73 20 61 20 6e 6f 2d 6f  method is a no-o
0ff0: 70 2c 20 62 75 74 20 74 68 61 74 20 64 6f 65 73  p, but that does
1000: 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
1010: 66 61 63 74 20 74 68 65 20 53 51 4c 69 74 65 20  fact the SQLite 
1020: 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69 6e 76 6f  will.**     invo
1030: 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a 2a 20 28  ke it.).** .** (
1040: 39 29 20 57 68 65 6e 65 76 65 72 20 74 68 65 20  9) Whenever the 
1050: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1060: 20 6d 6f 64 69 66 69 65 64 2c 20 61 74 20 6c 65   modified, at le
1070: 61 73 74 20 6f 6e 65 20 62 69 74 20 69 6e 20 74  ast one bit in t
1080: 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20 20 20 20  he range.**     
1090: 6f 66 20 62 79 74 65 73 20 66 72 6f 6d 20 32 34  of bytes from 24
10a0: 20 74 68 72 6f 75 67 68 20 33 39 20 69 6e 63 6c   through 39 incl
10b0: 75 73 69 76 65 20 77 69 6c 6c 20 62 65 20 63 68  usive will be ch
10c0: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 72  anged prior to r
10d0: 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20 20 20 20  eleasing.**     
10e0: 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
10f0: 63 6b 2c 20 74 68 75 73 20 73 69 67 6e 61 6c 69  ck, thus signali
1100: 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ng other connect
1110: 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73 61 6d 65  ions on the same
1120: 0a 2a 2a 20 20 20 20 20 64 61 74 61 62 61 73 65  .**     database
1130: 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 20   to flush their 
1140: 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 31  caches..**.** (1
1150: 30 29 20 54 68 65 20 70 61 74 74 65 72 6e 20 6f  0) The pattern o
1160: 66 20 62 69 74 73 20 69 6e 20 62 79 74 65 73 20  f bits in bytes 
1170: 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 73 68  24 through 39 sh
1180: 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61 74 20 69  all not repeat i
1190: 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 74  n less.**      t
11a0: 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69 6f 6e 20  han one billion 
11b0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a 2a 2a  transactions..**
11c0: 0a 2a 2a 20 28 31 31 29 20 41 20 64 61 74 61 62  .** (11) A datab
11d0: 61 73 65 20 66 69 6c 65 20 69 73 20 77 65 6c 6c  ase file is well
11e0: 2d 66 6f 72 6d 65 64 20 61 74 20 74 68 65 20 62  -formed at the b
11f0: 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 61 74 20  eginning and at 
1200: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 0a 2a  the conclusion.*
1210: 2a 20 20 20 20 20 20 6f 66 20 65 76 65 72 79 20  *      of every 
1220: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1230: 2a 2a 20 28 31 32 29 20 41 6e 20 45 58 43 4c 55  ** (12) An EXCLU
1240: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 68 65 6c  SIVE lock is hel
1250: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1260: 65 20 66 69 6c 65 20 77 68 65 6e 20 77 72 69 74  e file when writ
1270: 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20 20 20 74  ing to.**      t
1280: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1290: 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20 41 20 53  ..**.** (13) A S
12a0: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 68 65  HARED lock is he
12b0: 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
12c0: 73 65 20 66 69 6c 65 20 77 68 69 6c 65 20 72 65  se file while re
12d0: 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20 20 20 20  ading any.**    
12e0: 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 6f 66    content out of
12f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1300: 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  le..**.*********
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 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61  *****/../*.** Ma
1360: 63 72 6f 73 20 66 6f 72 20 74 72 6f 75 62 6c 65  cros for trouble
1370: 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61  shooting.  Norma
1380: 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a  lly turned off.*
1390: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
13a0: 74 65 33 50 61 67 65 72 54 72 61 63 65 3d 31 3b  te3PagerTrace=1;
13b0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
13c0: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
13d0: 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65  define sqlite3De
13e0: 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66  bugPrintf printf
13f0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52  .#define PAGERTR
1400: 41 43 45 28 58 29 20 20 20 20 20 69 66 28 20 73  ACE(X)     if( s
1410: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
1420: 20 29 7b 20 73 71 6c 69 74 65 33 44 65 62 75 67   ){ sqlite3Debug
1430: 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23 65 6c 73  Printf X; }.#els
1440: 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  e.#define PAGERT
1450: 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a  RACE(X).#endif..
1460: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1470: 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f 73 20 61  ing two macros a
1480: 72 65 20 75 73 65 64 20 77 69 74 68 69 6e 20 74  re used within t
1490: 68 65 20 50 41 47 45 52 54 52 41 43 45 28 29 20  he PAGERTRACE() 
14a0: 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20  macros above.** 
14b0: 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c  to print out fil
14c0: 65 2d 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a  e-descriptors. .
14d0: 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20  **.** PAGERID() 
14e0: 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20  takes a pointer 
14f0: 74 6f 20 61 20 50 61 67 65 72 20 73 74 72 75 63  to a Pager struc
1500: 74 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e  t as its argumen
1510: 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69  t. The.** associ
1520: 61 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69  ated file-descri
1530: 70 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  ptor is returned
1540: 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29  . FILEHANDLEID()
1550: 20 74 61 6b 65 73 20 61 6e 20 73 71 6c 69 74 65   takes an sqlite
1560: 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  3_file.** struct
1570: 20 61 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74   as its argument
1580: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
1590: 45 52 49 44 28 70 29 20 28 28 69 6e 74 29 28 70  ERID(p) ((int)(p
15a0: 2d 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46  ->fd)).#define F
15b0: 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20  ILEHANDLEID(fd) 
15c0: 28 28 69 6e 74 29 66 64 29 0a 0a 2f 2a 0a 2a 2a  ((int)fd)../*.**
15d0: 20 54 68 65 20 50 61 67 65 72 2e 65 53 74 61 74   The Pager.eStat
15e0: 65 20 76 61 72 69 61 62 6c 65 20 73 74 6f 72 65  e variable store
15f0: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 27 73  s the current 's
1600: 74 61 74 65 27 20 6f 66 20 61 20 70 61 67 65 72  tate' of a pager
1610: 2e 20 41 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79  . A.** pager may
1620: 20 62 65 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f   be in any one o
1630: 66 20 74 68 65 20 73 65 76 65 6e 20 73 74 61 74  f the seven stat
1640: 65 73 20 73 68 6f 77 6e 20 69 6e 20 74 68 65 20  es shown in the 
1650: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
1660: 74 65 20 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a  te diagram..**.*
1670: 2a 20 20 20 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 4f 50 45               OPE
1690: 4e 20 3c 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d  N <------+------
16a0: 2b 0a 2a 2a 20 20 20 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 7c 20 20 20 20 20 20 20 20 20 7c 20 20 20    |         |   
16d0: 20 20 20 7c 0a 2a 2a 20 20 20 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 56 20 20 20 20 20 20 20 20 20 7c       V         |
1700: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1710: 20 20 20 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d           +------
1720: 2d 2d 2d 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d  ---> READER-----
1730: 2d 2d 2b 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20  --+      |.**   
1740: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1750: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1760: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20                V 
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
17b0: 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45    |<-------WRITE
17c0: 52 5f 4c 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20  R_LOCKED------> 
17d0: 45 52 52 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20  ERROR.**        
17e0: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
17f0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
1800: 20 20 20 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20         ^  .**   
1810: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
1820: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
1830: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1850: 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41  <------WRITER_CA
1860: 43 48 45 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c  CHEMOD-------->|
1870: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1880: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
1890: 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20 20   |              
18a0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
18b0: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20       |          
18c0: 20 20 20 20 56 20 20 20 20 20 20 20 20 20 20 20      V           
18d0: 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20       |.**       
18e0: 20 20 20 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d          |<------
18f0: 2d 57 52 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d  -WRITER_DBMOD---
1900: 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20  ------->|.**    
1910: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1920: 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20            |     
1930: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 56 20 20               V  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a                |.
1970: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1980: 20 2b 3c 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f   +<------WRITER_
1990: 46 49 4e 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d  FINISHED--------
19a0: 3e 2b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74  >+.**.**.** List
19b0: 20 6f 66 20 73 74 61 74 65 20 74 72 61 6e 73 69   of state transi
19c0: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 43 20  tions and the C 
19d0: 5b 66 75 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20  [function] that 
19e0: 70 65 72 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a  performs each:.*
19f0: 2a 20 0a 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20  * .**   OPEN    
1a00: 20 20 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41            -> REA
1a10: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1a20: 20 5b 73 71 6c 69 74 65 33 50 61 67 65 72 53 68   [sqlite3PagerSh
1a30: 61 72 65 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52  aredLock].**   R
1a40: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a50: 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20   -> OPEN        
1a60: 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75          [pager_u
1a70: 6e 6c 6f 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52  nlock].**.**   R
1a80: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 20  EADER           
1a90: 20 2d 3e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45   -> WRITER_LOCKE
1aa0: 44 20 20 20 20 20 20 20 5b 73 71 6c 69 74 65 33  D       [sqlite3
1ab0: 50 61 67 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20  PagerBegin].**  
1ac0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ad0: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 43 41 43     -> WRITER_CAC
1ae0: 48 45 4d 4f 44 20 20 20 20 20 5b 70 61 67 65 72  HEMOD     [pager
1af0: 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a  _open_journal].*
1b00: 2a 20 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  *   WRITER_CACHE
1b10: 4d 4f 44 20 20 20 2d 3e 20 57 52 49 54 45 52 5f  MOD   -> WRITER_
1b20: 44 42 4d 4f 44 20 20 20 20 20 20 20 20 5b 73 79  DBMOD        [sy
1b30: 6e 63 4a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20  ncJournal].**   
1b40: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
1b50: 20 20 2d 3e 20 57 52 49 54 45 52 5f 46 49 4e 49    -> WRITER_FINI
1b60: 53 48 45 44 20 20 20 20 20 5b 73 71 6c 69 74 65  SHED     [sqlite
1b70: 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1b80: 65 4f 6e 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45  eOne].**   WRITE
1b90: 52 5f 2a 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20  R_***        -> 
1ba0: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
1bb0: 20 20 20 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74      [pager_end_t
1bc0: 72 61 6e 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a  ransaction].**.*
1bd0: 2a 20 20 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20  *   WRITER_***  
1be0: 20 20 20 20 20 20 2d 3e 20 45 52 52 4f 52 20 20        -> ERROR  
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 70 61               [pa
1c00: 67 65 72 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20  ger_error].**   
1c10: 45 52 52 4f 52 20 20 20 20 20 20 20 20 20 20 20  ERROR           
1c20: 20 20 2d 3e 20 4f 50 45 4e 20 20 20 20 20 20 20    -> OPEN       
1c30: 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72 5f           [pager_
1c40: 75 6e 6c 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a  unlock].** .**.*
1c50: 2a 20 20 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20  *  OPEN:.**.**  
1c60: 20 20 54 68 65 20 70 61 67 65 72 20 73 74 61 72    The pager star
1c70: 74 73 20 75 70 20 69 6e 20 74 68 69 73 20 73 74  ts up in this st
1c80: 61 74 65 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20  ate. Nothing is 
1c90: 67 75 61 72 61 6e 74 65 65 64 20 69 6e 20 74 68  guaranteed in th
1ca0: 69 73 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 2d  is.**    state -
1cb0: 20 74 68 65 20 66 69 6c 65 20 6d 61 79 20 6f 72   the file may or
1cc0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b   may not be lock
1cd0: 65 64 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ed and the datab
1ce0: 61 73 65 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20  ase size is.**  
1cf0: 20 20 75 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64    unknown. The d
1d00: 61 74 61 62 61 73 65 20 6d 61 79 20 6e 6f 74 20  atabase may not 
1d10: 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
1d20: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e  en..**.**    * N
1d30: 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
1d40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1d50: 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41  ctive..**    * A
1d60: 6e 79 20 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c  ny lock, or no l
1d70: 6f 63 6b 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20  ock at all, may 
1d80: 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  be held on the d
1d90: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1da0: 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a 65      * The dbSize
1db0: 2c 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64  , dbOrigSize and
1dc0: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
1dd0: 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65  ables may not be
1de0: 20 74 72 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   trusted..**.** 
1df0: 20 52 45 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20   READER:.**.**  
1e00: 20 20 49 6e 20 74 68 69 73 20 73 74 61 74 65 20    In this state 
1e10: 61 6c 6c 20 74 68 65 20 72 65 71 75 69 72 65 6d  all the requirem
1e20: 65 6e 74 73 20 66 6f 72 20 72 65 61 64 69 6e 67  ents for reading
1e30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1e40: 20 0a 2a 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b   .**    rollback
1e50: 20 28 6e 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20   (non-WAL) mode 
1e60: 61 72 65 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20  are met. Unless 
1e70: 74 68 65 20 70 61 67 65 72 20 69 73 20 28 6f 72  the pager is (or
1e80: 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20   recently.**    
1e90: 77 61 73 29 20 69 6e 20 65 78 63 6c 75 73 69 76  was) in exclusiv
1ea0: 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20  e-locking mode, 
1eb0: 61 20 75 73 65 72 2d 6c 65 76 65 6c 20 72 65 61  a user-level rea
1ec0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d transaction is
1ed0: 20 0a 2a 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68   .**    open. Th
1ee0: 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1ef0: 69 73 20 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73  is known in this
1f00: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   state..**.**   
1f10: 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75   A connection ru
1f20: 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69  nning with locki
1f30: 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65  ng_mode=normal e
1f40: 6e 74 65 72 73 20 74 68 69 73 20 73 74 61 74 65  nters this state
1f50: 20 77 68 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f   when.**    it o
1f60: 70 65 6e 73 20 61 20 72 65 61 64 2d 74 72 61 6e  pens a read-tran
1f70: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64  saction on the d
1f80: 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 74 75  atabase and retu
1f90: 72 6e 73 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20  rns to state.** 
1fa0: 20 20 20 4f 50 45 4e 20 61 66 74 65 72 20 74 68     OPEN after th
1fb0: 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
1fc0: 6f 6e 20 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e  on is completed.
1fd0: 20 48 6f 77 65 76 65 72 20 61 20 63 6f 6e 6e 65   However a conne
1fe0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e  ction.**    runn
1ff0: 69 6e 67 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d  ing in locking_m
2000: 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 28 69  ode=exclusive (i
2010: 6e 63 6c 75 64 69 6e 67 20 74 65 6d 70 20 64 61  ncluding temp da
2020: 74 61 62 61 73 65 73 29 20 72 65 6d 61 69 6e 73  tabases) remains
2030: 20 69 6e 0a 2a 2a 20 20 20 20 74 68 69 73 20 73   in.**    this s
2040: 74 61 74 65 20 65 76 65 6e 20 61 66 74 65 72 20  tate even after 
2050: 74 68 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63  the read-transac
2060: 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20  tion is closed. 
2070: 54 68 65 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20  The only way.** 
2080: 20 20 20 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64     a locking_mod
2090: 65 3d 65 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e  e=exclusive conn
20a0: 65 63 74 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73  ection can trans
20b0: 69 74 69 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45  ition from READE
20c0: 52 20 74 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20  R to OPEN.**    
20d0: 69 73 20 76 69 61 20 74 68 65 20 45 52 52 4f 52  is via the ERROR
20e0: 20 73 74 61 74 65 20 28 73 65 65 20 62 65 6c 6f   state (see belo
20f0: 77 29 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20  w)..** .**    * 
2100: 41 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  A read transacti
2110: 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76 65  on may be active
2120: 20 28 62 75 74 20 61 20 77 72 69 74 65 2d 74 72   (but a write-tr
2130: 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
2140: 29 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 53 48 41  )..**    * A SHA
2150: 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
2160: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2170: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2180: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 64 62  ..**    * The db
2190: 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
21a0: 79 20 62 65 20 74 72 75 73 74 65 64 20 28 65 76  y be trusted (ev
21b0: 65 6e 20 69 66 20 61 20 75 73 65 72 2d 6c 65 76  en if a user-lev
21c0: 65 6c 20 72 65 61 64 20 0a 2a 2a 20 20 20 20 20  el read .**     
21d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
21e0: 6e 6f 74 20 61 63 74 69 76 65 29 2e 20 54 68 65  not active). The
21f0: 20 64 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20   dbOrigSize and 
2200: 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61  dbFileSize varia
2210: 62 6c 65 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79  bles.**      may
2220: 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 20   not be trusted 
2230: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a  at this point..*
2240: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 64 61  *    * If the da
2250: 74 61 62 61 73 65 20 69 73 20 61 20 57 41 4c 20  tabase is a WAL 
2260: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 74  database, then t
2270: 68 65 20 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f  he WAL connectio
2280: 6e 20 69 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20  n is open..**   
2290: 20 2a 20 45 76 65 6e 20 69 66 20 61 20 72 65 61   * Even if a rea
22a0: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  d-transaction is
22b0: 20 6e 6f 74 20 6f 70 65 6e 2c 20 69 74 20 69 73   not open, it is
22c0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
22d0: 20 0a 2a 2a 20 20 20 20 20 20 74 68 65 72 65 20   .**      there 
22e0: 69 73 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61  is no hot-journa
22f0: 6c 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  l in the file-sy
2300: 73 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49  stem..**.**  WRI
2310: 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a  TER_LOCKED:.**.*
2320: 2a 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d  *    The pager m
2330: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
2340: 74 65 20 66 72 6f 6d 20 52 45 41 44 45 52 20 77  te from READER w
2350: 68 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e  hen a write-tran
2360: 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73  saction.**    is
2370: 20 66 69 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e   first opened on
2380: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
2390: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
23a0: 73 74 61 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73  state, all locks
23b0: 20 0a 2a 2a 20 20 20 20 72 65 71 75 69 72 65 64   .**    required
23c0: 20 74 6f 20 73 74 61 72 74 20 61 20 77 72 69 74   to start a writ
23d0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e-transaction ar
23e0: 65 20 68 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61  e held, but no a
23f0: 63 74 75 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64  ctual .**    mod
2400: 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68  ifications to th
2410: 65 20 63 61 63 68 65 20 6f 72 20 64 61 74 61 62  e cache or datab
2420: 61 73 65 20 68 61 76 65 20 74 61 6b 65 6e 20 70  ase have taken p
2430: 6c 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  lace..**.**    I
2440: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c  n rollback mode,
2450: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 28   a RESERVED or (
2460: 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
2470: 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69  on was opened wi
2480: 74 68 20 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20  th .**    BEGIN 
2490: 45 58 43 4c 55 53 49 56 45 29 20 45 58 43 4c 55  EXCLUSIVE) EXCLU
24a0: 53 49 56 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74  SIVE lock is obt
24b0: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74  ained on the dat
24c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 0a  abase file when.
24d0: 2a 2a 20 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20  **    moving to 
24e0: 74 68 69 73 20 73 74 61 74 65 2c 20 62 75 74 20  this state, but 
24f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2500: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
2510: 74 6f 20 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a  to or opened .**
2520: 20 20 20 20 74 6f 20 69 6e 20 74 68 69 73 20 73      to in this s
2530: 74 61 74 65 2e 20 49 66 20 74 68 65 20 74 72 61  tate. If the tra
2540: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
2550: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
2560: 62 61 63 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20  back while .**  
2570: 20 20 69 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b    in WRITER_LOCK
2580: 45 44 20 73 74 61 74 65 2c 20 61 6c 6c 20 74 68  ED state, all th
2590: 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
25a0: 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20  s to unlock the 
25b0: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 20  database .**    
25c0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  file..**.**    I
25d0: 4e 20 57 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42  N WAL mode, WalB
25e0: 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63  eginWriteTransac
25f0: 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64  tion() is called
2600: 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67   to lock the log
2610: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20   file..**    If 
2620: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
2630: 73 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c  s running with l
2640: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c  ocking_mode=excl
2650: 75 73 69 76 65 2c 20 61 6e 20 61 74 74 65 6d 70  usive, an attemp
2660: 74 0a 2a 2a 20 20 20 20 69 73 20 6d 61 64 65 20  t.**    is made 
2670: 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 45 58 43  to obtain an EXC
2680: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
2690: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77  ..**.**    * A w
26b0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
26c0: 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20   is active..**  
26d0: 20 20 2a 20 49 66 20 74 68 65 20 63 6f 6e 6e 65    * If the conne
26e0: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e  ction is open in
26f0: 20 72 6f 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20   rollback-mode, 
2700: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72  a RESERVED or gr
2710: 65 61 74 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c  eater .**      l
2720: 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  ock is held on t
2730: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2740: 2e 0a 2a 2a 20 20 20 20 2a 20 49 66 20 74 68 65  ..**    * If the
2750: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f   connection is o
2760: 70 65 6e 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c  pen in WAL-mode,
2770: 20 61 20 57 41 4c 20 77 72 69 74 65 20 74 72 61   a WAL write tra
2780: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  nsaction.**     
2790: 20 69 73 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73   is open (i.e. s
27a0: 71 6c 69 74 65 33 57 61 6c 42 65 67 69 6e 57 72  qlite3WalBeginWr
27b0: 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 29  iteTransaction()
27c0: 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73   has been succes
27d0: 73 66 75 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63  sfully.**      c
27e0: 61 6c 6c 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20  alled)..**    * 
27f0: 54 68 65 20 64 62 53 69 7a 65 2c 20 64 62 4f 72  The dbSize, dbOr
2800: 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46 69 6c  igSize and dbFil
2810: 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20  eSize variables 
2820: 61 72 65 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a  are all valid..*
2830: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2840: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
2850: 20 63 61 63 68 65 20 68 61 76 65 20 6e 6f 74 20   cache have not 
2860: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2870: 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  *    * The journ
2880: 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d  al file may or m
2890: 61 79 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a  ay not be open..
28a0: 2a 2a 20 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20  **    * Nothing 
28b0: 28 6e 6f 74 20 65 76 65 6e 20 74 68 65 20 66 69  (not even the fi
28c0: 72 73 74 20 68 65 61 64 65 72 29 20 68 61 73 20  rst header) has 
28d0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
28e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
28f0: 2a 2a 20 20 57 52 49 54 45 52 5f 43 41 43 48 45  **  WRITER_CACHE
2900: 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  MOD:.**.**    A 
2910: 70 61 67 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d  pager moves from
2920: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
2930: 74 61 74 65 20 74 6f 20 74 68 69 73 20 73 74 61  tate to this sta
2940: 74 65 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  te when a page i
2950: 73 0a 2a 2a 20 20 20 20 66 69 72 73 74 20 6d 6f  s.**    first mo
2960: 64 69 66 69 65 64 20 62 79 20 74 68 65 20 75 70  dified by the up
2970: 70 65 72 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f  per layer. In ro
2980: 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 74 68 65 20  llback mode the 
2990: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
29a0: 20 20 20 69 73 20 6f 70 65 6e 65 64 20 28 69 66     is opened (if
29b0: 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
29c0: 64 79 20 6f 70 65 6e 29 20 61 6e 64 20 61 20 68  dy open) and a h
29d0: 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 74 6f  eader written to
29e0: 20 74 68 65 0a 2a 2a 20 20 20 20 73 74 61 72 74   the.**    start
29f0: 20 6f 66 20 69 74 2e 20 54 68 65 20 64 61 74 61   of it. The data
2a00: 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
2a10: 6b 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  k has not been m
2a20: 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  odified..**.**  
2a30: 20 20 2a 20 41 20 77 72 69 74 65 20 74 72 61 6e    * A write tran
2a40: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
2a50: 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 20 52 45 53  e..**    * A RES
2a60: 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
2a70: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
2a80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a90: 6c 65 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  le..**    * The 
2aa0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2ab0: 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 72  open and the fir
2ac0: 73 74 20 68 65 61 64 65 72 20 68 61 73 20 62 65  st header has be
2ad0: 65 6e 20 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20  en written .**  
2ae0: 20 20 20 20 74 6f 20 69 74 2c 20 62 75 74 20 74      to it, but t
2af0: 68 65 20 68 65 61 64 65 72 20 68 61 73 20 6e 6f  he header has no
2b00: 74 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  t been synced to
2b10: 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54   disk..**    * T
2b20: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2b30: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 68 61  he page cache ha
2b40: 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ve been modified
2b50: 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f  ..**.**  WRITER_
2b60: 44 42 4d 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  DBMOD:.**.**    
2b70: 54 68 65 20 70 61 67 65 72 20 74 72 61 6e 73 69  The pager transi
2b80: 74 69 6f 6e 73 20 66 72 6f 6d 20 57 52 49 54 45  tions from WRITE
2b90: 52 5f 43 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20  R_CACHEMOD into 
2ba0: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74 61  WRITER_DBMOD sta
2bb0: 74 65 0a 2a 2a 20 20 20 20 77 68 65 6e 20 69 74  te.**    when it
2bc0: 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 63 6f   modifies the co
2bd0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61  ntents of the da
2be0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 57 41 4c  tabase file. WAL
2bf0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
2c00: 20 20 20 6e 65 76 65 72 20 65 6e 74 65 72 20 74     never enter t
2c10: 68 69 73 20 73 74 61 74 65 20 28 73 69 6e 63 65  his state (since
2c20: 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64   they do not mod
2c30: 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
2c40: 20 66 69 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73   file,.**    jus
2c50: 74 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e  t the log file).
2c60: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2c70: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2c80: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
2c90: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
2ca0: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
2cb0: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
2cc0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
2cd0: 20 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61      * The journa
2ce0: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 61  l file is open a
2cf0: 6e 64 20 74 68 65 20 66 69 72 73 74 20 68 65 61  nd the first hea
2d00: 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69  der has been wri
2d10: 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e  tten .**      an
2d20: 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  d synced to disk
2d30: 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 63 6f  ..**    * The co
2d40: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2d50: 67 65 20 63 61 63 68 65 20 68 61 76 65 20 62 65  ge cache have be
2d60: 65 6e 20 6d 6f 64 69 66 69 65 64 20 28 61 6e 64  en modified (and
2d70: 20 70 6f 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20   possibly.**    
2d80: 20 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73    written to dis
2d90: 6b 29 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45  k)..**.**  WRITE
2da0: 52 5f 46 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a  R_FINISHED:.**.*
2db0: 2a 20 20 20 20 49 74 20 69 73 20 6e 6f 74 20 70  *    It is not p
2dc0: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 57 41  ossible for a WA
2dd0: 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  L connection to 
2de0: 65 6e 74 65 72 20 74 68 69 73 20 73 74 61 74 65  enter this state
2df0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c  ..**.**    A rol
2e00: 6c 62 61 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72  lback-mode pager
2e10: 20 63 68 61 6e 67 65 73 20 74 6f 20 57 52 49 54   changes to WRIT
2e20: 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74  ER_FINISHED stat
2e30: 65 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 44 42  e from WRITER_DB
2e40: 4d 4f 44 0a 2a 2a 20 20 20 20 73 74 61 74 65 20  MOD.**    state 
2e50: 61 66 74 65 72 20 74 68 65 20 65 6e 74 69 72 65  after the entire
2e60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
2e70: 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c   been successful
2e80: 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
2e90: 74 68 65 0a 2a 2a 20 20 20 20 64 61 74 61 62 61  the.**    databa
2ea0: 73 65 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73  se file. In this
2eb0: 20 73 74 61 74 65 20 74 68 65 20 74 72 61 6e 73   state the trans
2ec0: 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f  action may be co
2ed0: 6d 6d 69 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a  mmitted simply.*
2ee0: 2a 20 20 20 20 62 79 20 66 69 6e 61 6c 69 7a 69  *    by finalizi
2ef0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
2f00: 69 6c 65 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49  ile. Once in WRI
2f10: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 73 74 61  TER_FINISHED sta
2f20: 74 65 2c 20 69 74 20 69 73 20 0a 2a 2a 20 20 20  te, it is .**   
2f30: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
2f40: 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
2f50: 62 61 73 65 20 66 75 72 74 68 65 72 2e 20 41 74  base further. At
2f60: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
2f70: 20 75 70 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61   upper .**    la
2f80: 79 65 72 20 6d 75 73 74 20 65 69 74 68 65 72 20  yer must either 
2f90: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
2fa0: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
2fb0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41  on..**.**    * A
2fc0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
2fd0: 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a  on is active..**
2fe0: 20 20 20 20 2a 20 41 6e 20 45 58 43 4c 55 53 49      * An EXCLUSI
2ff0: 56 45 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  VE or greater lo
3000: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
3010: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
3020: 0a 2a 2a 20 20 20 20 2a 20 41 6c 6c 20 77 72 69  .**    * All wri
3030: 74 69 6e 67 20 61 6e 64 20 73 79 6e 63 69 6e 67  ting and syncing
3040: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20   of journal and 
3050: 64 61 74 61 62 61 73 65 20 64 61 74 61 20 68 61  database data ha
3060: 73 20 66 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20  s finished..**  
3070: 20 20 20 20 49 66 20 6e 6f 20 65 72 72 6f 72 20      If no error 
3080: 6f 63 63 75 72 72 65 64 2c 20 61 6c 6c 20 74 68  occurred, all th
3090: 61 74 20 72 65 6d 61 69 6e 73 20 69 73 20 74 6f  at remains is to
30a0: 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
30b0: 75 72 6e 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20  urnal to.**     
30c0: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
30d0: 73 61 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65  saction. If an e
30e0: 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 20  rror did occur, 
30f0: 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
3100: 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20  need.**      to 
3110: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61  rollback the tra
3120: 6e 73 61 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  nsaction. .**.**
3130: 20 20 45 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20    ERROR:.**.**  
3140: 20 20 54 68 65 20 45 52 52 4f 52 20 73 74 61 74    The ERROR stat
3150: 65 20 69 73 20 65 6e 74 65 72 65 64 20 77 68 65  e is entered whe
3160: 6e 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d  n an IO or disk-
3170: 66 75 6c 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c  full error (incl
3180: 75 64 69 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49  uding.**    SQLI
3190: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20  TE_IOERR_NOMEM) 
31a0: 6f 63 63 75 72 73 20 61 74 20 61 20 70 6f 69 6e  occurs at a poin
31b0: 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74 68  t in the code th
31c0: 61 74 20 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20  at makes it .** 
31d0: 20 20 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20     difficult to 
31e0: 62 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  be sure that the
31f0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
3200: 20 73 74 61 74 65 20 28 63 61 63 68 65 20 63 6f   state (cache co
3210: 6e 74 65 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64  ntents, .**    d
3220: 62 20 73 69 7a 65 20 65 74 63 2e 29 20 61 72 65  b size etc.) are
3230: 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68   consistent with
3240: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
3250: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
3260: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f  ..**.**    Tempo
3270: 72 61 72 79 20 70 61 67 65 72 20 66 69 6c 65 73  rary pager files
3280: 20 6d 61 79 20 65 6e 74 65 72 20 74 68 65 20 45   may enter the E
3290: 52 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20  RROR state, but 
32a0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 73  in-memory pagers
32b0: 0a 2a 2a 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a  .**    cannot..*
32c0: 2a 0a 2a 2a 20 20 20 20 46 6f 72 20 65 78 61 6d  *.**    For exam
32d0: 70 6c 65 2c 20 69 66 20 61 6e 20 49 4f 20 65 72  ple, if an IO er
32e0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
32f0: 20 70 65 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f   performing a ro
3300: 6c 6c 62 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74  llback, .**    t
3310: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
3320: 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 6d 61  he page-cache ma
3330: 79 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20  y be left in an 
3340: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61  inconsistent sta
3350: 74 65 2e 0a 2a 2a 20 20 20 20 41 74 20 74 68 69  te..**    At thi
3360: 73 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64  s point it would
3370: 20 62 65 20 64 61 6e 67 65 72 6f 75 73 20 74 6f   be dangerous to
3380: 20 63 68 61 6e 67 65 20 62 61 63 6b 20 74 6f 20   change back to 
3390: 52 45 41 44 45 52 20 73 74 61 74 65 0a 2a 2a 20  READER state.** 
33a0: 20 20 20 28 61 73 20 75 73 75 61 6c 6c 79 20 68     (as usually h
33b0: 61 70 70 65 6e 73 20 61 66 74 65 72 20 61 20 72  appens after a r
33c0: 6f 6c 6c 62 61 63 6b 29 2e 20 41 6e 79 20 73 75  ollback). Any su
33d0: 62 73 65 71 75 65 6e 74 20 72 65 61 64 65 72 73  bsequent readers
33e0: 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20 72 65 70   might.**    rep
33f0: 6f 72 74 20 64 61 74 61 62 61 73 65 20 63 6f 72  ort database cor
3400: 72 75 70 74 69 6f 6e 20 28 64 75 65 20 74 6f 20  ruption (due to 
3410: 74 68 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74  the inconsistent
3420: 20 63 61 63 68 65 29 2c 20 61 6e 64 20 69 66 0a   cache), and if.
3430: 2a 2a 20 20 20 20 74 68 65 79 20 75 70 67 72 61  **    they upgra
3440: 64 65 20 74 6f 20 77 72 69 74 65 72 73 2c 20 74  de to writers, t
3450: 68 65 79 20 6d 61 79 20 69 6e 61 64 76 65 72 74  hey may inadvert
3460: 65 6e 74 6c 79 20 63 6f 72 72 75 70 74 20 74 68  ently corrupt th
3470: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
3480: 20 66 69 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20   file. To avoid 
3490: 74 68 69 73 20 68 61 7a 61 72 64 2c 20 74 68 65  this hazard, the
34a0: 20 70 61 67 65 72 20 73 77 69 74 63 68 65 73 20   pager switches 
34b0: 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
34c0: 74 61 74 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65  tate.**    inste
34d0: 61 64 20 6f 66 20 52 45 41 44 45 52 20 66 6f 6c  ad of READER fol
34e0: 6c 6f 77 69 6e 67 20 73 75 63 68 20 61 6e 20 65  lowing such an e
34f0: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f  rror..**.**    O
3500: 6e 63 65 20 69 74 20 68 61 73 20 65 6e 74 65 72  nce it has enter
3510: 65 64 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  ed the ERROR sta
3520: 74 65 2c 20 61 6e 79 20 61 74 74 65 6d 70 74 20  te, any attempt 
3530: 74 6f 20 75 73 65 20 74 68 65 20 70 61 67 65 72  to use the pager
3540: 0a 2a 2a 20 20 20 20 74 6f 20 72 65 61 64 20 6f  .**    to read o
3550: 72 20 77 72 69 74 65 20 64 61 74 61 20 72 65 74  r write data ret
3560: 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2e 20 45  urns an error. E
3570: 76 65 6e 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20  ventually, once 
3580: 61 6c 6c 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74  all .**    outst
3590: 61 6e 64 69 6e 67 20 74 72 61 6e 73 61 63 74 69  anding transacti
35a0: 6f 6e 73 20 68 61 76 65 20 62 65 65 6e 20 61 62  ons have been ab
35b0: 61 6e 64 6f 6e 65 64 2c 20 74 68 65 20 70 61 67  andoned, the pag
35c0: 65 72 20 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a  er is able to.**
35d0: 20 20 20 20 74 72 61 6e 73 69 74 69 6f 6e 20 62      transition b
35e0: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
35f0: 65 2c 20 64 69 73 63 61 72 64 69 6e 67 20 74 68  e, discarding th
3600: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3610: 65 20 0a 2a 2a 20 20 20 20 70 61 67 65 2d 63 61  e .**    page-ca
3620: 63 68 65 20 61 6e 64 20 61 6e 79 20 6f 74 68 65  che and any othe
3630: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74  r in-memory stat
3640: 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  e at the same ti
3650: 6d 65 2e 20 45 76 65 72 79 74 68 69 6e 67 0a 2a  me. Everything.*
3660: 2a 20 20 20 20 69 73 20 72 65 6c 6f 61 64 65 64  *    is reloaded
3670: 20 66 72 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c   from disk (and,
3680: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 68   if necessary, h
3690: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
36a0: 61 63 6b 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a  ack peformed).**
36b0: 20 20 20 20 77 68 65 6e 20 61 20 72 65 61 64 2d      when a read-
36c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e  transaction is n
36d0: 65 78 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  ext opened on th
36e0: 65 20 70 61 67 65 72 20 28 74 72 61 6e 73 69 74  e pager (transit
36f0: 69 6f 6e 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65  ioning.**    the
3700: 20 70 61 67 65 72 20 69 6e 74 6f 20 52 45 41 44   pager into READ
3710: 45 52 20 73 74 61 74 65 29 2e 20 41 74 20 74 68  ER state). At th
3720: 61 74 20 70 6f 69 6e 74 20 74 68 65 20 73 79 73  at point the sys
3730: 74 65 6d 20 68 61 73 20 72 65 63 6f 76 65 72 65  tem has recovere
3740: 64 20 0a 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68  d .**    from th
3750: 65 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20  e error..**.**  
3760: 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
3770: 74 68 65 20 70 61 67 65 72 20 6a 75 6d 70 73 20  the pager jumps 
3780: 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73  into the ERROR s
3790: 74 61 74 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  tate if:.**.**  
37a0: 20 20 20 20 31 2e 20 41 6e 20 65 72 72 6f 72 20      1. An error 
37b0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 61 74 74  occurs while att
37c0: 65 6d 70 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61  empting a rollba
37d0: 63 6b 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73  ck. This happens
37e0: 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 66   in.**         f
37f0: 75 6e 63 74 69 6f 6e 20 73 71 6c 69 74 65 33 50  unction sqlite3P
3800: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
3810: 2a 2a 0a 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e  **.**      2. An
3820: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
3830: 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ile attempting t
3840: 6f 20 66 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75  o finalize a jou
3850: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
3860: 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61       following a
3870: 20 63 6f 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74   commit in funct
3880: 69 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72  ion sqlite3Pager
3890: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
38a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20  ..**.**      3. 
38b0: 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  An error occurs 
38c0: 77 68 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67  while attempting
38d0: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
38e0: 20 6a 6f 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20   journal or.**  
38f0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
3900: 66 69 6c 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e  file in function
3910: 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69   pagerStress() i
3920: 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20  n order to free 
3930: 75 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 6d 65  up.**         me
3940: 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49  mory..**.**    I
3950: 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c 20 74  n other cases, t
3960: 68 65 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  he error is retu
3970: 72 6e 65 64 20 74 6f 20 74 68 65 20 62 2d 74 72  rned to the b-tr
3980: 65 65 20 6c 61 79 65 72 2e 20 54 68 65 20 62 2d  ee layer. The b-
3990: 74 72 65 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72  tree.**    layer
39a0: 20 74 68 65 6e 20 61 74 74 65 6d 70 74 73 20 61   then attempts a
39b0: 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74   rollback operat
39c0: 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f  ion. If the erro
39d0: 72 20 63 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20  r condition .** 
39e0: 20 20 20 70 65 72 73 69 73 74 73 2c 20 74 68 65     persists, the
39f0: 20 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68   pager enters th
3a00: 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 76 69  e ERROR state vi
3a10: 61 20 63 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20  a condition (1) 
3a20: 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  above..**.**    
3a30: 43 6f 6e 64 69 74 69 6f 6e 20 28 33 29 20 69 73  Condition (3) is
3a40: 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75   necessary becau
3a50: 73 65 20 69 74 20 63 61 6e 20 62 65 20 74 72 69  se it can be tri
3a60: 67 67 65 72 65 64 20 62 79 20 61 20 72 65 61 64  ggered by a read
3a70: 2d 6f 6e 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74  -only.**    stat
3a80: 65 6d 65 6e 74 20 65 78 65 63 75 74 65 64 20 77  ement executed w
3a90: 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
3aa0: 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
3ab0: 65 2c 20 69 66 20 74 68 65 20 65 72 72 6f 72 0a  e, if the error.
3ac0: 2a 2a 20 20 20 20 63 6f 64 65 20 77 65 72 65 20  **    code were 
3ad0: 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 65 64 20  simply returned 
3ae0: 74 6f 20 74 68 65 20 75 73 65 72 2c 20 74 68 65  to the user, the
3af0: 20 62 2d 74 72 65 65 20 6c 61 79 65 72 20 77 6f   b-tree layer wo
3b00: 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75  uld not.**    au
3b10: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 74 74 65  tomatically atte
3b20: 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  mpt a rollback, 
3b30: 61 73 20 69 74 20 61 73 73 75 6d 65 73 20 74 68  as it assumes th
3b40: 61 74 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 61  at an error in a
3b50: 0a 2a 2a 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79  .**    read-only
3b60: 20 73 74 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f   statement canno
3b70: 74 20 6c 65 61 76 65 20 74 68 65 20 70 61 67 65  t leave the page
3b80: 72 20 69 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c  r in an internal
3b90: 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  ly inconsistent 
3ba0: 0a 2a 2a 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a  .**    state..**
3bb0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 50 61 67  .**    * The Pag
3bc0: 65 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61  er.errCode varia
3bd0: 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 73 6f  ble is set to so
3be0: 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
3bf0: 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  an SQLITE_OK..**
3c00: 20 20 20 20 2a 20 54 68 65 72 65 20 61 72 65 20      * There are 
3c10: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73  one or more outs
3c20: 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
3c30: 65 73 20 74 6f 20 70 61 67 65 73 20 28 61 66 74  es to pages (aft
3c40: 65 72 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c  er the.**      l
3c50: 61 73 74 20 72 65 66 65 72 65 6e 63 65 20 69 73  ast reference is
3c60: 20 64 72 6f 70 70 65 64 20 74 68 65 20 70 61 67   dropped the pag
3c70: 65 72 20 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62  er should move b
3c80: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
3c90: 65 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  e)..**    * The 
3ca0: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6e 20  pager is not an 
3cb0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e  in-memory pager.
3cc0: 0a 2a 2a 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f  .**    .**.** No
3cd0: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41  tes:.**.**   * A
3ce0: 20 70 61 67 65 72 20 69 73 20 6e 65 76 65 72 20   pager is never 
3cf0: 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  in WRITER_DBMOD 
3d00: 6f 72 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48  or WRITER_FINISH
3d10: 45 44 20 73 74 61 74 65 20 69 66 20 74 68 65 0a  ED state if the.
3d20: 2a 2a 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f  **     connectio
3d30: 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c  n is open in WAL
3d40: 20 6d 6f 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e   mode. A WAL con
3d50: 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79  nection is alway
3d60: 73 20 69 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20  s in one.**     
3d70: 6f 66 20 74 68 65 20 66 69 72 73 74 20 66 6f 75  of the first fou
3d80: 72 20 73 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  r states..**.** 
3d90: 20 20 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20    * Normally, a 
3da0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20  connection open 
3db0: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
3dc0: 65 20 69 73 20 6e 65 76 65 72 20 69 6e 20 50 41  e is never in PA
3dd0: 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20  GER_OPEN.**     
3de0: 73 74 61 74 65 2e 20 54 68 65 72 65 20 61 72 65  state. There are
3df0: 20 74 77 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a   two exceptions:
3e00: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
3e10: 65 72 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  er exclusive-mod
3e20: 65 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65 65  e has.**     bee
3e30: 6e 20 74 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64  n turned on (and
3e40: 20 62 65 66 6f 72 65 20 61 6e 79 20 72 65 61 64   before any read
3e50: 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
3e60: 63 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20  ctions are .**  
3e70: 20 20 20 65 78 65 63 75 74 65 64 29 2c 20 61 6e     executed), an
3e80: 64 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  d when the pager
3e90: 20 69 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20   is leaving the 
3ea0: 22 65 72 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a  "error state"..*
3eb0: 2a 0a 2a 2a 20 20 20 2a 20 53 65 65 20 61 6c 73  *.**   * See als
3ec0: 6f 3a 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  o: assert_pager_
3ed0: 73 74 61 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66  state()..*/.#def
3ee0: 69 6e 65 20 50 41 47 45 52 5f 4f 50 45 4e 20 20  ine PAGER_OPEN  
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f00: 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  0.#define PAGER_
3f10: 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20  READER          
3f20: 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
3f30: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
3f40: 4b 45 44 20 20 20 20 20 20 20 20 20 32 0a 23 64  KED         2.#d
3f50: 65 66 69 6e 65 20 50 41 47 45 52 5f 57 52 49 54  efine PAGER_WRIT
3f60: 45 52 5f 43 41 43 48 45 4d 4f 44 20 20 20 20 20  ER_CACHEMOD     
3f70: 20 20 33 0a 23 64 65 66 69 6e 65 20 50 41 47 45    3.#define PAGE
3f80: 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20  R_WRITER_DBMOD  
3f90: 20 20 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e          4.#defin
3fa0: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  e PAGER_WRITER_F
3fb0: 49 4e 49 53 48 45 44 20 20 20 20 20 20 20 35 0a  INISHED       5.
3fc0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52  #define PAGER_ER
3fd0: 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20  ROR             
3fe0: 20 20 20 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65      6../*.** The
3ff0: 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72   Pager.eLock var
4000: 69 61 62 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20  iable is almost 
4010: 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 6f 6e  always set to on
4020: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c  e of the .** fol
4030: 6c 6f 77 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73  lowing locking-s
4040: 74 61 74 65 73 2c 20 61 63 63 6f 72 64 69 6e 67  tates, according
4050: 20 74 6f 20 74 68 65 20 6c 6f 63 6b 20 63 75 72   to the lock cur
4060: 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a  rently held on.*
4070: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
4080: 69 6c 65 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48  ile: NO_LOCK, SH
4090: 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
40a0: 56 45 44 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c  VED_LOCK or EXCL
40b0: 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54  USIVE_LOCK..** T
40c0: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
40d0: 6b 65 70 74 20 75 70 20 74 6f 20 64 61 74 65 20  kept up to date 
40e0: 61 73 20 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b  as locks are tak
40f0: 65 6e 20 61 6e 64 20 72 65 6c 65 61 73 65 64 20  en and released 
4100: 62 79 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 4c  by.** the pagerL
4110: 6f 63 6b 44 62 28 29 20 61 6e 64 20 70 61 67 65  ockDb() and page
4120: 72 55 6e 6c 6f 63 6b 44 62 28 29 20 77 72 61 70  rUnlockDb() wrap
4130: 70 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pers..**.** If t
4140: 68 65 20 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f  he VFS xLock() o
4150: 72 20 78 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75  r xUnlock() retu
4160: 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6f 74 68  rns an error oth
4170: 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42  er than SQLITE_B
4180: 55 53 59 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65  USY.** (i.e. one
4190: 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 49   of the SQLITE_I
41a0: 4f 45 52 52 20 73 75 62 74 79 70 65 73 29 2c 20  OERR subtypes), 
41b0: 69 74 20 69 73 20 6e 6f 74 20 63 6c 65 61 72 20  it is not clear 
41c0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a  whether or not.*
41d0: 2a 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  * the operation 
41e0: 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20  was successful. 
41f0: 49 6e 20 74 68 65 73 65 20 63 69 72 63 75 6d 73  In these circums
4200: 74 61 6e 63 65 73 20 70 61 67 65 72 4c 6f 63 6b  tances pagerLock
4210: 44 62 28 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65  Db() and.** page
4220: 72 55 6e 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65  rUnlockDb() take
4230: 20 61 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20   a conservative 
4240: 61 70 70 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b  approach - eLock
4250: 20 69 73 20 61 6c 77 61 79 73 20 75 70 64 61 74   is always updat
4260: 65 64 0a 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63  ed.** when unloc
4270: 6b 69 6e 67 20 74 68 65 20 66 69 6c 65 2c 20 61  king the file, a
4280: 6e 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 64 20  nd only updated 
4290: 77 68 65 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65  when locking the
42a0: 20 66 69 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20   file if the.** 
42b0: 56 46 53 20 63 61 6c 6c 20 69 73 20 73 75 63 63  VFS call is succ
42c0: 65 73 73 66 75 6c 2e 20 54 68 69 73 20 77 61 79  essful. This way
42d0: 2c 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63  , the Pager.eLoc
42e0: 6b 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62  k variable may b
42f0: 65 20 73 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65  e set.** to a le
4300: 73 73 20 65 78 63 6c 75 73 69 76 65 20 28 6c 6f  ss exclusive (lo
4310: 77 65 72 29 20 76 61 6c 75 65 20 74 68 61 6e 20  wer) value than 
4320: 74 68 65 20 6c 6f 63 6b 20 74 68 61 74 20 69 73  the lock that is
4330: 20 61 63 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a   actually held.*
4340: 2a 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  * at the system 
4350: 6c 65 76 65 6c 2c 20 62 75 74 20 69 74 20 69 73  level, but it is
4360: 20 6e 65 76 65 72 20 73 65 74 20 74 6f 20 61 20   never set to a 
4370: 6d 6f 72 65 20 65 78 63 6c 75 73 69 76 65 20 76  more exclusive v
4380: 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  alue..**.** This
4390: 20 69 73 20 75 73 75 61 6c 6c 79 20 73 61 66 65   is usually safe
43a0: 2e 20 49 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20  . If an xUnlock 
43b0: 66 61 69 6c 73 20 6f 72 20 61 70 70 65 61 72 73  fails or appears
43c0: 20 74 6f 20 66 61 69 6c 2c 20 74 68 65 72 65 20   to fail, there 
43d0: 6d 61 79 20 0a 2a 2a 20 62 65 20 61 20 66 65 77  may .** be a few
43e0: 20 72 65 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b   redundant xLock
43f0: 28 29 20 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f  () calls or a lo
4400: 63 6b 20 6d 61 79 20 62 65 20 68 65 6c 64 20 66  ck may be held f
4410: 6f 72 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a  or longer than.*
4420: 2a 20 72 65 71 75 69 72 65 64 2c 20 62 75 74 20  * required, but 
4430: 6e 6f 74 68 69 6e 67 20 72 65 61 6c 6c 79 20 67  nothing really g
4440: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
4450: 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69   The exception i
4460: 73 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62  s when the datab
4470: 61 73 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  ase file is unlo
4480: 63 6b 65 64 20 61 73 20 74 68 65 20 70 61 67 65  cked as the page
4490: 72 20 6d 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20  r moves.** from 
44a0: 45 52 52 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74  ERROR to OPEN st
44b0: 61 74 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ate. At this poi
44c0: 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
44d0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
44e0: 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69  le .** in the fi
44f0: 6c 65 2d 73 79 73 74 65 6d 20 74 68 61 74 20 6e  le-system that n
4500: 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
4510: 64 20 62 61 63 6b 20 28 61 73 20 70 61 72 74 20  d back (as part 
4520: 6f 66 20 61 20 4f 50 45 4e 2d 3e 53 48 41 52 45  of a OPEN->SHARE
4530: 44 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c  D.** transition,
4540: 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 61 67   by the same pag
4550: 65 72 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29  er or any other)
4560: 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f  . If the call to
4570: 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61   xUnlock().** fa
4580: 69 6c 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ils at this poin
4590: 74 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  t and the pager 
45a0: 69 73 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20  is left holding 
45b0: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
45c0: 6b 2c 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63  k, this.** can c
45d0: 6f 6e 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20  onfuse the call 
45e0: 74 6f 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  to xCheckReserve
45f0: 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64  dLock() call mad
4600: 65 20 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a  e later as part.
4610: 2a 2a 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61  ** of hot-journa
4620: 6c 20 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a  l detection..**.
4630: 2a 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  ** xCheckReserve
4640: 64 4c 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e  dLock() is defin
4650: 65 64 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20  ed as returning 
4660: 74 72 75 65 20 22 69 66 20 74 68 65 72 65 20 69  true "if there i
4670: 73 20 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a  s a RESERVED .**
4680: 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68   lock held by th
4690: 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e  is process or an
46a0: 79 20 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43  y others". So xC
46b0: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
46c0: 20 6d 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20   may .** return 
46d0: 74 72 75 65 20 62 65 63 61 75 73 65 20 74 68 65  true because the
46e0: 20 63 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69   caller itself i
46f0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43  s holding an EXC
4700: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74  LUSIVE lock (but
4710: 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77  .** doesn't know
4720: 20 69 74 20 62 65 63 61 75 73 65 20 6f 66 20 61   it because of a
4730: 20 70 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20   previous error 
4740: 69 6e 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20  in xUnlock). If 
4750: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
4760: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61  a hot-journal ma
4770: 79 20 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f  y be mistaken fo
4780: 72 20 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e  r a journal bein
4790: 67 20 63 72 65 61 74 65 64 20 62 79 20 61 6e 20  g created by an 
47a0: 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  active.** transa
47b0: 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72  ction in another
47c0: 20 70 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e   process, causin
47d0: 67 20 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64  g SQLite to read
47e0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
47f0: 73 65 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f  se.** without ro
4800: 6c 6c 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a  lling it back..*
4810: 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f  *.** To work aro
4820: 75 6e 64 20 74 68 69 73 2c 20 69 66 20 61 20 63  und this, if a c
4830: 61 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29  all to xUnlock()
4840: 20 66 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f   fails when unlo
4850: 63 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74  cking the.** dat
4860: 61 62 61 73 65 20 69 6e 20 74 68 65 20 45 52 52  abase in the ERR
4870: 4f 52 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e  OR state, Pager.
4880: 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20  eLock is set to 
4890: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74  UNKNOWN_LOCK. It
48a0: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e  .** is only chan
48b0: 67 65 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65  ged back to a re
48c0: 61 6c 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65  al locking state
48d0: 20 61 66 74 65 72 20 61 20 73 75 63 63 65 73 73   after a success
48e0: 66 75 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78  ful call.** to x
48f0: 4c 6f 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e  Lock(EXCLUSIVE).
4900: 20 41 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20   Also, the code 
4910: 74 6f 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e  to do the OPEN->
4920: 53 48 41 52 45 44 20 73 74 61 74 65 20 74 72 61  SHARED state tra
4930: 6e 73 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73  nsition.** omits
4940: 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61   the check for a
4950: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20   hot-journal if 
4960: 50 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73  Pager.eLock is s
4970: 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  et to UNKNOWN_LO
4980: 43 4b 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73  CK .** lock. Ins
4990: 74 65 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73  tead, it assumes
49a0: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65   a hot-journal e
49b0: 78 69 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e  xists and obtain
49c0: 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a  s an EXCLUSIVE.*
49d0: 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  * lock on the da
49e0: 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f  tabase file befo
49f0: 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  re attempting to
4a00: 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53   roll it back. S
4a10: 65 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50  ee function.** P
4a20: 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29  agerSharedLock()
4a30: 20 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c   for more detail
4a40: 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c  ..**.** Pager.eL
4a50: 6f 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ock may only be 
4a60: 73 65 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c  set to UNKNOWN_L
4a70: 4f 43 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67  OCK when the pag
4a80: 65 72 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47  er is in .** PAG
4a90: 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a  ER_OPEN state..*
4aa0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57  /.#define UNKNOW
4ab0: 4e 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20  N_LOCK          
4ac0: 20 20 20 20 20 20 28 45 58 43 4c 55 53 49 56 45        (EXCLUSIVE
4ad0: 5f 4c 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20  _LOCK+1)../*.** 
4ae0: 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72  A macro used for
4af0: 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f   invoking the co
4b00: 64 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20  dec if there is 
4b10: 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  one.*/.#ifdef SQ
4b20: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23  LITE_HAS_CODEC.#
4b30: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50   define CODEC1(P
4b40: 2c 44 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20  ,D,N,X,E) \.    
4b50: 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26  if( P->xCodec &&
4b60: 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43   P->xCodec(P->pC
4b70: 6f 64 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29  odec,D,N,X)==0 )
4b80: 7b 20 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20  { E; }.# define 
4b90: 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45  CODEC2(P,D,N,X,E
4ba0: 2c 4f 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d  ,O) \.    if( P-
4bb0: 3e 78 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d  >xCodec==0 ){ O=
4bc0: 28 63 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20  (char*)D; }else 
4bd0: 5c 0a 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68  \.    if( (O=(ch
4be0: 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50  ar*)(P->xCodec(P
4bf0: 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29  ->pCodec,D,N,X))
4c00: 29 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c  )==0 ){ E; }.#el
4c10: 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  se.# define CODE
4c20: 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20  C1(P,D,N,X,E)   
4c30: 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65  /* NO-OP */.# de
4c40: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
4c50: 4e 2c 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72  N,X,E,O) O=(char
4c60: 2a 29 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  *)D.#endif../*.*
4c70: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c  * The maximum al
4c80: 6c 6f 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a  lowed sector siz
4c90: 65 2e 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65  e. 64KiB. If the
4ca0: 20 78 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d   xSectorsize() m
4cb0: 65 74 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e  ethod .** return
4cc0: 73 20 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72  s a value larger
4cd0: 20 74 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e   than this, then
4ce0: 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
4cf0: 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
4d00: 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20  ..** This could 
4d10: 63 6f 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73  conceivably caus
4d20: 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c  e corruption fol
4d30: 6c 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66  lowing a power f
4d40: 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63  ailure on.** suc
4d50: 68 20 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73  h a system. This
4d60: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e   is currently an
4d70: 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69   undocumented li
4d80: 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  mit..*/.#define 
4d90: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  MAX_SECTOR_SIZE 
4da0: 30 78 31 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41  0x10000../*.** A
4db0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
4dc0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
4dd0: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
4de0: 65 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69  ed for each acti
4df0: 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  ve.** savepoint 
4e00: 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72  and statement tr
4e10: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65  ansaction in the
4e20: 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63   system. All suc
4e30: 68 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20  h structures.** 
4e40: 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  are stored in th
4e50: 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
4e60: 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63  nt[] array, whic
4e70: 68 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  h is allocated a
4e80: 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73  nd.** resized us
4e90: 69 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c  ing sqlite3Reall
4ea0: 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  oc()..**.** When
4eb0: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20   a savepoint is 
4ec0: 63 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67  created, the Pag
4ed0: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
4ee0: 4f 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a  Offset field is.
4ef0: 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20  ** set to 0. If 
4f00: 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
4f10: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
4f20: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
4f30: 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73  l while.** the s
4f40: 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69  avepoint is acti
4f50: 76 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66  ve, then iHdrOff
4f60: 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  set is set to th
4f70: 65 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a  e byte offset .*
4f80: 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  * immediately fo
4f90: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74  llowing the last
4fa0: 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
4fb0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
4fc0: 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c   main.** journal
4fd0: 20 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72   before the jour
4fe0: 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73  nal-header. This
4ff0: 20 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72   is required dur
5000: 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a  ing savepoint.**
5010: 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70   rollback (see p
5020: 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65  agerPlaybackSave
5030: 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70  point())..*/.typ
5040: 65 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65  edef struct Page
5050: 72 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72  rSavepoint Pager
5060: 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63  Savepoint;.struc
5070: 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
5080: 20 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74   {.  i64 iOffset
5090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
50a0: 20 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66    /* Starting of
50b0: 66 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75  fset in main jou
50c0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48  rnal */.  i64 iH
50d0: 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  drOffset;       
50e0: 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62         /* See ab
50f0: 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ove */.  Bitvec 
5100: 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  *pInSavepoint;  
5110: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20        /* Set of 
5120: 70 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61  pages in this sa
5130: 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e  vepoint */.  Pgn
5140: 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20  o nOrig;        
5150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
5160: 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  ginal number of 
5170: 70 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f  pages in file */
5180: 0a 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b  .  Pgno iSubRec;
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51a0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
51b0: 74 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d  t record in sub-
51c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64  journal */.#ifnd
51d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
51e0: 41 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74  AL.  u32 aWalDat
51f0: 61 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f  a[WAL_SAVEPOINT_
5200: 4e 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f  NDATA];        /
5210: 2a 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20  * WAL savepoint 
5220: 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69  context */.#endi
5230: 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70  f.};../*.** A op
5240: 65 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73  en page cache is
5250: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
5260: 73 74 72 75 63 74 20 50 61 67 65 72 2e 20 41 20  struct Pager. A 
5270: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a  description of.*
5280: 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f  * some of the mo
5290: 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d  re important mem
52a0: 62 65 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f  ber variables fo
52b0: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74  llows:.**.** eSt
52c0: 61 74 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ate.**.**   The 
52d0: 63 75 72 72 65 6e 74 20 27 73 74 61 74 65 27 20  current 'state' 
52e0: 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  of the pager obj
52f0: 65 63 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d  ect. See the com
5300: 6d 65 6e 74 20 61 6e 64 20 73 74 61 74 65 0a 2a  ment and state.*
5310: 2a 20 20 20 64 69 61 67 72 61 6d 20 61 62 6f 76  *   diagram abov
5320: 65 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  e for a descript
5330: 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72  ion of the pager
5340: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c   state..**.** eL
5350: 6f 63 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20  ock.**.**   For 
5360: 61 20 72 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64  a real on-disk d
5370: 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 75 72  atabase, the cur
5380: 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  rent lock held o
5390: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
53a0: 69 6c 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f  ile -.**   NO_LO
53b0: 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c  CK, SHARED_LOCK,
53c0: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f   RESERVED_LOCK o
53d0: 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  r EXCLUSIVE_LOCK
53e0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20  ..**.**   For a 
53f0: 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d  temporary or in-
5400: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
5410: 28 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69 63  (neither of whic
5420: 68 20 72 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a  h require any.**
5430: 20 20 20 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20     locks), this 
5440: 76 61 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61  variable is alwa
5450: 79 73 20 73 65 74 20 74 6f 20 45 58 43 4c 55 53  ys set to EXCLUS
5460: 49 56 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20  IVE_LOCK. Since 
5470: 73 75 63 68 0a 2a 2a 20 20 20 64 61 74 61 62 61  such.**   databa
5480: 73 65 73 20 61 6c 77 61 79 73 20 68 61 76 65 20  ses always have 
5490: 50 61 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d  Pager.exclusiveM
54a0: 6f 64 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69  ode==1, this tri
54b0: 63 6b 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  cks the pager.**
54c0: 20 20 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68     logic into th
54d0: 69 6e 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61  inking that it a
54e0: 6c 72 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74  lready has all t
54f0: 68 65 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c  he locks it will
5500: 20 65 76 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20   ever.**   need 
5510: 28 61 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74  (and no reason t
5520: 6f 20 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e  o release them).
5530: 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65  .**.**   In some
5540: 20 28 6f 62 73 63 75 72 65 29 20 63 69 72 63 75   (obscure) circu
5550: 6d 73 74 61 6e 63 65 73 2c 20 74 68 69 73 20 76  mstances, this v
5560: 61 72 69 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f  ariable may also
5570: 20 62 65 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20   be set to.**   
5580: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65  UNKNOWN_LOCK. Se
5590: 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  e the comment ab
55a0: 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20  ove the #define 
55b0: 6f 66 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  of UNKNOWN_LOCK 
55c0: 66 6f 72 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73  for.**   details
55d0: 2e 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f  ..**.** changeCo
55e0: 75 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20  untDone.**.**   
55f0: 54 68 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72  This boolean var
5600: 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f  iable is used to
5610: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
5620: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5630: 65 72 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d  er .**   (the 4-
5640: 62 79 74 65 20 68 65 61 64 65 72 20 66 69 65 6c  byte header fiel
5650: 64 20 61 74 20 62 79 74 65 20 6f 66 66 73 65 74  d at byte offset
5660: 20 32 34 20 6f 66 20 74 68 65 20 64 61 74 61 62   24 of the datab
5670: 61 73 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a  ase file) is .**
5680: 20 20 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d     not updated m
5690: 6f 72 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e  ore often than n
56a0: 65 63 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a  ecessary. .**.**
56b0: 20 20 20 49 74 20 69 73 20 73 65 74 20 74 6f 20     It is set to 
56c0: 74 72 75 65 20 77 68 65 6e 20 74 68 65 20 63 68  true when the ch
56d0: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65  ange-counter fie
56e0: 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 77  ld is updated, w
56f0: 68 69 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f  hich .**   can o
5700: 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e  nly happen if an
5710: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
5720: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
5730: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
5740: 20 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64     It is cleared
5750: 20 28 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20   (set to false) 
5760: 77 68 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c  whenever an excl
5770: 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a  usive lock is .*
5780: 2a 20 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64  *   relinquished
5790: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
57a0: 20 66 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65   file. Each time
57b0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
57c0: 73 20 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20  s committed,.** 
57d0: 20 20 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e    The changeCoun
57e0: 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e  tDone flag is in
57f0: 73 70 65 63 74 65 64 2e 20 49 66 20 69 74 20 69  spected. If it i
5800: 73 20 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b  s true, the work
5810: 20 6f 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e   of.**   updatin
5820: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
5830: 6e 74 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20  nter is omitted 
5840: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
5850: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
5860: 2a 2a 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e  **   This mechan
5870: 69 73 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77  ism means that w
5880: 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65  hen running in e
5890: 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61  xclusive mode, a
58a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20   connection .** 
58b0: 20 20 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61    need only upda
58c0: 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  te the change-co
58d0: 75 6e 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20  unter once, for 
58e0: 74 68 65 20 66 69 72 73 74 20 74 72 61 6e 73 61  the first transa
58f0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69  ction.**   commi
5900: 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d  tted..**.** setM
5910: 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68  aster.**.**   Wh
5920: 65 6e 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  en PagerCommitPh
5930: 61 73 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c  aseOne() is call
5940: 65 64 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74  ed to commit a t
5950: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d  ransaction, it m
5960: 61 79 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20  ay.**   (or may 
5970: 6e 6f 74 29 20 73 70 65 63 69 66 79 20 61 20 6d  not) specify a m
5980: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61  aster-journal na
5990: 6d 65 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  me to be written
59a0: 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20   into the .**   
59b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66  journal file bef
59c0: 6f 72 65 20 69 74 20 69 73 20 73 79 6e 63 65 64  ore it is synced
59d0: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
59e0: 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74    Whether or not
59f0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
5a00: 63 6f 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65  contains a maste
5a10: 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r-journal pointe
5a20: 72 20 61 66 66 65 63 74 73 20 0a 2a 2a 20 20 20  r affects .**   
5a30: 74 68 65 20 77 61 79 20 69 6e 20 77 68 69 63 68  the way in which
5a40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5a50: 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61  e is finalized a
5a60: 66 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63  fter the transac
5a70: 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f  tion is .**   co
5a80: 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65  mmitted or rolle
5a90: 64 20 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e  d back when runn
5aa0: 69 6e 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f  ing in "journal_
5ab0: 6d 6f 64 65 3d 50 45 52 53 49 53 54 22 20 6d 6f  mode=PERSIST" mo
5ac0: 64 65 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f  de..**   If a jo
5ad0: 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
5ae0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61  not contain a ma
5af0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster-journal poi
5b00: 6e 74 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20  nter, it is.**  
5b10: 20 66 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76   finalized by ov
5b20: 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66 69  erwriting the fi
5b30: 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
5b40: 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20  er with zeroes. 
5b50: 49 66 0a 2a 2a 20 20 20 69 74 20 64 6f 65 73 20  If.**   it does 
5b60: 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74 65 72  contain a master
5b70: 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72  -journal pointer
5b80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5b90: 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a  e is finalized .
5ba0: 2a 2a 20 20 20 62 79 20 74 72 75 6e 63 61 74 69  **   by truncati
5bb0: 6e 67 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79  ng it to zero by
5bc0: 74 65 73 2c 20 6a 75 73 74 20 61 73 20 69 66 20  tes, just as if 
5bd0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
5be0: 65 72 65 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e  ere .**   runnin
5bf0: 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  g in "journal_mo
5c00: 64 65 3d 74 72 75 6e 63 61 74 65 22 20 6d 6f 64  de=truncate" mod
5c10: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e  e..**.**   Journ
5c20: 61 6c 20 66 69 6c 65 73 20 74 68 61 74 20 63 6f  al files that co
5c30: 6e 74 61 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75  ntain master jou
5c40: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 63 61  rnal pointers ca
5c50: 6e 6e 6f 74 20 62 65 20 66 69 6e 61 6c 69 7a 65  nnot be finalize
5c60: 64 0a 2a 2a 20 20 20 73 69 6d 70 6c 79 20 62 79  d.**   simply by
5c70: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
5c80: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68   first journal-h
5c90: 65 61 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65  eader with zeroe
5ca0: 73 2c 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d  s, as the.**   m
5cb0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
5cc0: 69 6e 74 65 72 20 63 6f 75 6c 64 20 69 6e 74 65  inter could inte
5cd0: 72 66 65 72 65 20 77 69 74 68 20 68 6f 74 2d 6a  rfere with hot-j
5ce0: 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
5cf0: 6f 66 20 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73  of any.**   subs
5d00: 65 71 75 65 6e 74 6c 79 20 69 6e 74 65 72 72 75  equently interru
5d10: 70 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  pted transaction
5d20: 20 74 68 61 74 20 72 65 75 73 65 73 20 74 68 65   that reuses the
5d30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
5d40: 2a 0a 2a 2a 20 20 20 54 68 65 20 66 6c 61 67 20  *.**   The flag 
5d50: 69 73 20 63 6c 65 61 72 65 64 20 61 73 20 73 6f  is cleared as so
5d60: 6f 6e 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  on as the journa
5d70: 6c 20 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69  l file is finali
5d80: 7a 65 64 20 28 65 69 74 68 65 72 0a 2a 2a 20 20  zed (either.**  
5d90: 20 62 79 20 50 61 67 65 72 43 6f 6d 6d 69 74 50   by PagerCommitP
5da0: 68 61 73 65 54 77 6f 20 6f 72 20 50 61 67 65 72  haseTwo or Pager
5db0: 52 6f 6c 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e  Rollback). If an
5dc0: 20 49 4f 20 65 72 72 6f 72 20 70 72 65 76 65 6e   IO error preven
5dd0: 74 73 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72  ts the.**   jour
5de0: 6e 61 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65  nal file from be
5df0: 69 6e 67 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ing successfully
5e00: 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20   finalized, the 
5e10: 73 65 74 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a  setMaster flag.*
5e20: 2a 20 20 20 69 73 20 63 6c 65 61 72 65 64 20 61  *   is cleared a
5e30: 6e 79 77 61 79 20 28 61 6e 64 20 74 68 65 20 70  nyway (and the p
5e40: 61 67 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74  ager will move t
5e50: 6f 20 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0a  o ERROR state)..
5e60: 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c  **.** doNotSpill
5e70: 2c 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c  , doNotSyncSpill
5e80: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 73 65 20 74  .**.**   These t
5e90: 77 6f 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  wo boolean varia
5ea0: 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68 65  bles control the
5eb0: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61 63   behavior of cac
5ec0: 68 65 2d 73 70 69 6c 6c 73 0a 2a 2a 20 20 20 28  he-spills.**   (
5ed0: 63 61 6c 6c 73 20 6d 61 64 65 20 62 79 20 74 68  calls made by th
5ee0: 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c 65 20  e pcache module 
5ef0: 74 6f 20 74 68 65 20 70 61 67 65 72 53 74 72 65  to the pagerStre
5f00: 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 0a  ss() routine to.
5f10: 2a 2a 20 20 20 77 72 69 74 65 20 63 61 63 68 65  **   write cache
5f20: 64 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69  d data to the fi
5f30: 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f 72 64  le-system in ord
5f40: 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65  er to free up me
5f50: 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 57  mory)..**.**   W
5f60: 68 65 6e 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 69  hen doNotSpill i
5f70: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 72 69 74  s non-zero, writ
5f80: 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
5f90: 61 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74  ase from pagerSt
5fa0: 72 65 73 73 28 29 0a 2a 2a 20 20 20 69 73 20 64  ress().**   is d
5fb0: 69 73 61 62 6c 65 64 20 61 6c 74 6f 67 65 74 68  isabled altogeth
5fc0: 65 72 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  er. This is done
5fd0: 20 69 6e 20 61 20 76 65 72 79 20 6f 62 73 63 75   in a very obscu
5fe0: 72 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a 20  re case that.** 
5ff0: 20 20 63 6f 6d 65 73 20 75 70 20 64 75 72 69 6e    comes up durin
6000: 67 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  g savepoint roll
6010: 62 61 63 6b 20 74 68 61 74 20 72 65 71 75 69 72  back that requir
6020: 65 73 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f  es the pcache mo
6030: 64 75 6c 65 0a 2a 2a 20 20 20 74 6f 20 61 6c 6c  dule.**   to all
6040: 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
6050: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
6060: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 72 6f  journal file fro
6070: 6d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 0a  m being written.
6080: 2a 2a 20 20 20 77 68 69 6c 65 20 69 74 20 69 73  **   while it is
6090: 20 62 65 69 6e 67 20 74 72 61 76 65 72 73 65 64   being traversed
60a0: 20 62 79 20 63 6f 64 65 20 69 6e 20 70 61 67 65   by code in page
60b0: 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 0a 2a 2a  r_playback()..**
60c0: 20 0a 2a 2a 20 20 20 49 66 20 64 6f 4e 6f 74 53   .**   If doNotS
60d0: 79 6e 63 53 70 69 6c 6c 20 69 73 20 6e 6f 6e 2d  yncSpill is non-
60e0: 7a 65 72 6f 2c 20 77 72 69 74 69 6e 67 20 74 6f  zero, writing to
60f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 72   the database fr
6100: 6f 6d 20 70 61 67 65 72 53 74 72 65 73 73 28 29  om pagerStress()
6110: 0a 2a 2a 20 20 20 69 73 20 70 65 72 6d 69 74 74  .**   is permitt
6120: 65 64 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20  ed, but syncing 
6130: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6140: 20 69 73 20 6e 6f 74 2e 20 54 68 69 73 20 66 6c   is not. This fl
6150: 61 67 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 62  ag is set.**   b
6160: 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  y sqlite3PagerWr
6170: 69 74 65 28 29 20 77 68 65 6e 20 74 68 65 20 66  ite() when the f
6180: 69 6c 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f  ile-system secto
6190: 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72  r-size is larger
61a0: 20 74 68 61 6e 0a 2a 2a 20 20 20 74 68 65 20 64   than.**   the d
61b0: 61 74 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a  atabase page-siz
61c0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72  e in order to pr
61d0: 65 76 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20  event a journal 
61e0: 73 79 6e 63 20 66 72 6f 6d 20 68 61 70 70 65 6e  sync from happen
61f0: 69 6e 67 20 0a 2a 2a 20 20 20 69 6e 20 62 65 74  ing .**   in bet
6200: 77 65 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ween the journal
6210: 6c 69 6e 67 20 6f 66 20 74 77 6f 20 70 61 67 65  ling of two page
6220: 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73 65  s on the same se
6230: 63 74 6f 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62  ctor. .**.** sub
6240: 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20  jInMemory.**.** 
6250: 20 20 54 68 69 73 20 69 73 20 61 20 62 6f 6f 6c    This is a bool
6260: 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20 49 66  ean variable. If
6270: 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20   true, then any 
6280: 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a 6f 75  required sub-jou
6290: 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65  rnal.**   is ope
62a0: 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d  ned as an in-mem
62b0: 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ory journal file
62c0: 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68 65 6e  . If false, then
62d0: 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20   in-memory.**   
62e0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65  sub-journals are
62f0: 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 69   only used for i
6300: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 66  n-memory pager f
6310: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68  iles..**.**   Th
6320: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  is variable is u
6330: 70 64 61 74 65 64 20 62 79 20 74 68 65 20 75 70  pdated by the up
6340: 70 65 72 20 6c 61 79 65 72 20 65 61 63 68 20 74  per layer each t
6350: 69 6d 65 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20  ime a new .**   
6360: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6370: 6e 20 69 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a  n is opened..**.
6380: 2a 2a 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69  ** dbSize, dbOri
6390: 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a  gSize, dbFileSiz
63a0: 65 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62  e.**.**   Variab
63b0: 6c 65 20 64 62 53 69 7a 65 20 69 73 20 73 65 74  le dbSize is set
63c0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
63d0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
63e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
63f0: 20 20 20 49 74 20 69 73 20 76 61 6c 69 64 20 69     It is valid i
6400: 6e 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 61  n PAGER_READER a
6410: 6e 64 20 68 69 67 68 65 72 20 73 74 61 74 65 73  nd higher states
6420: 20 28 61 6c 6c 20 73 74 61 74 65 73 20 65 78 63   (all states exc
6430: 65 70 74 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45  ept for.**   OPE
6440: 4e 20 61 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a  N and ERROR). .*
6450: 2a 0a 2a 2a 20 20 20 64 62 53 69 7a 65 20 69 73  *.**   dbSize is
6460: 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20 74 68   set based on th
6470: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
6480: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69  tabase file, whi
6490: 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20  ch may be .**   
64a0: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
64b0: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
64c0: 62 61 73 65 20 28 74 68 65 20 76 61 6c 75 65 20  base (the value 
64d0: 73 74 6f 72 65 64 20 61 74 20 6f 66 66 73 65 74  stored at offset
64e0: 0a 2a 2a 20 20 20 32 38 20 6f 66 20 74 68 65 20  .**   28 of the 
64f0: 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20  database header 
6500: 62 79 20 74 68 65 20 62 74 72 65 65 29 2e 20 49  by the btree). I
6510: 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
6520: 65 20 66 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e  e file.**   is n
6530: 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75  ot an integer mu
6540: 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
6550: 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 76 61 6c  ge-size, the val
6560: 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ue stored in.** 
6570: 20 20 64 62 53 69 7a 65 20 69 73 20 72 6f 75 6e    dbSize is roun
6580: 64 65 64 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61  ded down (i.e. a
6590: 20 35 4b 42 20 66 69 6c 65 20 77 69 74 68 20 32   5KB file with 2
65a0: 4b 20 70 61 67 65 2d 73 69 7a 65 20 68 61 73 20  K page-size has 
65b0: 64 62 53 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20  dbSize==2)..**  
65c0: 20 45 78 63 65 70 74 2c 20 61 6e 79 20 66 69 6c   Except, any fil
65d0: 65 20 74 68 61 74 20 69 73 20 67 72 65 61 74 65  e that is greate
65e0: 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20 69  r than 0 bytes i
65f0: 6e 20 73 69 7a 65 20 69 73 20 63 6f 6e 73 69 64  n size is consid
6600: 65 72 65 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76  ered.**   to hav
6610: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 70  e at least one p
6620: 61 67 65 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42  age. (i.e. a 1KB
6630: 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70 61   file with 2K pa
6640: 67 65 2d 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a  ge-size leads.**
6650: 20 20 20 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29     to dbSize==1)
6660: 2e 0a 2a 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67  ..**.**   During
6670: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
6680: 74 69 6f 6e 2c 20 69 66 20 70 61 67 65 73 20 77  tion, if pages w
6690: 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 73  ith page-numbers
66a0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a   greater than.**
66b0: 20 20 20 64 62 53 69 7a 65 20 61 72 65 20 6d 6f     dbSize are mo
66c0: 64 69 66 69 65 64 20 69 6e 20 74 68 65 20 63 61  dified in the ca
66d0: 63 68 65 2c 20 64 62 53 69 7a 65 20 69 73 20 75  che, dbSize is u
66e0: 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67  pdated according
66f0: 6c 79 2e 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72  ly..**   Similar
6700: 6c 79 2c 20 69 66 20 74 68 65 20 64 61 74 61 62  ly, if the datab
6710: 61 73 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ase is truncated
6720: 20 75 73 69 6e 67 20 50 61 67 65 72 54 72 75 6e   using PagerTrun
6730: 63 61 74 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a  cateImage(), .**
6740: 20 20 20 64 62 53 69 7a 65 20 69 73 20 75 70 64     dbSize is upd
6750: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61  ated..**.**   Va
6760: 72 69 61 62 6c 65 73 20 64 62 4f 72 69 67 53 69  riables dbOrigSi
6770: 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69 7a  ze and dbFileSiz
6780: 65 20 61 72 65 20 76 61 6c 69 64 20 69 6e 20 73  e are valid in s
6790: 74 61 74 65 73 20 0a 2a 2a 20 20 20 50 41 47 45  tates .**   PAGE
67a0: 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  R_WRITER_LOCKED 
67b0: 61 6e 64 20 68 69 67 68 65 72 2e 20 64 62 4f 72  and higher. dbOr
67c0: 69 67 53 69 7a 65 20 69 73 20 61 20 63 6f 70 79  igSize is a copy
67d0: 20 6f 66 20 74 68 65 20 64 62 53 69 7a 65 0a 2a   of the dbSize.*
67e0: 2a 20 20 20 76 61 72 69 61 62 6c 65 20 61 74 20  *   variable at 
67f0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
6800: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74   transaction. It
6810: 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20   is used during 
6820: 72 6f 6c 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61  rollback,.**   a
6830: 6e 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  nd to determine 
6840: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 70  whether or not p
6850: 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ages need to be 
6860: 6a 6f 75 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72  journalled befor
6870: 65 0a 2a 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64  e.**   being mod
6880: 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54  ified..**.**   T
6890: 68 72 6f 75 67 68 6f 75 74 20 61 20 77 72 69 74  hroughout a writ
68a0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64  e-transaction, d
68b0: 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69  bFileSize contai
68c0: 6e 73 20 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a  ns the size of.*
68d0: 2a 20 20 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  *   the file on 
68e0: 64 69 73 6b 20 69 6e 20 70 61 67 65 73 2e 20 49  disk in pages. I
68f0: 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 63 6f  t is set to a co
6900: 70 79 20 6f 66 20 64 62 53 69 7a 65 20 77 68 65  py of dbSize whe
6910: 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69 74 65  n the.**   write
6920: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
6930: 66 69 72 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e  first opened, an
6940: 64 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 56  d updated when V
6950: 46 53 20 63 61 6c 6c 73 20 61 72 65 20 6d 61 64  FS calls are mad
6960: 65 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74 65 20  e.**   to write 
6970: 6f 72 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  or truncate the 
6980: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e  database file on
6990: 20 64 69 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20   disk. .**.**   
69a0: 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20  The only reason 
69b0: 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65 20 76  the dbFileSize v
69c0: 61 72 69 61 62 6c 65 20 69 73 20 72 65 71 75 69  ariable is requi
69d0: 72 65 64 20 69 73 20 74 6f 20 73 75 70 70 72 65  red is to suppre
69e0: 73 73 20 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73  ss .**   unneces
69f0: 73 61 72 79 20 63 61 6c 6c 73 20 74 6f 20 78 54  sary calls to xT
6a00: 72 75 6e 63 61 74 65 28 29 20 61 66 74 65 72 20  runcate() after 
6a10: 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
6a20: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a  nsaction. If, .*
6a30: 2a 20 20 20 77 68 65 6e 20 61 20 74 72 61 6e 73  *   when a trans
6a40: 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
6a50: 74 65 64 2c 20 74 68 65 20 64 62 46 69 6c 65 53  ted, the dbFileS
6a60: 69 7a 65 20 76 61 72 69 61 62 6c 65 20 69 6e 64  ize variable ind
6a70: 69 63 61 74 65 73 20 0a 2a 2a 20 20 20 74 68 61  icates .**   tha
6a80: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
6a90: 69 6c 65 20 69 73 20 6c 61 72 67 65 72 20 74 68  ile is larger th
6aa0: 61 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  an the database 
6ab0: 69 6d 61 67 65 20 28 50 61 67 65 72 2e 64 62 53  image (Pager.dbS
6ac0: 69 7a 65 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65  ize), .**   page
6ad0: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73 20  r_truncate() is 
6ae0: 63 61 6c 6c 65 64 2e 20 54 68 65 20 70 61 67 65  called. The page
6af0: 72 5f 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c  r_truncate() cal
6b00: 6c 20 75 73 65 73 20 78 46 69 6c 65 73 69 7a 65  l uses xFilesize
6b10: 28 29 0a 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75  ().**   to measu
6b20: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
6b30: 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e  file on disk, an
6b40: 64 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 73  d then truncates
6b50: 20 69 74 20 69 66 20 72 65 71 75 69 72 65 64 2e   it if required.
6b60: 0a 2a 2a 20 20 20 64 62 46 69 6c 65 53 69 7a 65  .**   dbFileSize
6b70: 20 69 73 20 6e 6f 74 20 75 73 65 64 20 77 68 65   is not used whe
6b80: 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  n rolling back a
6b90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e   transaction. In
6ba0: 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 20 20   this case.**   
6bb0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 29  pager_truncate()
6bc0: 20 69 73 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e   is called uncon
6bd0: 64 69 74 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63  ditionally (whic
6be0: 68 20 6d 65 61 6e 73 20 74 68 65 72 65 20 6d 61  h means there ma
6bf0: 79 20 62 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c  y be.**   a call
6c00: 20 74 6f 20 78 46 69 6c 65 73 69 7a 65 28 29 20   to xFilesize() 
6c10: 74 68 61 74 20 69 73 20 6e 6f 74 20 73 74 72 69  that is not stri
6c20: 63 74 6c 79 20 72 65 71 75 69 72 65 64 29 2e 20  ctly required). 
6c30: 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 0a  In either case,.
6c40: 2a 2a 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63  **   pager_trunc
6c50: 61 74 65 28 29 20 6d 61 79 20 63 61 75 73 65 20  ate() may cause 
6c60: 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 63 6f  the file to beco
6c70: 6d 65 20 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61  me smaller or la
6c80: 72 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69  rger..**.** dbHi
6c90: 6e 74 53 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54  ntSize.**.**   T
6ca0: 68 65 20 64 62 48 69 6e 74 53 69 7a 65 20 76 61  he dbHintSize va
6cb0: 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20 74  riable is used t
6cc0: 6f 20 6c 69 6d 69 74 20 74 68 65 20 6e 75 6d 62  o limit the numb
6cd0: 65 72 20 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65  er of calls made
6ce0: 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20 56 46 53   to.**   the VFS
6cf0: 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43   xFileControl(FC
6d00: 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d  NTL_SIZE_HINT) m
6d10: 65 74 68 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ethod. .**.**   
6d20: 64 62 48 69 6e 74 53 69 7a 65 20 69 73 20 73 65  dbHintSize is se
6d30: 74 20 74 6f 20 61 20 63 6f 70 79 20 6f 66 20 74  t to a copy of t
6d40: 68 65 20 64 62 53 69 7a 65 20 76 61 72 69 61 62  he dbSize variab
6d50: 6c 65 20 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77  le when a.**   w
6d60: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
6d70: 20 69 73 20 6f 70 65 6e 65 64 20 28 61 74 20 74   is opened (at t
6d80: 68 65 20 73 61 6d 65 20 74 69 6d 65 20 61 73 20  he same time as 
6d90: 64 62 46 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a  dbFileSize and.*
6da0: 2a 20 20 20 64 62 4f 72 69 67 53 69 7a 65 29 2e  *   dbOrigSize).
6db0: 20 49 66 20 74 68 65 20 78 46 69 6c 65 43 6f 6e   If the xFileCon
6dc0: 74 72 6f 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f  trol(FCNTL_SIZE_
6dd0: 48 49 4e 54 29 20 6d 65 74 68 6f 64 20 69 73 20  HINT) method is 
6de0: 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48  called,.**   dbH
6df0: 69 6e 74 53 69 7a 65 20 69 73 20 69 6e 63 72 65  intSize is incre
6e00: 61 73 65 64 20 74 6f 20 74 68 65 20 6e 75 6d 62  ased to the numb
6e10: 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
6e20: 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74   correspond to t
6e30: 68 65 0a 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e  he.**   size-hin
6e40: 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  t passed to the 
6e50: 6d 65 74 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65  method call. See
6e60: 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
6e70: 65 6c 69 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20  elist() for .** 
6e80: 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a    details..**.**
6e90: 20 65 72 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20   errCode.**.**  
6ea0: 20 54 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f   The Pager.errCo
6eb0: 64 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 6f  de variable is o
6ec0: 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20 69 6e  nly ever used in
6ed0: 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61   PAGER_ERROR sta
6ee0: 74 65 2e 20 49 74 0a 2a 2a 20 20 20 69 73 20 73  te. It.**   is s
6ef0: 65 74 20 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c  et to zero in al
6f00: 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73 2e 20  l other states. 
6f10: 49 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73  In PAGER_ERROR s
6f20: 74 61 74 65 2c 20 50 61 67 65 72 2e 65 72 72 43  tate, Pager.errC
6f30: 6f 64 65 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77  ode .**   is alw
6f40: 61 79 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54  ays set to SQLIT
6f50: 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49  E_FULL, SQLITE_I
6f60: 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74  OERR or one of t
6f70: 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  he SQLITE_IOERR_
6f80: 58 58 58 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f  XXX .**   sub-co
6f90: 64 65 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50  des..*/.struct P
6fa0: 61 67 65 72 20 7b 0a 20 20 73 71 6c 69 74 65 33  ager {.  sqlite3
6fb0: 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20  _vfs *pVfs;     
6fc0: 20 20 20 20 20 2f 2a 20 4f 53 20 66 75 6e 63 74       /* OS funct
6fd0: 69 6f 6e 73 20 74 6f 20 75 73 65 20 66 6f 72 20  ions to use for 
6fe0: 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75  IO */.  u8 exclu
6ff0: 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20 20 20  siveMode;       
7000: 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20      /* Boolean. 
7010: 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f  True if locking_
7020: 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56 45 20  mode==EXCLUSIVE 
7030: 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4d  */.  u8 journalM
7040: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
7050: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 50   /* One of the P
7060: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
7070: 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75  _* values */.  u
7080: 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20  8 useJournal;   
7090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
70a0: 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  e a rollback jou
70b0: 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c  rnal on this fil
70c0: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63  e */.  u8 noSync
70d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
70e0: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e     /* Do not syn
70f0: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66  c the journal if
7100: 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75   true */.  u8 fu
7110: 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  llSync;         
7120: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74         /* Do ext
7130: 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20  ra syncs of the 
7140: 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75  journal for robu
7150: 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 63  stness */.  u8 c
7160: 6b 70 74 53 79 6e 63 46 6c 61 67 73 3b 20 20 20  kptSyncFlags;   
7170: 20 20 20 20 20 20 20 20 2f 2a 20 53 59 4e 43 5f          /* SYNC_
7180: 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46  NORMAL or SYNC_F
7190: 55 4c 4c 20 66 6f 72 20 63 68 65 63 6b 70 6f 69  ULL for checkpoi
71a0: 6e 74 20 2a 2f 0a 20 20 75 38 20 77 61 6c 53 79  nt */.  u8 walSy
71b0: 6e 63 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  ncFlags;        
71c0: 20 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d      /* SYNC_NORM
71d0: 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20  AL or SYNC_FULL 
71e0: 66 6f 72 20 77 61 6c 20 77 72 69 74 65 73 20 2a  for wal writes *
71f0: 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c 61 67 73  /.  u8 syncFlags
7200: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7210: 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  /* SYNC_NORMAL o
7220: 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f 74 68 65  r SYNC_FULL othe
7230: 72 77 69 73 65 20 2a 2f 0a 20 20 75 38 20 74 65  rwise */.  u8 te
7240: 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  mpFile;         
7250: 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
7260: 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ame is a tempora
7270: 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  ry file */.  u8 
7280: 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20  readOnly;       
7290: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
72a0: 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
72b0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
72c0: 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20  8 memDb;        
72d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
72e0: 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c  ue to inhibit al
72f0: 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20  l file I/O */.. 
7300: 20 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   /**************
7310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a  ************.  *
7350: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
7360: 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74  block contains t
7370: 68 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65  hose class membe
7380: 72 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64  rs that change d
7390: 75 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69  uring.  ** routi
73a0: 6e 65 20 6f 70 65 72 74 69 6f 6e 2e 20 20 43 6c  ne opertion.  Cl
73b0: 61 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20  ass members not 
73c0: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
73d0: 65 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20  e either fixed. 
73e0: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67   ** when the pag
73f0: 65 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61  er is first crea
7400: 74 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79  ted or else only
7410: 20 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65   change when the
7420: 72 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67  re is a.  ** sig
7430: 6e 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68  nificant mode ch
7440: 61 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68  ange (such as ch
7450: 61 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f  anging the page_
7460: 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  size, locking_mo
7470: 64 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20  de,.  ** or the 
7480: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20  journal_mode).  
7490: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65  From another vie
74a0: 77 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d  w, these class m
74b0: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a  embers describe.
74c0: 20 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22    ** the "state"
74d0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77   of the pager, w
74e0: 68 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73  hile other class
74f0: 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62   members describ
7500: 65 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66  e the.  ** "conf
7510: 69 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68  iguration" of th
7520: 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  e pager..  */.  
7530: 75 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  u8 eState;      
7540: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7550: 61 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e  ager state (OPEN
7560: 2c 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52  , READER, WRITER
7570: 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20  _LOCKED..) */.  
7580: 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  u8 eLock;       
7590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
75a0: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
75b0: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
75c0: 65 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  e */.  u8 change
75d0: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
75e0: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
75f0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
7600: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
7610: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
7620: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
7630: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
7640: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
7650: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
7660: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69  */.  u8 doNotSpi
7670: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7680: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c   /* Do not spill
7690: 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
76a0: 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38  non-zero */.  u8
76b0: 20 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3b   doNotSyncSpill;
76c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
76d0: 6e 6f 74 20 64 6f 20 61 20 73 70 69 6c 6c 20 74  not do a spill t
76e0: 68 61 74 20 72 65 71 75 69 72 65 73 20 6a 72 6e  hat requires jrn
76f0: 6c 20 73 79 6e 63 20 2a 2f 0a 20 20 75 38 20 73  l sync */.  u8 s
7700: 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20  ubjInMemory;    
7710: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7720: 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79  to use in-memory
7730: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f   sub-journals */
7740: 0a 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20  .  Pgno dbSize; 
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7760: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
7770: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
7780: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72  e */.  Pgno dbOr
7790: 69 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  igSize;         
77a0: 20 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66     /* dbSize bef
77b0: 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
77c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
77d0: 20 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65   Pgno dbFileSize
77e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
77f0: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
7800: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7810: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  file */.  Pgno d
7820: 62 48 69 6e 74 53 69 7a 65 3b 20 20 20 20 20 20  bHintSize;      
7830: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 70        /* Value p
7840: 61 73 73 65 64 20 74 6f 20 46 43 4e 54 4c 5f 53  assed to FCNTL_S
7850: 49 5a 45 5f 48 49 4e 54 20 63 61 6c 6c 20 2a 2f  IZE_HINT call */
7860: 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20  .  int errCode; 
7870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7880: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
7890: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
78a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e    /* Pages journ
78d0: 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74  alled since last
78e0: 20 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65   j-header writte
78f0: 6e 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  n */.  u32 cksum
7900: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
7910: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
7920: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
7930: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
7940: 20 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65   */.  u32 nSubRe
7950: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
7960: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
7970: 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74  ecords written t
7980: 6f 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  o sub-journal */
7990: 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f  .  Bitvec *pInJo
79a0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f  urnal;         /
79b0: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
79c0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
79d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
79e0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
79f0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fd;           /*
7a00: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
7a10: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f   for database */
7a20: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
7a30: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *jfd;          /
7a40: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
7a50: 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e  r for main journ
7a60: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
7a70: 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20  file *sjfd;     
7a80: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
7a90: 72 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a  riptor for sub-j
7aa0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
7ab0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
7ac0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
7ad0: 6e 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20  nt write offset 
7ae0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
7af0: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
7b00: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
7b10: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
7b20: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
7b30: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
7b40: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  /.  sqlite3_back
7b50: 75 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20  up *pBackup;    
7b60: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69  /* Pointer to li
7b70: 73 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61  st of ongoing ba
7b80: 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a  ckup processes *
7b90: 2f 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69  /.  PagerSavepoi
7ba0: 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20  nt *aSavepoint; 
7bb0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69  /* Array of acti
7bc0: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f  ve savepoints */
7bd0: 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e  .  int nSavepoin
7be0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
7bf0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
7c00: 65 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69  ents in aSavepoi
7c10: 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64  nt[] */.  char d
7c20: 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20  bFileVers[16];  
7c30: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73        /* Changes
7c40: 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61   whenever databa
7c50: 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20  se file changes 
7c60: 2a 2f 0a 0a 20 20 75 38 20 62 55 73 65 46 65 74  */..  u8 bUseFet
7c70: 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ch;             
7c80: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65    /* True to use
7c90: 20 78 46 65 74 63 68 28 29 20 2a 2f 0a 20 20 69   xFetch() */.  i
7ca0: 6e 74 20 6e 4d 6d 61 70 4f 75 74 3b 20 20 20 20  nt nMmapOut;    
7cb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7cc0: 6d 62 65 72 20 6f 66 20 6d 6d 61 70 20 70 61 67  mber of mmap pag
7cd0: 65 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 75 74  es currently out
7ce0: 73 74 61 6e 64 69 6e 67 20 2a 2f 0a 20 20 73 71  standing */.  sq
7cf0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 78 4d 6d  lite3_int64 mxMm
7d00: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 44 65 73  ap;       /* Des
7d10: 69 72 65 64 20 6d 61 78 69 6d 75 6d 20 6d 6d 61  ired maximum mma
7d20: 70 20 73 69 7a 65 20 2a 2f 0a 20 20 50 67 48 64  p size */.  PgHd
7d30: 72 20 2a 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r *pMmapFreelist
7d40: 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ;       /* List 
7d50: 6f 66 20 66 72 65 65 20 6d 6d 61 70 20 70 61 67  of free mmap pag
7d60: 65 20 68 65 61 64 65 72 73 20 28 70 44 69 72 74  e headers (pDirt
7d70: 79 29 20 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20  y) */.  /*.  ** 
7d80: 45 6e 64 20 6f 66 20 74 68 65 20 72 6f 75 74 69  End of the routi
7d90: 6e 65 6c 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c  nely-changing cl
7da0: 61 73 73 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a  ass members.  **
7db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7dc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31  *********/..  u1
7e00: 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20  6 nExtra;       
7e10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
7e20: 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
7e30: 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
7e40: 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 31 36  ry page */.  i16
7e50: 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20 20   nReserve;      
7e60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7e70: 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74  er of unused byt
7e80: 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65 61 63  es at end of eac
7e90: 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32 20  h page */.  u32 
7ea0: 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20  vfsFlags;       
7eb0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
7ec0: 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66 73   for sqlite3_vfs
7ed0: 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33  .xOpen() */.  u3
7ee0: 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20  2 sectorSize;   
7ef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
7f00: 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  umed sector size
7f10: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
7f20: 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69   */.  int pageSi
7f30: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
7f40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
7f50: 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a  ytes in a page *
7f60: 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b  /.  Pgno mxPgno;
7f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f80: 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77  /* Maximum allow
7f90: 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ed size of the d
7fa0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 36 34  atabase */.  i64
7fb0: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69   journalSizeLimi
7fc0: 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  t;       /* Size
7fd0: 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73 69   limit for persi
7fe0: 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69  stent journal fi
7ff0: 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  les */.  char *z
8000: 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
8010: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
8020: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
8030: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f  e */.  char *zJo
8040: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
8050: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
8060: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
8070: 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48  /.  int (*xBusyH
8080: 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20  andler)(void*); 
8090: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63  /* Function to c
80a0: 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a 2f  all when busy */
80b0: 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61  .  void *pBusyHa
80c0: 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20 2f  ndlerArg;      /
80d0: 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d 65  * Context argume
80e0: 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e 64  nt for xBusyHand
80f0: 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 53 74  ler */.  int aSt
8100: 61 74 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20  at[3];          
8110: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 63 61       /* Total ca
8120: 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73 65 73  che hits, misses
8130: 20 61 6e 64 20 77 72 69 74 65 73 20 2a 2f 0a 23   and writes */.#
8140: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
8150: 54 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20 20  T.  int nRead;  
8160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8170: 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65  /* Database page
8180: 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66  s read */.#endif
8190: 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  .  void (*xReini
81a0: 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b 20 2f  ter)(DbPage*); /
81b0: 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  * Call this rout
81c0: 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69  ine when reloadi
81d0: 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66 64  ng pages */.#ifd
81e0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
81f0: 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43  DEC.  void *(*xC
8200: 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64  odec)(void*,void
8210: 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20  *,Pgno,int); /* 
8220: 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64  Routine for en/d
8230: 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a  ecoding data */.
8240: 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 53    void (*xCodecS
8250: 69 7a 65 43 68 6e 67 29 28 76 6f 69 64 2a 2c 69  izeChng)(void*,i
8260: 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20 4e 6f 74 69  nt,int); /* Noti
8270: 66 79 20 6f 66 20 70 61 67 65 20 73 69 7a 65 20  fy of page size 
8280: 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 76 6f 69  changes */.  voi
8290: 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29 28  d (*xCodecFree)(
82a0: 76 6f 69 64 2a 29 3b 20 20 20 20 20 20 20 20 20  void*);         
82b0: 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f      /* Destructo
82c0: 72 20 66 6f 72 20 74 68 65 20 63 6f 64 65 63 20  r for the codec 
82d0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  */.  void *pCode
82e0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
82f0: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
8300: 6e 74 20 74 6f 20 78 43 6f 64 65 63 2e 2e 2e 20  nt to xCodec... 
8310: 6d 65 74 68 6f 64 73 20 2a 2f 0a 23 65 6e 64 69  methods */.#endi
8320: 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70  f.  char *pTmpSp
8330: 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
8340: 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  /* Pager.pageSiz
8350: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
8360: 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a   for tmp use */.
8370: 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63 68    PCache *pPCach
8380: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
8390: 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
83a0: 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f   cache object */
83b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
83c0: 4f 4d 49 54 5f 57 41 4c 0a 20 20 57 61 6c 20 2a  OMIT_WAL.  Wal *
83d0: 70 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pWal;           
83e0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 2d         /* Write-
83f0: 61 68 65 61 64 20 6c 6f 67 20 75 73 65 64 20 62  ahead log used b
8400: 79 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  y "journal_mode=
8410: 77 61 6c 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a  wal" */.  char *
8420: 7a 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zWal;           
8430: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61        /* File na
8440: 6d 65 20 66 6f 72 20 77 72 69 74 65 2d 61 68 65  me for write-ahe
8450: 61 64 20 6c 6f 67 20 2a 2f 0a 23 65 6e 64 69 66  ad log */.#endif
8460: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 65 78  .};../*.** Index
8470: 65 73 20 66 6f 72 20 75 73 65 20 77 69 74 68 20  es for use with 
8480: 50 61 67 65 72 2e 61 53 74 61 74 5b 5d 2e 20 54  Pager.aStat[]. T
8490: 68 65 20 50 61 67 65 72 2e 61 53 74 61 74 5b 5d  he Pager.aStat[]
84a0: 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 0a   array contains.
84b0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 73 20 61 63  ** the values ac
84c0: 63 65 73 73 65 64 20 62 79 20 70 61 73 73 69 6e  cessed by passin
84d0: 67 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  g SQLITE_DBSTATU
84e0: 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 43 41 43  S_CACHE_HIT, CAC
84f0: 48 45 5f 4d 49 53 53 20 0a 2a 2a 20 6f 72 20 43  HE_MISS .** or C
8500: 41 43 48 45 5f 57 52 49 54 45 20 74 6f 20 73 71  ACHE_WRITE to sq
8510: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
8520: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
8530: 47 45 52 5f 53 54 41 54 5f 48 49 54 20 20 20 30  GER_STAT_HIT   0
8540: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
8550: 54 41 54 5f 4d 49 53 53 20 20 31 0a 23 64 65 66  TAT_MISS  1.#def
8560: 69 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 57  ine PAGER_STAT_W
8570: 52 49 54 45 20 32 0a 0a 2f 2a 0a 2a 2a 20 54 68  RITE 2../*.** Th
8580: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
8590: 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c  al variables hol
85a0: 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20  d counters used 
85b0: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70  for.** testing p
85c0: 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54  urposes only.  T
85d0: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 64  hese variables d
85e0: 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a  o not exist in.*
85f0: 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20  * a non-testing 
8600: 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61  build.  These va
8610: 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20  riables are not 
8620: 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a  thread-safe..*/.
8630: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
8640: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  ST.int sqlite3_p
8650: 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
8660: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
8670: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
8680: 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a  s read from DB *
8690: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
86a0: 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
86b0: 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62  t = 0;   /* Numb
86c0: 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73  er of full pages
86d0: 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a   written to DB *
86e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
86f0: 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
8700: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
8710: 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74  er of pages writ
8720: 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  ten to journal *
8730: 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52  /.# define PAGER
8740: 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65  _INCR(v)  v++.#e
8750: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47  lse.# define PAG
8760: 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69  ER_INCR(v).#endi
8770: 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e  f..../*.** Journ
8780: 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77  al files begin w
8790: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
87a0: 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20  g magic string. 
87b0: 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73   The data.** was
87c0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f   obtained from /
87d0: 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20  dev/random.  It 
87e0: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20  is used only as 
87f0: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a  a sanity check..
8800: 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73  **.** Since vers
8810: 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a  ion 2.8.0, the j
8820: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
8830: 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61  ntains additiona
8840: 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63  l sanity.** chec
8850: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
8860: 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20  .  If the power 
8870: 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20  fails while the 
8880: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
8890: 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d  .** written, sem
88a0: 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65  i-random garbage
88b0: 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65   data might appe
88c0: 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ar in the journa
88d0: 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20  l.** file after 
88e0: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
88f0: 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70  d.  If an attemp
8900: 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a  t is then made.*
8910: 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f  * to roll the jo
8920: 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20  urnal back, the 
8930: 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
8940: 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68  e corrupted.  Th
8950: 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  e additional.** 
8960: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
8970: 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d  data is an attem
8980: 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  pt to discover t
8990: 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68  he garbage in th
89a0: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  e.** journal and
89b0: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a   ignore it..**.*
89c0: 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65  * The sanity che
89d0: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
89e0: 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f  n for the new jo
89f0: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
8a00: 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32  sists.** of a 32
8a10: 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e  -bit checksum on
8a20: 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61   each page of da
8a30: 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75  ta.  The checksu
8a40: 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a  m covers both.**
8a50: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
8a60: 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d   and the pPager-
8a70: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
8a80: 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  of data for the 
8a90: 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b  page..** This ck
8aa0: 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  sum is initializ
8ab0: 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72  ed to a 32-bit r
8ac0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74  andom value that
8ad0: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a   appears in the.
8ae0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
8af0: 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
8b00: 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e  header.  The ran
8b10: 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  dom initializer 
8b20: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a  is important,.**
8b30: 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65   because garbage
8b40: 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61   data that appea
8b50: 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
8b60: 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69   a journal is li
8b70: 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61  kely.** data tha
8b80: 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74  t was once in ot
8b90: 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68  her files that h
8ba0: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c  ave now been del
8bb0: 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a  eted.  If the.**
8bc0: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61   garbage data ca
8bd0: 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c  me from an obsol
8be0: 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
8bf0: 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  , the checksums 
8c00: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72  might.** be corr
8c10: 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69  ect.  But by ini
8c20: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68  tializing the ch
8c30: 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d  ecksum to random
8c40: 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20   value which.** 
8c50: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  is different for
8c60: 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20   every journal, 
8c70: 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74  we minimize that
8c80: 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   risk..*/.static
8c90: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
8ca0: 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  char aJournalMag
8cb0: 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c  ic[] = {.  0xd9,
8cc0: 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66   0xd5, 0x05, 0xf
8cd0: 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30  9, 0x20, 0xa1, 0
8ce0: 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f  x63, 0xd7,.};../
8cf0: 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
8d00: 20 74 68 65 20 6f 66 20 65 61 63 68 20 70 61 67   the of each pag
8d10: 65 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20  e record in the 
8d20: 6a 6f 75 72 6e 61 6c 20 69 73 20 67 69 76 65 6e  journal is given
8d30: 20 62 79 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f   by.** the follo
8d40: 77 69 6e 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23  wing macro..*/.#
8d50: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50  define JOURNAL_P
8d60: 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28  G_SZ(pPager)  ((
8d70: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
8d80: 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ) + 8)../*.** Th
8d90: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
8da0: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
8db0: 61 67 65 72 2e 20 54 68 69 73 20 69 73 20 75 73  ager. This is us
8dc0: 75 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 0a  ually the same .
8dd0: 2a 2a 20 73 69 7a 65 20 61 73 20 61 20 73 69 6e  ** size as a sin
8de0: 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  gle disk sector.
8df0: 20 53 65 65 20 61 6c 73 6f 20 73 65 74 53 65 63   See also setSec
8e00: 74 6f 72 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64  torSize()..*/.#d
8e10: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44  efine JOURNAL_HD
8e20: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50  R_SZ(pPager) (pP
8e30: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
8e40: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63  )../*.** The mac
8e50: 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65  ro MEMDB is true
8e60: 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69   if we are deali
8e70: 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65  ng with an in-me
8e80: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
8e90: 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20  * We do this as 
8ea0: 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20  a macro so that 
8eb0: 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d  if the SQLITE_OM
8ec0: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72  IT_MEMORYDB macr
8ed0: 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65  o is set,.** the
8ee0: 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20   value of MEMDB 
8ef0: 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61  will be a consta
8f00: 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69  nt and the compi
8f10: 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a  ler will optimiz
8f20: 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68  e.** out code th
8f30: 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65  at would never e
8f40: 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65  xecute..*/.#ifde
8f50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
8f60: 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20  MORYDB.# define 
8f70: 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20  MEMDB 0.#else.# 
8f80: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61  define MEMDB pPa
8f90: 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69  ger->memDb.#endi
8fa0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  f../*.** The max
8fb0: 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20  imum legal page 
8fc0: 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20  number is (2^31 
8fd0: 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  - 1)..*/.#define
8fe0: 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20   PAGER_MAX_PGNO 
8ff0: 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a  2147483647../*.*
9000: 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74  * The argument t
9010: 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20  o this macro is 
9020: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
9030: 72 20 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f  r (type sqlite3_
9040: 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72  file*)..** Retur
9050: 6e 20 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74  n 0 if it is not
9060: 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65   open, or non-ze
9070: 72 6f 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69  ro (but not 1) i
9080: 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54  f it is..**.** T
9090: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 65  his is so that e
90a0: 78 70 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62  xpressions can b
90b0: 65 20 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a  e written as:.**
90c0: 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e  .**   if( isOpen
90d0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
90e0: 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65   ....**.** inste
90f0: 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66  ad of.**.**   if
9100: 28 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70  ( pPager->jfd->p
9110: 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a  Methods ){ ....*
9120: 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e  /.#define isOpen
9130: 28 70 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d  (pFd) ((pFd)->pM
9140: 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 52  ethods)../*.** R
9150: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
9160: 69 73 20 70 61 67 65 72 20 75 73 65 73 20 61 20  is pager uses a 
9170: 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20  write-ahead log 
9180: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75  instead of the u
9190: 73 75 61 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  sual.** rollback
91a0: 20 6a 6f 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77   journal. Otherw
91b0: 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69  ise false..*/.#i
91c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
91d0: 54 5f 57 41 4c 0a 73 74 61 74 69 63 20 69 6e 74  T_WAL.static int
91e0: 20 70 61 67 65 72 55 73 65 57 61 6c 28 50 61 67   pagerUseWal(Pag
91f0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
9200: 65 74 75 72 6e 20 28 70 50 61 67 65 72 2d 3e 70  eturn (pPager->p
9210: 57 61 6c 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65  Wal!=0);.}.#else
9220: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 55  .# define pagerU
9230: 73 65 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66  seWal(x) 0.# def
9240: 69 6e 65 20 70 61 67 65 72 52 6f 6c 6c 62 61 63  ine pagerRollbac
9250: 6b 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69  kWal(x) 0.# defi
9260: 6e 65 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65  ne pagerWalFrame
9270: 73 28 76 2c 77 2c 78 2c 79 29 20 30 0a 23 20 64  s(v,w,x,y) 0.# d
9280: 65 66 69 6e 65 20 70 61 67 65 72 4f 70 65 6e 57  efine pagerOpenW
9290: 61 6c 49 66 50 72 65 73 65 6e 74 28 7a 29 20 53  alIfPresent(z) S
92a0: 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69 6e  QLITE_OK.# defin
92b0: 65 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  e pagerBeginRead
92c0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20 53  Transaction(z) S
92d0: 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
92e0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
92f0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a  ./*.** Usage:.**
9300: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73  .**   assert( as
9310: 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
9320: 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2a 0a 2a  (pPager) );.**.*
9330: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
9340: 72 75 6e 73 20 6d 61 6e 79 20 61 73 73 65 72 74  runs many assert
9350: 73 20 74 6f 20 74 72 79 20 74 6f 20 66 69 6e 64  s to try to find
9360: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 63 69 65 73   inconsistencies
9370: 20 69 6e 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72   in.** the inter
9380: 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
9390: 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 0a 2a   Pager object..*
93a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 73 73  /.static int ass
93b0: 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
93c0: 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 50 61 67  Pager *p){.  Pag
93d0: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 3b 0a  er *pPager = p;.
93e0: 0a 20 20 2f 2a 20 53 74 61 74 65 20 6d 75 73 74  .  /* State must
93f0: 20 62 65 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20   be valid. */.  
9400: 61 73 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74  assert( p->eStat
9410: 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 0a 20 20  e==PAGER_OPEN.  
9420: 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74       || p->eStat
9430: 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45 52 0a  e==PAGER_READER.
9440: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74         || p->eSt
9450: 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
9460: 52 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20  R_LOCKED.       
9470: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9480: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
9490: 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  MOD.       || p-
94a0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
94b0: 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20 20 20  RITER_DBMOD.    
94c0: 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d     || p->eState=
94d0: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49  =PAGER_WRITER_FI
94e0: 4e 49 53 48 45 44 0a 20 20 20 20 20 20 20 7c 7c  NISHED.       ||
94f0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9500: 52 5f 45 52 52 4f 52 0a 20 20 29 3b 0a 0a 20 20  R_ERROR.  );..  
9510: 2f 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  /* Regardless of
9520: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
9530: 74 65 2c 20 61 20 74 65 6d 70 2d 66 69 6c 65 20  te, a temp-file 
9540: 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 77 61 79  connection alway
9550: 73 20 62 65 68 61 76 65 73 0a 20 20 2a 2a 20 61  s behaves.  ** a
9560: 73 20 69 66 20 69 74 20 68 61 73 20 61 6e 20 65  s if it has an e
9570: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
9580: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
9590: 6c 65 2e 20 49 74 20 6e 65 76 65 72 20 75 70 64  le. It never upd
95a0: 61 74 65 73 0a 20 20 2a 2a 20 74 68 65 20 63 68  ates.  ** the ch
95b0: 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65  ange-counter fie
95c0: 6c 64 2c 20 73 6f 20 74 68 65 20 63 68 61 6e 67  ld, so the chang
95d0: 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
95e0: 69 73 20 61 6c 77 61 79 73 20 73 65 74 2e 0a 20  is always set.. 
95f0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
9600: 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20  >tempFile==0 || 
9610: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
9620: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  IVE_LOCK );.  as
9630: 73 65 72 74 28 20 70 2d 3e 74 65 6d 70 46 69 6c  sert( p->tempFil
9640: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
9650: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
9660: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
9670: 75 73 65 4a 6f 75 72 6e 61 6c 20 66 6c 61 67 20  useJournal flag 
9680: 69 73 20 63 6c 65 61 72 2c 20 74 68 65 20 6a 6f  is clear, the jo
9690: 75 72 6e 61 6c 2d 6d 6f 64 65 20 6d 75 73 74 20  urnal-mode must 
96a0: 62 65 20 22 4f 46 46 22 2e 20 0a 20 20 2a 2a 20  be "OFF". .  ** 
96b0: 41 6e 64 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  And if the journ
96c0: 61 6c 2d 6d 6f 64 65 20 69 73 20 22 4f 46 46 22  al-mode is "OFF"
96d0: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  , the journal fi
96e0: 6c 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 6f  le must not be o
96f0: 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pen..  */.  asse
9700: 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  rt( p->journalMo
9710: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9720: 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 70 2d 3e  LMODE_OFF || p->
9730: 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
9740: 61 73 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e  assert( p->journ
9750: 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
9760: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 7c 7c  URNALMODE_OFF ||
9770: 20 21 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29   !isOpen(p->jfd)
9780: 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
9790: 74 68 61 74 20 4d 45 4d 44 42 20 69 6d 70 6c 69  that MEMDB impli
97a0: 65 73 20 6e 6f 53 79 6e 63 2e 20 41 6e 64 20 61  es noSync. And a
97b0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72  n in-memory jour
97c0: 6e 61 6c 2e 20 53 69 6e 63 65 20 0a 20 20 2a 2a  nal. Since .  **
97d0: 20 74 68 69 73 20 6d 65 61 6e 73 20 61 6e 20 69   this means an i
97e0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 70  n-memory pager p
97f0: 65 72 66 6f 72 6d 73 20 6e 6f 20 49 4f 20 61 74  erforms no IO at
9800: 20 61 6c 6c 2c 20 69 74 20 63 61 6e 6e 6f 74 20   all, it cannot 
9810: 65 6e 63 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20  encounter .  ** 
9820: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 49 4f  either SQLITE_IO
9830: 45 52 52 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  ERR or SQLITE_FU
9840: 4c 4c 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  LL during rollba
9850: 63 6b 20 6f 72 20 77 68 69 6c 65 20 66 69 6e 61  ck or while fina
9860: 6c 69 7a 69 6e 67 20 0a 20 20 2a 2a 20 61 20 6a  lizing .  ** a j
9870: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 28 61 6c  ournal file. (al
9880: 74 68 6f 75 67 68 20 74 68 65 20 69 6e 2d 6d 65  though the in-me
9890: 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 69 6d 70  mory journal imp
98a0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20  lementation may 
98b0: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
98c0: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
98d0: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
98e0: 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20  l file is being 
98f0: 77 72 69 74 74 65 6e 29 2e 20 49 74 20 0a 20 20  written). It .  
9900: 2a 2a 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  ** is therefore 
9910: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
9920: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
9930: 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65  ger to enter the
9940: 20 45 52 52 4f 52 20 0a 20 20 2a 2a 20 73 74 61   ERROR .  ** sta
9950: 74 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d  te..  */.  if( M
9960: 45 4d 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65  EMDB ){.    asse
9970: 72 74 28 20 70 2d 3e 6e 6f 53 79 6e 63 20 29 3b  rt( p->noSync );
9980: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9990: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
99a0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
99b0: 46 46 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  FF .         || 
99c0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
99d0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
99e0: 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 29 3b  E_MEMORY .    );
99f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9a00: 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45 52  eState!=PAGER_ER
9a10: 52 4f 52 20 26 26 20 70 2d 3e 65 53 74 61 74 65  ROR && p->eState
9a20: 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  !=PAGER_OPEN );.
9a30: 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
9a40: 72 55 73 65 57 61 6c 28 70 29 3d 3d 30 20 29 3b  rUseWal(p)==0 );
9a50: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 68  .  }..  /* If ch
9a60: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 69 73  angeCountDone is
9a70: 20 73 65 74 2c 20 61 20 52 45 53 45 52 56 45 44   set, a RESERVED
9a80: 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72   lock or greater
9a90: 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 20 20   must be held.  
9aa0: 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a  ** on the file..
9ab0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
9ac0: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
9ad0: 6e 74 44 6f 6e 65 3d 3d 30 20 7c 7c 20 70 50 61  ntDone==0 || pPa
9ae0: 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45  ger->eLock>=RESE
9af0: 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  RVED_LOCK );.  a
9b00: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21  ssert( p->eLock!
9b10: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
9b20: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65  ..  switch( p->e
9b30: 53 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73  State ){.    cas
9b40: 65 20 50 41 47 45 52 5f 4f 50 45 4e 3a 0a 20 20  e PAGER_OPEN:.  
9b50: 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
9b60: 44 42 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  DB );.      asse
9b70: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
9b80: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
9b90: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9ba0: 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
9bb0: 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
9bc0: 43 61 63 68 65 29 3d 3d 30 20 7c 7c 20 70 50 61  Cache)==0 || pPa
9bd0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
9be0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
9bf0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 52 45     case PAGER_RE
9c00: 41 44 45 52 3a 0a 20 20 20 20 20 20 61 73 73 65  ADER:.      asse
9c10: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
9c20: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
9c30: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9c40: 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57  p->eLock!=UNKNOW
9c50: 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  N_LOCK );.      
9c60: 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b  assert( p->eLock
9c70: 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
9c80: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
9c90: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
9ca0: 49 54 45 52 5f 4c 4f 43 4b 45 44 3a 0a 20 20 20  ITER_LOCKED:.   
9cb0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c     assert( p->eL
9cc0: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
9cd0: 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
9ce0: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
9cf0: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
9d00: 0a 20 20 20 20 20 20 69 66 28 20 21 70 61 67 65  .      if( !page
9d10: 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
9d20: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
9d30: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52 45 53  t( p->eLock>=RES
9d40: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
9d50: 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
9d60: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
9d70: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  ze==pPager->dbOr
9d80: 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  igSize );.      
9d90: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9da0: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
9db0: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
9dc0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9dd0: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
9de0: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze==pPager->dbHi
9df0: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
9e00: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9e10: 73 65 74 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a  setMaster==0 );.
9e20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
9e30: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
9e40: 54 45 52 5f 43 41 43 48 45 4d 4f 44 3a 0a 20 20  TER_CACHEMOD:.  
9e50: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
9e60: 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f  Lock!=UNKNOWN_LO
9e70: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
9e80: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
9e90: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
9ea0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 61 67  ;.      if( !pag
9eb0: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
9ec0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
9ed0: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68  t is possible th
9ee0: 61 74 20 69 66 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  at if journal_mo
9ef0: 64 65 3d 77 61 6c 20 68 65 72 65 20 74 68 61 74  de=wal here that
9f00: 20 6e 65 69 74 68 65 72 20 74 68 65 0a 20 20 20   neither the.   
9f10: 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
9f20: 66 69 6c 65 20 6e 6f 72 20 74 68 65 20 57 41 4c  file nor the WAL
9f30: 20 66 69 6c 65 20 61 72 65 20 6f 70 65 6e 2e 20   file are open. 
9f40: 54 68 69 73 20 68 61 70 70 65 6e 73 20 64 75 72  This happens dur
9f50: 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
9f60: 20 72 6f 6c 6c 62 61 63 6b 20 74 72 61 6e 73 61   rollback transa
9f70: 63 74 69 6f 6e 20 74 68 61 74 20 73 77 69 74 63  ction that switc
9f80: 68 65 73 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c  hes from journal
9f90: 5f 6d 6f 64 65 3d 6f 66 66 0a 20 20 20 20 20 20  _mode=off.      
9fa0: 20 20 2a 2a 20 74 6f 20 6a 6f 75 72 6e 61 6c 5f    ** to journal_
9fb0: 6d 6f 64 65 3d 77 61 6c 2e 0a 20 20 20 20 20 20  mode=wal..      
9fc0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
9fd0: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 52  ert( p->eLock>=R
9fe0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a  ESERVED_LOCK );.
9ff0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a000: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a  isOpen(p->jfd) .
a010: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a020: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a030: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a040: 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20  E_OFF .         
a050: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a060: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a070: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20  RNALMODE_WAL .  
a080: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
a090: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a0a0: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a0b0: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e==pPager->dbFil
a0c0: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  eSize );.      a
a0d0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a0e0: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a0f0: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
a100: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a110: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
a120: 49 54 45 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20  ITER_DBMOD:.    
a130: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a140: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
a150: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
a160: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a170: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a180: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a190: 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
a1a0: 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ger) );.      as
a1b0: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d  sert( p->eLock>=
a1c0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
a1d0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a1e0: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a  isOpen(p->jfd) .
a1f0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a200: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a210: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a220: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
a230: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a240: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a250: 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
a260: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a270: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a280: 69 7a 65 3c 3d 70 50 61 67 65 72 2d 3e 64 62 48  ize<=pPager->dbH
a290: 69 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  intSize );.     
a2a0: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
a2b0: 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 46  e PAGER_WRITER_F
a2c0: 49 4e 49 53 48 45 44 3a 0a 20 20 20 20 20 20 61  INISHED:.      a
a2d0: 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d  ssert( p->eLock=
a2e0: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
a2f0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a300: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a310: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
a320: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61       assert( !pa
a330: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
a340: 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
a350: 74 28 20 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64  t( isOpen(p->jfd
a360: 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ) .           ||
a370: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d   p->journalMode=
a380: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
a390: 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20  DE_OFF .        
a3a0: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
a3b0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a3c0: 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20  NALMODE_WAL .   
a3d0: 20 20 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61     );.      brea
a3e0: 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47  k;..    case PAG
a3f0: 45 52 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20 20  ER_ERROR:.      
a400: 2f 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  /* There must be
a410: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75   at least one ou
a420: 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
a430: 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 72  nce to the pager
a440: 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20   if.      ** in 
a450: 45 52 52 4f 52 20 73 74 61 74 65 2e 20 4f 74 68  ERROR state. Oth
a460: 65 72 77 69 73 65 20 74 68 65 20 70 61 67 65 72  erwise the pager
a470: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72   should have alr
a480: 65 61 64 79 20 64 72 6f 70 70 65 64 0a 20 20 20  eady dropped.   
a490: 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4f 50     ** back to OP
a4a0: 45 4e 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20  EN state..      
a4b0: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
a4c0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
a4d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
a4e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
a4f0: 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
a500: 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
a510: 68 65 29 3e 30 20 29 3b 0a 20 20 20 20 20 20 62  he)>0 );.      b
a520: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  reak;.  }..  ret
a530: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
a540: 2f 2a 20 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /* ifndef NDEBUG
a550: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
a560: 54 45 5f 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20  TE_DEBUG ./*.** 
a570: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
a580: 20 74 6f 20 61 20 68 75 6d 61 6e 20 72 65 61 64   to a human read
a590: 61 62 6c 65 20 73 74 72 69 6e 67 20 69 6e 20 61  able string in a
a5a0: 20 73 74 61 74 69 63 20 62 75 66 66 65 72 0a 2a   static buffer.*
a5b0: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
a5c0: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 61   state of the Pa
a5d0: 67 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ger object passe
a5e0: 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
a5f0: 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74  . This.** is int
a600: 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64  ended to be used
a610: 20 77 69 74 68 69 6e 20 64 65 62 75 67 67 65 72   within debugger
a620: 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s. For example, 
a630: 61 73 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  as an alternativ
a640: 65 0a 2a 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a  e.** to "print *
a650: 70 50 61 67 65 72 22 20 69 6e 20 67 64 62 3a 0a  pPager" in gdb:.
a660: 2a 2a 0a 2a 2a 20 28 67 64 62 29 20 70 72 69 6e  **.** (gdb) prin
a670: 74 66 20 22 25 73 22 2c 20 70 72 69 6e 74 5f 70  tf "%s", print_p
a680: 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
a690: 72 29 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  r).*/.static cha
a6a0: 72 20 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f 73  r *print_pager_s
a6b0: 74 61 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a  tate(Pager *p){.
a6c0: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 52    static char zR
a6d0: 65 74 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c  et[1024];..  sql
a6e0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30  ite3_snprintf(10
a6f0: 32 34 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20 20  24, zRet,.      
a700: 22 46 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20  "Filename:      
a710: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 53 74 61  %s\n".      "Sta
a720: 74 65 3a 20 20 20 20 20 20 20 20 20 25 73 20 65  te:         %s e
a730: 72 72 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20  rrCode=%d\n".   
a740: 20 20 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20     "Lock:       
a750: 20 20 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22     %s\n".      "
a760: 4c 6f 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c  Locking mode:  l
a770: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e  ocking_mode=%s\n
a780: 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c  ".      "Journal
a790: 20 6d 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f   mode:  journal_
a7a0: 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20  mode=%s\n".     
a7b0: 20 22 42 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a   "Backing store:
a7c0: 20 74 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d   tempFile=%d mem
a7d0: 44 62 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c  Db=%d useJournal
a7e0: 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f  =%d\n".      "Jo
a7f0: 75 72 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75  urnal:       jou
a800: 72 6e 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75  rnalOff=%lld jou
a810: 72 6e 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a  rnalHdr=%lld\n".
a820: 20 20 20 20 20 20 22 53 69 7a 65 3a 20 20 20 20        "Size:    
a830: 20 20 20 20 20 20 64 62 73 69 7a 65 3d 25 64 20        dbsize=%d 
a840: 64 62 4f 72 69 67 53 69 7a 65 3d 25 64 20 64 62  dbOrigSize=%d db
a850: 46 69 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20  FileSize=%d\n". 
a860: 20 20 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e       , p->zFilen
a870: 61 6d 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65  ame.      , p->e
a880: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
a890: 4e 20 20 20 20 20 20 20 20 20 20 20 20 3f 20 22  N            ? "
a8a0: 4f 50 45 4e 22 20 3a 0a 20 20 20 20 20 20 20 20  OPEN" :.        
a8b0: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
a8c0: 5f 52 45 41 44 45 52 20 20 20 20 20 20 20 20 20  _READER         
a8d0: 20 3f 20 22 52 45 41 44 45 52 22 20 3a 0a 20 20   ? "READER" :.  
a8e0: 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d        p->eState=
a8f0: 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f  =PAGER_WRITER_LO
a900: 43 4b 45 44 20 20 20 3f 20 22 57 52 49 54 45 52  CKED   ? "WRITER
a910: 5f 4c 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20 20  _LOCKED" :.     
a920: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
a930: 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45  GER_WRITER_CACHE
a940: 4d 4f 44 20 3f 20 22 57 52 49 54 45 52 5f 43 41  MOD ? "WRITER_CA
a950: 43 48 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20  CHEMOD" :.      
a960: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47    p->eState==PAG
a970: 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20  ER_WRITER_DBMOD 
a980: 20 20 20 3f 20 22 57 52 49 54 45 52 5f 44 42 4d     ? "WRITER_DBM
a990: 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  OD" :.        p-
a9a0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
a9b0: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 3f  RITER_FINISHED ?
a9c0: 20 22 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45   "WRITER_FINISHE
a9d0: 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  D" :.        p->
a9e0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52  eState==PAGER_ER
a9f0: 52 4f 52 20 20 20 20 20 20 20 20 20 20 20 3f 20  ROR           ? 
aa00: 22 45 52 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f  "ERROR" : "?erro
aa10: 72 3f 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74  r?".      , (int
aa20: 29 70 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20  )p->errCode.    
aa30: 20 20 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f    , p->eLock==NO
aa40: 5f 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 3f 20  _LOCK         ? 
aa50: 22 4e 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20  "NO_LOCK" :.    
aa60: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45      p->eLock==RE
aa70: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20  SERVED_LOCK   ? 
aa80: 22 52 45 53 45 52 56 45 44 22 20 3a 0a 20 20 20  "RESERVED" :.   
aa90: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45       p->eLock==E
aaa0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f  XCLUSIVE_LOCK  ?
aab0: 20 22 45 58 43 4c 55 53 49 56 45 22 20 3a 0a 20   "EXCLUSIVE" :. 
aac0: 20 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d         p->eLock=
aad0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20  =SHARED_LOCK    
aae0: 20 3f 20 22 53 48 41 52 45 44 22 20 3a 0a 20 20   ? "SHARED" :.  
aaf0: 20 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d        p->eLock==
ab00: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20  UNKNOWN_LOCK    
ab10: 3f 20 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f  ? "UNKNOWN" : "?
ab20: 65 72 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20  error?".      , 
ab30: 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  p->exclusiveMode
ab40: 20 3f 20 22 65 78 63 6c 75 73 69 76 65 22 20 3a   ? "exclusive" :
ab50: 20 22 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20   "normal".      
ab60: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  , p->journalMode
ab70: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
ab80: 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22  ODE_MEMORY   ? "
ab90: 6d 65 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20 20  memory" :.      
aba0: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
abb0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
abc0: 4f 44 45 5f 4f 46 46 20 20 20 20 20 20 3f 20 22  ODE_OFF      ? "
abd0: 6f 66 66 22 20 3a 0a 20 20 20 20 20 20 20 20 70  off" :.        p
abe0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
abf0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
ac00: 5f 44 45 4c 45 54 45 20 20 20 3f 20 22 64 65 6c  _DELETE   ? "del
ac10: 65 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ete" :.        p
ac20: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
ac30: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
ac40: 5f 50 45 52 53 49 53 54 20 20 3f 20 22 70 65 72  _PERSIST  ? "per
ac50: 73 69 73 74 22 20 3a 0a 20 20 20 20 20 20 20 20  sist" :.        
ac60: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
ac70: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
ac80: 45 5f 54 52 55 4e 43 41 54 45 20 3f 20 22 74 72  E_TRUNCATE ? "tr
ac90: 75 6e 63 61 74 65 22 20 3a 0a 20 20 20 20 20 20  uncate" :.      
aca0: 20 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65    p->journalMode
acb0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
acc0: 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 3f 20 22  ODE_WAL      ? "
acd0: 77 61 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  wal" : "?error?"
ace0: 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d  .      , (int)p-
acf0: 3e 74 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29  >tempFile, (int)
ad00: 70 2d 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70  p->memDb, (int)p
ad10: 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20  ->useJournal.   
ad20: 20 20 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f     , p->journalO
ad30: 66 66 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64  ff, p->journalHd
ad40: 72 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  r.      , (int)p
ad50: 2d 3e 64 62 53 69 7a 65 2c 20 28 69 6e 74 29 70  ->dbSize, (int)p
ad60: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 2c 20 28 69  ->dbOrigSize, (i
ad70: 6e 74 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65  nt)p->dbFileSize
ad80: 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  .  );..  return 
ad90: 7a 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  zRet;.}.#endif..
ada0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
adb0: 65 20 69 66 20 69 74 20 69 73 20 6e 65 63 65 73  e if it is neces
adc0: 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 70 61  sary to write pa
add0: 67 65 20 2a 70 50 67 20 69 6e 74 6f 20 74 68 65  ge *pPg into the
ade0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   sub-journal..**
adf0: 20 41 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f   A page needs to
ae00: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
ae10: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
ae20: 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
ae30: 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20   one.** or more 
ae40: 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
ae50: 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a  for which:.**.**
ae60: 20 20 20 2a 20 54 68 65 20 70 61 67 65 2d 6e 75     * The page-nu
ae70: 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61  mber is less tha
ae80: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 50 61  n or equal to Pa
ae90: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72  gerSavepoint.nOr
aea0: 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  ig, and.**   * T
aeb0: 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  he bit correspon
aec0: 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65  ding to the page
aed0: 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 73  -number is not s
aee0: 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67  et in.**     Pag
aef0: 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
af00: 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  avepoint..*/.sta
af10: 74 69 63 20 69 6e 74 20 73 75 62 6a 52 65 71 75  tic int subjRequ
af20: 69 72 65 73 50 61 67 65 28 50 67 48 64 72 20 2a  iresPage(PgHdr *
af30: 70 50 67 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  pPg){.  Pgno pgn
af40: 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  o = pPg->pgno;. 
af50: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
af60: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
af70: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
af80: 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76  ; i<pPager->nSav
af90: 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  epoint; i++){.  
afa0: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
afb0: 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61   *p = &pPager->a
afc0: 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20  Savepoint[i];.  
afd0: 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d    if( p->nOrig>=
afe0: 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74  pgno && 0==sqlit
aff0: 65 33 42 69 74 76 65 63 54 65 73 74 28 70 2d 3e  e3BitvecTest(p->
b000: 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67  pInSavepoint, pg
b010: 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  no) ){.      ret
b020: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
b030: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
b040: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
b050: 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
b060: 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
b070: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f  journal file..*/
b080: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
b090: 49 6e 4a 6f 75 72 6e 61 6c 28 50 67 48 64 72 20  InJournal(PgHdr 
b0a0: 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
b0b0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
b0c0: 74 28 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70  t(pPg->pPager->p
b0d0: 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
b0e0: 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pgno);.}../*.** 
b0f0: 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e  Read a 32-bit in
b100: 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67  teger from the g
b110: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
b120: 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65  ptor.  Store the
b130: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74   integer.** that
b140: 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65   is read in *pRe
b150: 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s.  Return SQLIT
b160: 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
b170: 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e  ng worked, or an
b180: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
b190: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
b1a0: 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c   wrong..**.** Al
b1b0: 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f  l values are sto
b1c0: 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62  red on disk as b
b1d0: 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74  ig-endian..*/.st
b1e0: 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62  atic int read32b
b1f0: 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  its(sqlite3_file
b200: 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *fd, i64 offset
b210: 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20  , u32 *pRes){.  
b220: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63  unsigned char ac
b230: 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  [4];.  int rc = 
b240: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64  sqlite3OsRead(fd
b250: 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29  , ac, sizeof(ac)
b260: 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28  , offset);.  if(
b270: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
b280: 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73 71  {.    *pRes = sq
b290: 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 61 63  lite3Get4byte(ac
b2a0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
b2b0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  rc;.}../*.** Wri
b2c0: 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  te a 32-bit inte
b2d0: 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e  ger into a strin
b2e0: 67 20 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d  g buffer in big-
b2f0: 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65  endian byte orde
b300: 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75  r..*/.#define pu
b310: 74 33 32 62 69 74 73 28 41 2c 42 29 20 20 73 71  t32bits(A,B)  sq
b320: 6c 69 74 65 33 50 75 74 34 62 79 74 65 28 28 75  lite3Put4byte((u
b330: 38 2a 29 41 2c 42 29 0a 0a 0a 2f 2a 0a 2a 2a 20  8*)A,B).../*.** 
b340: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
b350: 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20  nteger into the 
b360: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
b370: 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53  iptor.  Return S
b380: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
b390: 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
b3a0: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
b3b0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
b3c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
b3d0: 72 69 74 65 33 32 62 69 74 73 28 73 71 6c 69 74  rite32bits(sqlit
b3e0: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
b3f0: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c   offset, u32 val
b400: 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b  ){.  char ac[4];
b410: 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c  .  put32bits(ac,
b420: 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20   val);.  return 
b430: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66  sqlite3OsWrite(f
b440: 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74  d, ac, 4, offset
b450: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f  );.}../*.** Unlo
b460: 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ck the database 
b470: 66 69 6c 65 20 74 6f 20 6c 65 76 65 6c 20 65 4c  file to level eL
b480: 6f 63 6b 2c 20 77 68 69 63 68 20 6d 75 73 74 20  ock, which must 
b490: 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
b4a0: 4b 0a 2a 2a 20 6f 72 20 53 48 41 52 45 44 5f 4c  K.** or SHARED_L
b4b0: 4f 43 4b 2e 20 52 65 67 61 72 64 6c 65 73 73 20  OCK. Regardless 
b4c0: 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  of whether or no
b4d0: 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78 55  t the call to xU
b4e0: 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 73 75 63 63 65  nlock().** succe
b4f0: 65 64 73 2c 20 73 65 74 20 74 68 65 20 50 61 67  eds, set the Pag
b500: 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c  er.eLock variabl
b510: 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 28  e to match the (
b520: 61 74 74 65 6d 70 74 65 64 29 20 6e 65 77 20 6c  attempted) new l
b530: 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70  ock..**.** Excep
b540: 74 2c 20 69 66 20 50 61 67 65 72 2e 65 4c 6f 63  t, if Pager.eLoc
b550: 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e 4b 4e  k is set to UNKN
b560: 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68  OWN_LOCK when th
b570: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a  is function is.*
b580: 2a 20 63 61 6c 6c 65 64 2c 20 64 6f 20 6e 6f 74  * called, do not
b590: 20 6d 6f 64 69 66 79 20 69 74 2e 20 53 65 65 20   modify it. See 
b5a0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
b5b0: 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66  e the #define of
b5c0: 20 0a 2a 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43   .** UNKNOWN_LOC
b5d0: 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  K for an explana
b5e0: 74 69 6f 6e 20 6f 66 20 74 68 69 73 2e 0a 2a 2f  tion of this..*/
b5f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
b600: 72 55 6e 6c 6f 63 6b 44 62 28 50 61 67 65 72 20  rUnlockDb(Pager 
b610: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4c 6f  *pPager, int eLo
b620: 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ck){.  int rc = 
b630: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
b640: 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 65  sert( !pPager->e
b650: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20  xclusiveMode || 
b660: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 65  pPager->eLock==e
b670: 4c 6f 63 6b 20 29 3b 0a 20 20 61 73 73 65 72 74  Lock );.  assert
b680: 28 20 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ( eLock==NO_LOCK
b690: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45   || eLock==SHARE
b6a0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
b6b0: 72 74 28 20 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f  rt( eLock!=NO_LO
b6c0: 43 4b 20 7c 7c 20 70 61 67 65 72 55 73 65 57 61  CK || pagerUseWa
b6d0: 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  l(pPager)==0 );.
b6e0: 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
b6f0: 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
b700: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
b710: 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 20 29 3b 0a  eLock>=eLock );.
b720: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b730: 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  OsUnlock(pPager-
b740: 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20  >fd, eLock);.   
b750: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f   if( pPager->eLo
b760: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
b770: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
b780: 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75 38 29 65 4c  ->eLock = (u8)eL
b790: 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49  ock;.    }.    I
b7a0: 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  OTRACE(("UNLOCK 
b7b0: 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
b7c0: 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 7d 0a 20 20  , eLock)).  }.  
b7d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
b7e0: 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 64 61 74  .** Lock the dat
b7f0: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c 65  abase file to le
b800: 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63 68  vel eLock, which
b810: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
b820: 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20  SHARED_LOCK,.** 
b830: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72  RESERVED_LOCK or
b840: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e   EXCLUSIVE_LOCK.
b850: 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69   If the caller i
b860: 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  s successful, se
b870: 74 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 65  t the.** Pager.e
b880: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f  Lock variable to
b890: 20 74 68 65 20 6e 65 77 20 6c 6f 63 6b 69 6e 67   the new locking
b8a0: 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 45   state. .**.** E
b8b0: 78 63 65 70 74 2c 20 69 66 20 50 61 67 65 72 2e  xcept, if Pager.
b8c0: 65 4c 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20  eLock is set to 
b8d0: 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 77 68 65  UNKNOWN_LOCK whe
b8e0: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
b8f0: 69 73 20 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 64  is .** called, d
b900: 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69 74 20  o not modify it 
b910: 75 6e 6c 65 73 73 20 74 68 65 20 6e 65 77 20 6c  unless the new l
b920: 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 69 73 20  ocking state is 
b930: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 20  EXCLUSIVE_LOCK. 
b940: 0a 2a 2a 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  .** See the comm
b950: 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64  ent above the #d
b960: 65 66 69 6e 65 20 6f 66 20 55 4e 4b 4e 4f 57 4e  efine of UNKNOWN
b970: 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70  _LOCK for an exp
b980: 6c 61 6e 61 74 69 6f 6e 20 0a 2a 2a 20 6f 66 20  lanation .** of 
b990: 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  this..*/.static 
b9a0: 69 6e 74 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  int pagerLockDb(
b9b0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
b9c0: 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  nt eLock){.  int
b9d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
b9e0: 0a 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ..  assert( eLoc
b9f0: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
ba00: 7c 20 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  | eLock==RESERVE
ba10: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  D_LOCK || eLock=
ba20: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
ba30: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
ba40: 3e 65 4c 6f 63 6b 3c 65 4c 6f 63 6b 20 7c 7c 20  >eLock<eLock || 
ba50: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55  pPager->eLock==U
ba60: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 7b 0a 20  NKNOWN_LOCK ){. 
ba70: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
ba80: 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
ba90: 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66  , eLock);.    if
baa0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
bab0: 26 26 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  && (pPager->eLoc
bac0: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 7c  k!=UNKNOWN_LOCK|
bad0: 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  |eLock==EXCLUSIV
bae0: 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20  E_LOCK) ){.     
baf0: 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d   pPager->eLock =
bb00: 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20   (u8)eLock;.    
bb10: 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b    IOTRACE(("LOCK
bb20: 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
bb30: 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20 20 7d  r, eLock)).    }
bb40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
bb50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
bb60: 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69  function determi
bb70: 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e  nes whether or n
bb80: 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ot the atomic-wr
bb90: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
bba0: 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20  .** can be used 
bbb0: 77 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e  with this pager.
bbc0: 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   The optimizatio
bbd0: 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66  n can be used if
bbe0: 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65  :.**.**  (a) the
bbf0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
bc00: 62 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61  by OsDeviceChara
bc10: 63 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64  cteristics() ind
bc20: 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20  icates that.**  
bc30: 20 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70      a database p
bc40: 61 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74  age may be writt
bc50: 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61  en atomically, a
bc60: 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76  nd.**  (b) the v
bc70: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
bc80: 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20   OsSectorSize() 
bc90: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
bca0: 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f  equal.**      to
bcb0: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a   the page size..
bcc0: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69  **.** The optimi
bcd0: 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61  zation is also a
bce0: 6c 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f  lways enabled fo
bcf0: 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
bd00: 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65  s. It is.** an e
bd10: 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69  rror to call thi
bd20: 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50  s function if pP
bd30: 61 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f  ager is opened o
bd40: 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  n an in-memory.*
bd50: 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  * database..**.*
bd60: 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  * If the optimiz
bd70: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ation cannot be 
bd80: 75 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72  used, 0 is retur
bd90: 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62  ned. If it can b
bda0: 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  e used,.** then 
bdb0: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
bdc0: 65 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ed is the size o
bdd0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
bde0: 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f  le when it.** co
bdf0: 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20  ntains rollback 
be00: 64 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79  data for exactly
be10: 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   one page..*/.#i
be20: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
be30: 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
be40: 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42  static int jrnlB
be50: 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20  ufferSize(Pager 
be60: 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65  *pPager){.  asse
be70: 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
be80: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
be90: 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  pFile ){.    int
bea0: 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   dc;            
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bec0: 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74  * Device charact
bed0: 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20  eristics */.    
bee0: 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20  int nSector;    
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf00: 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65    /* Sector size
bf10: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61   */.    int szPa
bf20: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
bf30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
bf40: 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61  e size */..    a
bf50: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
bf60: 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20  ager->fd) );.   
bf70: 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   dc = sqlite3OsD
bf80: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
bf90: 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
bfa0: 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20  ;.    nSector = 
bfb0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
bfc0: 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d  ze;.    szPage =
bfd0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
bfe0: 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53  e;..    assert(S
bff0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
c000: 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
c010: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c  ;.    assert(SQL
c020: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
c030: 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29  64K==(65536>>8))
c040: 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63  ;.    if( 0==(dc
c050: 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
c060: 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38  TOMIC|(szPage>>8
c070: 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a  )) || nSector>sz
c080: 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72  Page) ){.      r
c090: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
c0a0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55   }..  return JOU
c0b0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
c0c0: 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47  er) + JOURNAL_PG
c0d0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23  _SZ(pPager);.}.#
c0e0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
c0f0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
c100: 45 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68  ES is defined th
c110: 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61  en we do some sa
c120: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  nity checking.**
c130: 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73   on the cache us
c140: 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74  ing a hash funct
c150: 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73  ion.  This is us
c160: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a  ed for testing.*
c170: 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  * and debugging 
c180: 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  only..*/.#ifdef 
c190: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
c1a0: 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ES./*.** Return 
c1b0: 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66  a 32-bit hash of
c1c0: 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66   the page data f
c1d0: 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  or pPage..*/.sta
c1e0: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61  tic u32 pager_da
c1f0: 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65  tahash(int nByte
c200: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
c210: 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68  *pData){.  u32 h
c220: 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ash = 0;.  int i
c230: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
c240: 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Byte; i++){.    
c250: 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33  hash = (hash*103
c260: 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20  9) + pData[i];. 
c270: 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68   }.  return hash
c280: 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70  ;.}.static u32 p
c290: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67  ager_pagehash(Pg
c2a0: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72  Hdr *pPage){.  r
c2b0: 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61  eturn pager_data
c2c0: 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67  hash(pPage->pPag
c2d0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75  er->pageSize, (u
c2e0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
c2f0: 50 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a  Page->pData);.}.
c300: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
c310: 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50  r_set_pagehash(P
c320: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
c330: 70 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20  pPage->pageHash 
c340: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
c350: 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pPage);.}../*.*
c360: 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45  * The CHECK_PAGE
c370: 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50   macro takes a P
c380: 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75  gHdr* as an argu
c390: 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f  ment. If SQLITE_
c3a0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69  CHECK_PAGES.** i
c3b0: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e  s defined, and N
c3c0: 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66  DEBUG is not def
c3d0: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
c3e0: 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63  ) statement chec
c3f0: 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70  ks.** that the p
c400: 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69  age is either di
c410: 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74  rty or still mat
c420: 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61  ches the calcula
c430: 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a  ted page-hash..*
c440: 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  /.#define CHECK_
c450: 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67  PAGE(x) checkPag
c460: 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64  e(x).static void
c470: 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72   checkPage(PgHdr
c480: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
c490: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
c4a0: 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28  Pager;.  assert(
c4b0: 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
c4c0: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
c4d0: 20 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e    assert( (pPg->
c4e0: 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
c4f0: 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48  Y) || pPg->pageH
c500: 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68  ash==pager_pageh
c510: 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23  ash(pPg) );.}..#
c520: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67  else.#define pag
c530: 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29  er_datahash(X,Y)
c540: 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65    0.#define page
c550: 72 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30  r_pagehash(X)  0
c560: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 73  .#define pager_s
c570: 65 74 5f 70 61 67 65 68 61 73 68 28 58 29 0a 23  et_pagehash(X).#
c580: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
c590: 45 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20  E(x).#endif  /* 
c5a0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
c5b0: 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  ES */../*.** Whe
c5c0: 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
c5d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
c5e0: 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
c5f0: 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  er must be open.
c600: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
c610: 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  n attempts to re
c620: 61 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ad a master jour
c630: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66 72  nal file name fr
c640: 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f  om the .** end o
c650: 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 2c 20  f the file and, 
c660: 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63  if successful, c
c670: 6f 70 69 65 73 20 69 74 20 69 6e 74 6f 20 6d 65  opies it into me
c680: 6d 6f 72 79 20 73 75 70 70 6c 69 65 64 20 0a 2a  mory supplied .*
c690: 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  * by the caller.
c6a0: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62   See comments ab
c6b0: 6f 76 65 20 77 72 69 74 65 4d 61 73 74 65 72 4a  ove writeMasterJ
c6c0: 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 74 68 65  ournal() for the
c6d0: 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20   format.** used 
c6e0: 74 6f 20 73 74 6f 72 65 20 61 20 6d 61 73 74 65  to store a maste
c6f0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
c700: 61 6d 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ame at the end o
c710: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  f a journal file
c720: 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20  ..**.** zMaster 
c730: 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20  must point to a 
c740: 62 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61  buffer of at lea
c750: 73 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73  st nMaster bytes
c760: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a   allocated by.**
c770: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69   the caller. Thi
c780: 73 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69  s should be sqli
c790: 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61  te3_vfs.mxPathna
c7a0: 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20  me+1 (to ensure 
c7b0: 74 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75  there is.** enou
c7c0: 67 68 20 73 70 61 63 65 20 74 6f 20 77 72 69 74  gh space to writ
c7d0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
c7e0: 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74  rnal name). If t
c7f0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
c800: 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65  l.** name in the
c810: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67   journal is long
c820: 65 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20  er than nMaster 
c830: 62 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67  bytes (including
c840: 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e   a.** nul-termin
c850: 61 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73  ator), then this
c860: 20 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69   is handled as i
c870: 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  f no master jour
c880: 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65  nal name.** were
c890: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
c8a0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
c8b0: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
c8c0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
c8d0: 70 72 65 73 65 6e 74 20 61 74 20 74 68 65 20 65  present at the e
c8e0: 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
c8f0: 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20  l.** file, then 
c900: 69 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74  it is copied int
c910: 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  o the buffer poi
c920: 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74  nted to by zMast
c930: 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72  er. A.** nul-ter
c940: 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20  minator byte is 
c950: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
c960: 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67  buffer following
c970: 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a   the master.** j
c980: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
c990: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73  ..**.** If it is
c9a0: 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74   determined that
c9b0: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
c9c0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
c9d0: 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73  present .** zMas
c9e0: 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f  ter[0] is set to
c9f0: 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
ca00: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
ca10: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
ca20: 75 72 73 20 77 68 69 6c 65 20 72 65 61 64 69 6e  urs while readin
ca30: 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  g from the journ
ca40: 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69  al file, an SQLi
ca50: 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  te.** error code
ca60: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
ca70: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
ca80: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71  MasterJournal(sq
ca90: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e  lite3_file *pJrn
caa0: 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  l, char *zMaster
cab0: 2c 20 75 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a  , u32 nMaster){.
cac0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
cad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cae0: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
caf0: 20 75 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20   u32 len;       
cb00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
cb10: 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f  ength in bytes o
cb20: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
cb30: 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73   name */.  i64 s
cb40: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
cb50: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
cb60: 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20  ize in bytes of 
cb70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72  journal file pJr
cb80: 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  nl */.  u32 cksu
cb90: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
cba0: 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75     /* MJ checksu
cbb0: 6d 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  m value read fro
cbc0: 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  m journal */.  u
cbd0: 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  32 u;           
cbe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
cbf0: 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74  igned loop count
cc00: 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  er */.  unsigned
cc10: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
cc20: 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74     /* A buffer t
cc30: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
cc40: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61   header */.  zMa
cc50: 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ster[0] = '\0';.
cc60: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
cc70: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
cc80: 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c  sFileSize(pJrnl,
cc90: 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a   &szJ)).   || sz
cca0: 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54  J<16.   || SQLIT
ccb0: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
ccc0: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a  32bits(pJrnl, sz
ccd0: 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20  J-16, &len)).   
cce0: 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20  || len>=nMaster 
ccf0: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
cd00: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
cd10: 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32  ts(pJrnl, szJ-12
cd20: 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c  , &cksum)).   ||
cd30: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
cd40: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
cd50: 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38  pJrnl, aMagic, 8
cd60: 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20  , szJ-8)).   || 
cd70: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
cd80: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
cd90: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
cda0: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
cdb0: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61  sRead(pJrnl, zMa
cdc0: 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31  ster, len, szJ-1
cdd0: 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20  6-len)).  ){.   
cde0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
cdf0: 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65  .  /* See if the
ce00: 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65   checksum matche
ce10: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
ce20: 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66  rnal name */.  f
ce30: 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75  or(u=0; u<len; u
ce40: 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d  ++){.    cksum -
ce50: 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20  = zMaster[u];.  
ce60: 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b  }.  if( cksum ){
ce70: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
ce80: 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20  hecksum doesn't 
ce90: 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65  add up, then one
cea0: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
ceb0: 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20  disk sectors.   
cec0: 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   ** containing t
ced0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
cee0: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f  l filename is co
cef0: 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65  rrupted. This me
cf00: 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e  ans.    ** defin
cf10: 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c  itely roll back,
cf20: 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20   so just return 
cf30: 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
cf40: 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20  port a (nul).   
cf50: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
cf60: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20  al filename..   
cf70: 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b   */.    len = 0;
cf80: 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c  .  }.  zMaster[l
cf90: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a  en] = '\0';.   .
cfa0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cfb0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
cfc0: 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 6f  urn the offset o
cfd0: 66 20 74 68 65 20 73 65 63 74 6f 72 20 62 6f 75  f the sector bou
cfe0: 6e 64 61 72 79 20 61 74 20 6f 72 20 69 6d 6d 65  ndary at or imme
cff0: 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c  diately .** foll
d000: 6f 77 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  owing the value 
d010: 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  in pPager->journ
d020: 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67 20  alOff, assuming 
d030: 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a  a sector .** siz
d040: 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 73 65 63  e of pPager->sec
d050: 74 6f 72 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a  torSize bytes..*
d060: 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73  *.** i.e for a s
d070: 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31  ector size of 51
d080: 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72  2:.**.**   Pager
d090: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20 20  .journalOff     
d0a0: 20 20 20 20 20 52 65 74 75 72 6e 20 76 61 6c 75       Return valu
d0b0: 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.**   ---------
d0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
d0e0: 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  *   0           
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
d100: 2a 2a 20 20 20 35 31 32 20 20 20 20 20 20 20 20  **   512        
d110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
d120: 31 32 0a 2a 2a 20 20 20 31 30 30 20 20 20 20 20  12.**   100     
d130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d140: 20 20 35 31 32 0a 2a 2a 20 20 20 32 30 30 30 20    512.**   2000 
d150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d160: 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f       2048.** .*/
d170: 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f 75 72  .static i64 jour
d180: 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50 61 67  nalHdrOffset(Pag
d190: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
d1a0: 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20  64 offset = 0;. 
d1b0: 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d   i64 c = pPager-
d1c0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69  >journalOff;.  i
d1d0: 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73  f( c ){.    offs
d1e0: 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52  et = ((c-1)/JOUR
d1f0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
d200: 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41  r) + 1) * JOURNA
d210: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
d220: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
d230: 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48  offset%JOURNAL_H
d240: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30  DR_SZ(pPager)==0
d250: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
d260: 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73  fset>=c );.  ass
d270: 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c  ert( (offset-c)<
d280: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
d290: 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
d2a0: 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a  rn offset;.}../*
d2b0: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
d2c0: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
d2d0: 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  n when this func
d2e0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
d2f0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
d300: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  ion is a no-op i
d310: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
d320: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
d330: 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69  written to.** wi
d340: 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  thin the current
d350: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e   transaction (i.
d360: 65 2e 20 69 66 20 50 61 67 65 72 2e 6a 6f 75 72  e. if Pager.jour
d370: 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a  nalOff==0)..**.*
d380: 2a 20 49 66 20 64 6f 54 72 75 6e 63 61 74 65 20  * If doTruncate 
d390: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74  is non-zero or t
d3a0: 68 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  he Pager.journal
d3b0: 53 69 7a 65 4c 69 6d 69 74 20 76 61 72 69 61 62  SizeLimit variab
d3c0: 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  le is.** set to 
d3d0: 30 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65  0, then truncate
d3e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d3f0: 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20  e to zero bytes 
d400: 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65 72 77 69  in size. Otherwi
d410: 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20  se,.** zero the 
d420: 32 38 2d 62 79 74 65 20 68 65 61 64 65 72 20 61  28-byte header a
d430: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
d440: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
d450: 20 49 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c   In either case,
d460: 20 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65   .** if the page
d470: 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73  r is not in no-s
d480: 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74  ync mode, sync t
d490: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
d4a0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20  immediately .** 
d4b0: 61 66 74 65 72 20 77 72 69 74 69 6e 67 20 6f 72  after writing or
d4c0: 20 74 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a   truncating it..
d4d0: 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a  **.** If Pager.j
d4e0: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
d4f0: 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 73 69  is set to a posi
d500: 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76  tive, non-zero v
d510: 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c  alue, and.** fol
d520: 6c 6f 77 69 6e 67 20 74 68 65 20 74 72 75 6e 63  lowing the trunc
d530: 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67  ation or zeroing
d540: 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
d550: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
d560: 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   .** journal fil
d570: 65 20 69 6e 20 62 79 74 65 73 20 69 73 20 6c 61  e in bytes is la
d580: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 76  rger than this v
d590: 61 6c 75 65 2c 20 74 68 65 6e 20 74 72 75 6e 63  alue, then trunc
d5a0: 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  ate the.** journ
d5b0: 61 6c 20 66 69 6c 65 20 74 6f 20 50 61 67 65 72  al file to Pager
d5c0: 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  .journalSizeLimi
d5d0: 74 20 62 79 74 65 73 2e 20 54 68 65 20 6a 6f 75  t bytes. The jou
d5e0: 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a  rnal file does.*
d5f0: 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  * not need to be
d600: 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e   synced followin
d610: 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  g this operation
d620: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
d630: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
d640: 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e  bandon processin
d650: 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  g and return the
d660: 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   IO error code..
d670: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
d680: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
d690: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65  */.static int ze
d6a0: 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  roJournalHdr(Pag
d6b0: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
d6c0: 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69  doTruncate){.  i
d6d0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
d6e0: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
d6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d700: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
d710: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
d720: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
d730: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
d740: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a  ->journalOff ){.
d750: 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20 69 4c      const i64 iL
d760: 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  imit = pPager->j
d770: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b  ournalSizeLimit;
d780: 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63      /* Local cac
d790: 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20  he of jsl */..  
d7a0: 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45 52    IOTRACE(("JZER
d7b0: 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61 67  OHDR %p\n", pPag
d7c0: 65 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f 54  er)).    if( doT
d7d0: 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d 69  runcate || iLimi
d7e0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
d7f0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
d800: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
d810: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
d820: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
d830: 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64 72  nst char zeroHdr
d840: 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20 20 20  [28] = {0};.    
d850: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
d860: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
d870: 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65  d, zeroHdr, size
d880: 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b  of(zeroHdr), 0);
d890: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
d8a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
d8b0: 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
d8c0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
d8d0: 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
d8e0: 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f  er->jfd, SQLITE_
d8f0: 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50  SYNC_DATAONLY|pP
d900: 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29  ager->syncFlags)
d910: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
d920: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
d930: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
d940: 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20 74   committed but t
d950: 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20  he write lock . 
d960: 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68     ** is still h
d970: 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e  eld on the file.
d980: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 73   If there is a s
d990: 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67  ize limit config
d9a0: 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ured for .    **
d9b0: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
d9c0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20  journal and the 
d9d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72  journal file cur
d9e0: 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20  rently consumes 
d9f0: 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61 63  more.    ** spac
da00: 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d 69  e than that limi
da10: 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72  t allows for, tr
da20: 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54  uncate it now. T
da30: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a  here is no need.
da40: 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74      ** to sync t
da50: 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e  he file followin
da60: 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  g this operation
da70: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
da80: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
da90: 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20  & iLimit>0 ){.  
daa0: 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20 20      i64 sz;.    
dab0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
dac0: 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
dad0: 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20  >jfd, &sz);.    
dae0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
daf0: 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74  _OK && sz>iLimit
db00: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
db10: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
db20: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
db30: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d  iLimit);.      }
db40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
db50: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
db60: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
db70: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
db80: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
db90: 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f   is called. A jo
dba0: 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20  urnal.** header 
dbb0: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
dbc0: 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74 65  bytes) is writte
dbd0: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
dbe0: 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a  al file at the.*
dbf0: 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  * current locati
dc00: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  on..**.** The fo
dc10: 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75  rmat for the jou
dc20: 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 61  rnal header is a
dc30: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20  s follows:.** - 
dc40: 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69  8 bytes: Magic i
dc50: 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e  dentifying journ
dc60: 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20  al format..** - 
dc70: 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20  4 bytes: Number 
dc80: 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f  of records in jo
dc90: 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d  urnal, or -1 no-
dca0: 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e  sync mode is on.
dcb0: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52  .** - 4 bytes: R
dcc0: 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65  andom number use
dcd0: 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e  d for page hash.
dce0: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49  .** - 4 bytes: I
dcf0: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
dd00: 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d  page count..** -
dd10: 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72   4 bytes: Sector
dd20: 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68   size used by th
dd30: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77  e process that w
dd40: 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61  rote this journa
dd50: 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  l..** - 4 bytes:
dd60: 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20 73   Database page s
dd70: 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c  ize..** .** Foll
dd80: 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c  owed by (JOURNAL
dd90: 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79  _HDR_SZ - 28) by
dda0: 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70  tes of unused sp
ddb0: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ace..*/.static i
ddc0: 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  nt writeJournalH
ddd0: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
dde0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
ddf0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
de00: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
de10: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61  rn code */.  cha
de20: 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50 61  r *zHeader = pPa
de30: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20  ger->pTmpSpace; 
de40: 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 70   /* Temporary sp
de50: 61 63 65 20 75 73 65 64 20 74 6f 20 62 75 69 6c  ace used to buil
de60: 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  d header */.  u3
de70: 32 20 6e 48 65 61 64 65 72 20 3d 20 28 75 33 32  2 nHeader = (u32
de80: 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
de90: 65 3b 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66  e;/* Size of buf
dea0: 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  fer pointed to b
deb0: 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20 20 75  y zHeader */.  u
dec0: 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20  32 nWrite;      
ded0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dee0: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 68     /* Bytes of h
def0: 65 61 64 65 72 20 73 65 63 74 6f 72 20 77 72 69  eader sector wri
df00: 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69  tten */.  int ii
df10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
df30: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
df40: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ..  assert( isOp
df50: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
df60: 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e  );      /* Journ
df70: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
df80: 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20  open. */..  if( 
df90: 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f  nHeader>JOURNAL_
dfa0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
dfb0: 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d 20  {.    nHeader = 
dfc0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
dfd0: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Pager);.  }..  /
dfe0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
dff0: 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
e000: 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 6d   and any of them
e010: 20 77 65 72 65 20 63 72 65 61 74 65 64 20 0a 20   were created . 
e020: 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20 6d 6f   ** since the mo
e030: 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61  st recent journa
e040: 6c 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69  l header was wri
e050: 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68 65  tten, update the
e060: 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65   .  ** PagerSave
e070: 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
e080: 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a   fields now..  *
e090: 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
e0a0: 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
e0b0: 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
e0c0: 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53 61 76  if( pPager->aSav
e0d0: 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f  epoint[ii].iHdrO
e0e0: 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ffset==0 ){.    
e0f0: 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70    pPager->aSavep
e100: 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66  oint[ii].iHdrOff
e110: 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  set = pPager->jo
e120: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a  urnalOff;.    }.
e130: 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a    }..  pPager->j
e140: 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67  ournalHdr = pPag
e150: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
e160: 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
e170: 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a  t(pPager);..  /*
e180: 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74 68 65   .  ** Write the
e190: 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20 74 68   nRec Field - th
e1a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
e1b0: 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f   records that fo
e1c0: 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a  llow this.  ** j
e1d0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e  ournal header. N
e1e0: 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73  ormally, zero is
e1f0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73   written to this
e200: 20 76 61 6c 75 65 20 61 74 20 74 68 69 73 20 74   value at this t
e210: 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20  ime..  ** After 
e220: 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65 20  the records are 
e230: 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75  added to the jou
e240: 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f  rnal (and the jo
e250: 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20  urnal synced, . 
e260: 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73   ** if in full-s
e270: 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a  ync mode), the z
e280: 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69 74 74  ero is overwritt
e290: 65 6e 20 77 69 74 68 20 74 68 65 20 74 72 75 65  en with the true
e2a0: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20   number.  ** of 
e2b0: 72 65 63 6f 72 64 73 20 28 73 65 65 20 73 79 6e  records (see syn
e2c0: 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a  cJournal())..  *
e2d0: 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65 72 20  *.  ** A faster 
e2e0: 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73 20 74  alternative is t
e2f0: 6f 20 77 72 69 74 65 20 30 78 46 46 46 46 46 46  o write 0xFFFFFF
e300: 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63 20 66  FF to the nRec f
e310: 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20  ield. When.  ** 
e320: 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72  reading the jour
e330: 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65 20 74  nal this value t
e340: 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f 20 61  ells SQLite to a
e350: 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 0a 20  ssume that the. 
e360: 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20   ** rest of the 
e370: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
e380: 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61 67 65  tains valid page
e390: 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73 20 61   records. This a
e3a0: 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69  ssumption.  ** i
e3b0: 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61 73 20  s dangerous, as 
e3c0: 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63  if a failure occ
e3d0: 75 72 72 65 64 20 77 68 69 6c 73 74 20 77 72 69  urred whilst wri
e3e0: 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72  ting to the jour
e3f0: 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74  nal.  ** file it
e400: 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d   may contain som
e410: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 2e 20  e garbage data. 
e420: 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 73 63  There are two sc
e430: 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65  enarios.  ** whe
e440: 72 65 20 74 68 69 73 20 72 69 73 6b 20 63 61 6e  re this risk can
e450: 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a   be ignored:.  *
e460: 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20  *.  **   * When 
e470: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
e480: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f  no-sync mode. Co
e490: 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c  rruption can fol
e4a0: 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20 20 70  low a.  **     p
e4b0: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69 6e 20  ower failure in 
e4c0: 74 68 69 73 20 63 61 73 65 20 61 6e 79 77 61 79  this case anyway
e4d0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20  ..  **.  **   * 
e4e0: 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  When the SQLITE_
e4f0: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
e500: 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54  D flag is set. T
e510: 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 0a 20  his guarantees. 
e520: 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67 61 72   **     that gar
e530: 62 61 67 65 20 64 61 74 61 20 69 73 20 6e 65 76  bage data is nev
e540: 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  er appended to t
e550: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
e560: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
e570: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
e580: 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f  d) || pPager->no
e590: 53 79 6e 63 20 29 3b 0a 20 20 69 66 28 20 70 50  Sync );.  if( pP
e5a0: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20  ager->noSync || 
e5b0: 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
e5c0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
e5d0: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a  NALMODE_MEMORY).
e5e0: 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73     || (sqlite3Os
e5f0: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
e600: 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
e610: 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
e620: 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29  AFE_APPEND) .  )
e630: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65  {.    memcpy(zHe
e640: 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  ader, aJournalMa
e650: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
e660: 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20  rnalMagic));.   
e670: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
e680: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
e690: 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66  nalMagic)], 0xff
e6a0: 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65  ffffff);.  }else
e6b0: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 48 65  {.    memset(zHe
e6c0: 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ader, 0, sizeof(
e6d0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
e6e0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
e6f0: 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61   random check-ha
e700: 73 68 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a  sh initializer *
e710: 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  / .  sqlite3_ran
e720: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70  domness(sizeof(p
e730: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
e740: 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  ), &pPager->cksu
e750: 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62  mInit);.  put32b
e760: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
e770: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
e780: 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63  c)+4], pPager->c
e790: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20  ksumInit);.  /* 
e7a0: 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61  The initial data
e7b0: 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  base size */.  p
e7c0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
e7d0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
e7e0: 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67  lMagic)+8], pPag
e7f0: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b  er->dbOrigSize);
e800: 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65  .  /* The assume
e810: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f  d sector size fo
e820: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a  r this process *
e830: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
e840: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
e850: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d  ournalMagic)+12]
e860: 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  , pPager->sector
e870: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  Size);..  /* The
e880: 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
e890: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
e8a0: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
e8b0: 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50  alMagic)+16], pP
e8c0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
e8d0: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
e8e0: 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20  ing the tail of 
e8f0: 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f  the buffer is no
e900: 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76  t necessary.  Ev
e910: 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f  erything.  ** wo
e920: 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65 20  rks find if the 
e930: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74  following memset
e940: 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20  () is omitted.  
e950: 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  But initializing
e960: 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79  .  ** the memory
e970: 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69   prevents valgri
e980: 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e  nd from complain
e990: 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77  ing, so we are w
e9a0: 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74  illing to.  ** t
e9b0: 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ake the performa
e9c0: 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20  nce hit..  */.  
e9d0: 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b  memset(&zHeader[
e9e0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
e9f0: 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20  agic)+20], 0,.  
ea00: 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28         nHeader-(
ea10: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
ea20: 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f  agic)+20));..  /
ea30: 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74 20  * In theory, it 
ea40: 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72  is only necessar
ea50: 79 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 32  y to write the 2
ea60: 38 20 62 79 74 65 73 20 74 68 61 74 20 74 68 65  8 bytes that the
ea70: 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68   .  ** journal h
ea80: 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20 74  eader consumes t
ea90: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
eaa0: 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69 6e  le here. Then in
eab0: 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a  crement the .  *
eac0: 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  * Pager.journalO
ead0: 66 66 20 76 61 72 69 61 62 6c 65 20 62 79 20 4a  ff variable by J
eae0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f  OURNAL_HDR_SZ so
eaf0: 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 0a   that the next .
eb00: 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 77    ** record is w
eb10: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 6f  ritten to the fo
eb20: 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20 28  llowing sector (
eb30: 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20 69 6e  leaving a gap in
eb40: 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74   the file.  ** t
eb50: 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c  hat will be impl
eb60: 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e  icitly filled in
eb70: 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a   by the OS)..  *
eb80: 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 69  *.  ** However i
eb90: 74 20 68 61 73 20 62 65 65 6e 20 64 69 73 63 6f  t has been disco
eba0: 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73 6f  vered that on so
ebb0: 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69 73 20  me systems this 
ebc0: 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a  pattern can .  *
ebd0: 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e 74  * be significant
ebe0: 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20 63  ly slower than c
ebf0: 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69 74  ontiguously writ
ec00: 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20  ing data to the 
ec10: 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20  file,.  ** even 
ec20: 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65 78  if that means ex
ec30: 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e 67  plicitly writing
ec40: 20 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c 6f   data to the blo
ec50: 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55  ck of .  ** (JOU
ec60: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
ec70: 29 20 62 79 74 65 73 20 74 68 61 74 20 77 69 6c  ) bytes that wil
ec80: 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 53  l not be used. S
ec90: 6f 20 74 68 61 74 20 69 73 20 77 68 61 74 0a 20  o that is what. 
eca0: 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20   ** is done. .  
ecb0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70  **.  ** The loop
ecc0: 20 69 73 20 72 65 71 75 69 72 65 64 20 68 65 72   is required her
ecd0: 65 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 65  e in case the se
ece0: 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72  ctor-size is lar
ecf0: 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20  ger than the .  
ed00: 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ** database page
ed10: 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68 65   size. Since the
ed20: 20 7a 48 65 61 64 65 72 20 62 75 66 66 65 72 20   zHeader buffer 
ed30: 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61  is only Pager.pa
ed40: 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65  geSize.  ** byte
ed50: 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20  s in size, more 
ed60: 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f  than one call to
ed70: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
ed80: 29 20 6d 61 79 20 62 65 20 72 65 71 75 69 72 65  ) may be require
ed90: 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61  d.  ** to popula
eda0: 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  te the entire jo
edb0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63  urnal header sec
edc0: 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72  tor..  */ .  for
edd0: 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53  (nWrite=0; rc==S
ede0: 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65  QLITE_OK&&nWrite
edf0: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
ee00: 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b  pPager); nWrite+
ee10: 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20 49  =nHeader){.    I
ee20: 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
ee30: 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
ee40: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
ee50: 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72  rnalHdr, nHeader
ee60: 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
ee70: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
ee80: 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
ee90: 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65 72   nHeader, pPager
eea0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
eeb0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
eec0: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d  r->journalHdr <=
eed0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
eee0: 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61 67 65  Off );.    pPage
eef0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
ef00: 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20   nHeader;.  }.. 
ef10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ef20: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
ef30: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
ef40: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  en when this is 
ef50: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
ef60: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a  l header file.**
ef70: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
ef80: 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20   bytes) is read 
ef90: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
efa0: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
efb0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
efc0: 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  . The current lo
efd0: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
efe0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67 69  urnal file is gi
eff0: 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65 72  ven by.** pPager
f000: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65  ->journalOff. Se
f010: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
f020: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a   function writeJ
f030: 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a  ournalHdr() for.
f040: 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  ** a description
f050: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
f060: 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a  header format..*
f070: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64  *.** If the head
f080: 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65  er is read succe
f090: 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20  ssfully, *pNRec 
f0a0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
f0b0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20  mber of.** page 
f0c0: 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e  records followin
f0d0: 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e  g this header an
f0e0: 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73 65  d *pDbSize is se
f0f0: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
f100: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
f110: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
f120: 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69  saction began, i
f130: 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70  n pages. Also, p
f140: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
f150: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68  .** is set to th
f160: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
f170: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
f180: 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  ader. SQLITE_OK 
f190: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
f1a0: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
f1b0: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
f1c0: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70  l header file ap
f1d0: 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72  pears to be corr
f1e0: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
f1f0: 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  NE is.** returne
f200: 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64  d and *pNRec and
f210: 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75 6e   *PDbSize are un
f220: 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55  defined.  If JOU
f230: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
f240: 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72  s.** cannot be r
f250: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
f260: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72  rnal file an err
f270: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
f280: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
f290: 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  nt readJournalHd
f2a0: 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
f2b0: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
f2c0: 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
f2d0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74  t */.  int isHot
f2e0: 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  ,.  i64 journalS
f2f0: 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
f300: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
f310: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
f320: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
f330: 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20 20  u32 *pNRec,     
f340: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f350: 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20  OUT: Value read 
f360: 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66 69  from the nRec fi
f370: 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44  eld */.  u32 *pD
f380: 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  bSize           
f390: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
f3a0: 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20  lue of original 
f3b0: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 69  database size fi
f3c0: 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  eld */.){.  int 
f3d0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
f3e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
f3f0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73  rn code */.  uns
f400: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
f410: 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62  c[8];     /* A b
f420: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
f430: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
f440: 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
f450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f460: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f   /* Offset of jo
f470: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65 69  urnal header bei
f480: 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73  ng read */..  as
f490: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
f4a0: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20  ger->jfd) );    
f4b0: 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c    /* Journal fil
f4c0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20  e must be open. 
f4d0: 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65  */..  /* Advance
f4e0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
f4f0: 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  f to the start o
f500: 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  f the next secto
f510: 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a  r. If the.  ** j
f520: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
f530: 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65  oo small for the
f540: 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64 65  re to be a heade
f550: 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69 73  r stored at this
f560: 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74  .  ** point, ret
f570: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
f580: 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
f590: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
f5a0: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
f5b0: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
f5c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
f5d0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
f5e0: 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c  Pager) > journal
f5f0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
f600: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
f610: 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
f620: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
f630: 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69  ff;..  /* Read i
f640: 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62 79  n the first 8 by
f650: 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
f660: 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74 68  al header. If th
f670: 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a  ey do not match.
f680: 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63 20    ** the  magic 
f690: 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74 20  string found at 
f6a0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
f6b0: 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  h journal header
f6c0: 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51  , return.  ** SQ
f6d0: 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e  LITE_DONE. If an
f6e0: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
f6f0: 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
f700: 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  r code. Otherwis
f710: 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e  e,.  ** proceed.
f720: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f  .  */.  if( isHo
f730: 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70 50  t || iHdrOff!=pP
f740: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
f750: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
f760: 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
f770: 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
f780: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20  sizeof(aMagic), 
f790: 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69 66  iHdrOff);.    if
f7a0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
f7b0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
f7c0: 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d     if( memcmp(aM
f7d0: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
f7e0: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
f7f0: 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ic))!=0 ){.     
f800: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
f810: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
f820: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69    /* Read the fi
f830: 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69 74  rst three 32-bit
f840: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6a   fields of the j
f850: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20 54  ournal header: T
f860: 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65  he nRec.  ** fie
f870: 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ld, the checksum
f880: 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e 64  -initializer and
f890: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
f8a0: 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74 0a  ze at the start.
f8b0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61 6e    ** of the tran
f8c0: 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20  saction. Return 
f8d0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
f8e0: 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
f8f0: 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rong..  */.  if(
f900: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
f910: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
f920: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
f930: 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20 20  f+8, pNRec)).   
f940: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
f950: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
f960: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
f970: 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d  Off+12, &pPager-
f980: 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20 20  >cksumInit)).   
f990: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
f9a0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
f9b0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
f9c0: 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65 29  Off+16, pDbSize)
f9d0: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
f9e0: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
f9f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fa00: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33  Off==0 ){.    u3
fa10: 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20 20  2 iPageSize;    
fa20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
fa30: 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  ge-size field of
fa40: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
fa50: 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63 74  */.    u32 iSect
fa60: 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  orSize;         
fa70: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69      /* Sector-si
fa80: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
fa90: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20  nal header */.. 
faa0: 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70     /* Read the p
fab0: 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
fac0: 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c  tor-size journal
fad0: 20 68 65 61 64 65 72 20 66 69 65 6c 64 73 2e 20   header fields. 
fae0: 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  */.    if( SQLIT
faf0: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
fb00: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
fb10: 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c 20  fd, iHdrOff+20, 
fb20: 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29 0a 20  &iSectorSize)). 
fb30: 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b      || SQLITE_OK
fb40: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
fb50: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
fb60: 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69 50 61  iHdrOff+24, &iPa
fb70: 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a  geSize)).    ){.
fb80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
fb90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56  .    }..    /* V
fba0: 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
fbb0: 65 20 70 72 69 6f 72 20 74 6f 20 33 2e 35 2e 38  e prior to 3.5.8
fbc0: 20 73 65 74 20 74 68 65 20 70 61 67 65 2d 73 69   set the page-si
fbd0: 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 0a  ze field of the.
fbe0: 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68      ** journal h
fbf0: 65 61 64 65 72 20 74 6f 20 7a 65 72 6f 2e 20 49  eader to zero. I
fc00: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61 73 73  n this case, ass
fc10: 75 6d 65 20 74 68 61 74 20 74 68 65 20 50 61 67  ume that the Pag
fc20: 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 20 20  er.pageSize.    
fc30: 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 61  ** variable is a
fc40: 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20 74 68  lready set to th
fc50: 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 20 73  e correct page s
fc60: 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
fc70: 69 66 28 20 69 50 61 67 65 53 69 7a 65 3d 3d 30  if( iPageSize==0
fc80: 20 29 7b 0a 20 20 20 20 20 20 69 50 61 67 65 53   ){.      iPageS
fc90: 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
fca0: 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20  geSize;.    }.. 
fcb0: 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
fcc0: 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 61 64   the values read
fcd0: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 2d 73   from the page-s
fce0: 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
fcf0: 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20 20 2a  ize fields.    *
fd00: 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e  * are within ran
fd10: 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20 72 61  ge. To be 'in ra
fd20: 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c 75 65  nge', both value
fd30: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61 20 70  s need to be a p
fd40: 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74  ower.    ** of t
fd50: 77 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  wo greater than 
fd60: 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31 32 20  or equal to 512 
fd70: 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74 20 67  or 32, and not g
fd80: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 69  reater than thei
fd90: 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65 63  r .    ** respec
fda0: 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d  tive compile tim
fdb0: 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73  e maximum limits
fdc0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
fdd0: 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20 20   iPageSize<512  
fde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdf0: 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c 33  || iSectorSize<3
fe00: 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65 53  2.     || iPageS
fe10: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
fe20: 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63  AGE_SIZE || iSec
fe30: 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54  torSize>MAX_SECT
fe40: 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20  OR_SIZE.     || 
fe50: 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26 69  ((iPageSize-1)&i
fe60: 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20 7c  PageSize)!=0   |
fe70: 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65 2d  | ((iSectorSize-
fe80: 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29 21  1)&iSectorSize)!
fe90: 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
fea0: 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68 65   /* If the eithe
feb0: 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  r the page-size 
fec0: 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  or sector-size i
fed0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65  n the journal-he
fee0: 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20 2a  ader is .      *
fef0: 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20  * invalid, then 
ff00: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
ff10: 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e   wrote the journ
ff20: 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20 68  al-header must h
ff30: 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 72  ave .      ** cr
ff40: 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68 65  ashed before the
ff50: 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e 63   header was sync
ff60: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
ff70: 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a 20   stop reading . 
ff80: 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72       ** the jour
ff90: 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a 20  nal file here.. 
ffa0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
ffb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
ffc0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
ffd0: 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65 2d  Update the page-
ffe0: 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
fff0: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
10000 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a  m the journal. .
10010 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65 73      ** Use a tes
10020 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74 6f  tcase() macro to
10030 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
10040 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 77  malloc failure w
10050 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61  ithin .    ** Pa
10060 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
10070 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20 20   is tested..    
10080 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
10090 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
100a0 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69 50 61  ize(pPager, &iPa
100b0 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a 20 20 20  geSize, -1);.   
100c0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
100d0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20  QLITE_OK );..   
100e0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
100f0 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69  ssumed sector-si
10100 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
10110 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20  value used by . 
10120 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73     ** the proces
10130 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74  s that created t
10140 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  his journal. If 
10150 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
10160 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
10170 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68  by a process oth
10180 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65  er than this one
10190 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
101a0 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 65  ine.    ** is be
101b0 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  ing called from 
101c0 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61  within pager_pla
101d0 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63  yback(). The loc
101e0 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20  al value.    ** 
101f0 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  of Pager.sectorS
10200 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  ize is restored 
10210 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
10220 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20  at routine..    
10230 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  */.    pPager->s
10240 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53 65 63  ectorSize = iSec
10250 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20  torSize;.  }..  
10260 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10270 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  ff += JOURNAL_HD
10280 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
10290 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
102a0 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73  *.** Write the s
102b0 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a  upplied master j
102c0 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f  ournal name into
102d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
102e0 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70  e for pager.** p
102f0 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75 72  Pager at the cur
10300 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54  rent location. T
10310 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10320 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74  l name must be t
10330 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67  he last.** thing
10340 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f   written to a jo
10350 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
10360 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 66  he pager is in f
10370 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74  ull-sync mode, t
10380 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
10390 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
103a0 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65   advanced to the
103b0 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
103c0 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ndary before.** 
103d0 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69 74  anything is writ
103e0 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20  ten. The format 
103f0 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20  is:.**.**   + 4 
10400 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f  bytes: PAGER_MJ_
10410 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62  PGNO..**   + N b
10420 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75  ytes: Master jou
10430 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e  rnal filename in
10440 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34   utf-8..**   + 4
10450 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74   bytes: N (lengt
10460 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  h of master jour
10470 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74 65  nal name in byte
10480 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e  s, no nul-termin
10490 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20  ator)..**   + 4 
104a0 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
104b0 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b  urnal name check
104c0 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79  sum..**   + 8 by
104d0 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  tes: aJournalMag
104e0 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ic[]..**.** The 
104f0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
10500 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20  age checksum is 
10510 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62  the sum of the b
10520 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
10530 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61  er.** journal na
10540 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68 20 62  me, where each b
10550 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74  yte is interpret
10560 65 64 20 61 73 20 61 20 73 69 67 6e 65 64 20 38  ed as a signed 8
10570 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  -bit integer..**
10580 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69  .** If zMaster i
10590 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
105a0 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73   (occurs for a s
105b0 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
105c0 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a  ransaction), .**
105d0 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
105e0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
105f0 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72   int writeMaster
10600 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
10610 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
10620 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
10630 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
10640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10650 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
10660 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b  /.  int nMaster;
10670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10680 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
10690 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72  f string zMaster
106a0 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
106b0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
106c0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
106d0 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20 6a 6f   of header in jo
106e0 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
106f0 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20  i64 jrnlSize;   
10700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10710 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72   /* Size of jour
10720 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  nal file on disk
10730 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 20   */.  u32 cksum 
10740 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
10750 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
10760 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61  um of string zMa
10770 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ster */..  asser
10780 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  t( pPager->setMa
10790 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ster==0 );.  ass
107a0 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
107b0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
107c0 69 66 28 20 21 7a 4d 61 73 74 65 72 20 0a 20 20  if( !zMaster .  
107d0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
107e0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
107f0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
10800 59 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  Y .   || pPager-
10810 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
10820 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
10830 4f 46 46 20 0a 20 20 29 7b 0a 20 20 20 20 72 65  OFF .  ){.    re
10840 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10850 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65    }.  pPager->se
10860 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61  tMaster = 1;.  a
10870 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
10880 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
10890 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
108a0 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50  journalHdr <= pP
108b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
108c0 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c   );..  /* Calcul
108d0 61 74 65 20 74 68 65 20 6c 65 6e 67 74 68 20 69  ate the length i
108e0 6e 20 62 79 74 65 73 20 61 6e 64 20 74 68 65 20  n bytes and the 
108f0 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73  checksum of zMas
10900 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61  ter */.  for(nMa
10910 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b  ster=0; zMaster[
10920 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65  nMaster]; nMaste
10930 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  r++){.    cksum 
10940 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74  += zMaster[nMast
10950 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er];.  }..  /* I
10960 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
10970 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20  ode, advance to 
10980 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65  the next disk se
10990 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74  ctor before writ
109a0 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73  ing.  ** the mas
109b0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
109c0 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73  . This is in cas
109d0 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70  e the previous p
109e0 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  age written to. 
109f0 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
10a00 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
10a10 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20   synced..  */.  
10a20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
10a30 53 79 6e 63 20 29 7b 0a 20 20 20 20 70 50 61 67  Sync ){.    pPag
10a40 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
10a50 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
10a60 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  t(pPager);.  }. 
10a70 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65   iHdrOff = pPage
10a80 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
10a90 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d    /* Write the m
10aa0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61  aster journal da
10ab0 74 61 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ta to the end of
10ac0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
10ad0 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72  e. If.  ** an er
10ae0 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
10af0 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  rn the error cod
10b00 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
10b10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 30 20 21  .  */.  if( (0 !
10b20 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62  = (rc = write32b
10b30 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
10b40 20 69 48 64 72 4f 66 66 2c 20 50 41 47 45 52 5f   iHdrOff, PAGER_
10b50 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29  MJ_PGNO(pPager))
10b60 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
10b70 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
10b80 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
10b90 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65   zMaster, nMaste
10ba0 72 2c 20 69 48 64 72 4f 66 66 2b 34 29 29 29 0a  r, iHdrOff+4))).
10bb0 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
10bc0 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
10bd0 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
10be0 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d  ff+4+nMaster, nM
10bf0 61 73 74 65 72 29 29 29 0a 20 20 20 7c 7c 20 28  aster))).   || (
10c00 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
10c10 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
10c20 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d  fd, iHdrOff+4+nM
10c30 61 73 74 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29  aster+4, cksum))
10c40 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
10c50 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
10c60 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
10c70 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
10c80 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73  , iHdrOff+4+nMas
10c90 74 65 72 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20  ter+8))).  ){.  
10ca0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
10cb0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
10cc0 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65  alOff += (nMaste
10cd0 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  r+20);..  /* If 
10ce0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
10cf0 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61  peristent-journa
10d00 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  l mode, then the
10d10 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20   physical .  ** 
10d20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79  journal-file may
10d30 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65   extend past the
10d40 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74   end of the mast
10d50 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er-journal name.
10d60 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73    ** and 8 bytes
10d70 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a   of magic data j
10d80 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ust written to t
10d90 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  he file. This is
10da0 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73   .  ** dangerous
10db0 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64   because the cod
10dc0 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  e to rollback a 
10dd0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
10de0 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  .  ** will not b
10df0 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74  e able to find t
10e00 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
10e10 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  l name to determ
10e20 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65  ine .  ** whethe
10e30 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
10e40 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20  rnal is hot. .  
10e50 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20  **.  ** Easiest 
10e60 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74  thing to do in t
10e70 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20  his scenario is 
10e80 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  to truncate the 
10e90 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
10ea0 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72  le to the requir
10eb0 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20  ed size..  */ . 
10ec0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
10ed0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
10ee0 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
10ef0 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29  jfd, &jrnlSize))
10f00 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e  .   && jrnlSize>
10f10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10f20 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  ff.  ){.    rc =
10f30 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
10f40 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
10f50 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10f60 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ff);.  }.  retur
10f70 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
10f80 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
10f90 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76  e hash table giv
10fa0 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62  en its page numb
10fb0 65 72 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  er. Return.** a 
10fc0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
10fd0 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74  age or NULL if t
10fe0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
10ff0 65 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72  e is not .** alr
11000 65 61 64 79 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a  eady in memory..
11010 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
11020 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61  *pager_lookup(Pa
11030 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
11040 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
11050 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
11060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11070 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
11080 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20  .  /* It is not 
11090 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 63  possible for a c
110a0 61 6c 6c 20 74 6f 20 50 63 61 63 68 65 46 65 74  all to PcacheFet
110b0 63 68 28 29 20 77 69 74 68 20 63 72 65 61 74 65  ch() with create
110c0 46 6c 61 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20  Flag==0 to.  ** 
110d0 66 61 69 6c 2c 20 73 69 6e 63 65 20 6e 6f 20 61  fail, since no a
110e0 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61  ttempt to alloca
110f0 74 65 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72  te dynamic memor
11100 79 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 2e 0a  y will be made..
11110 20 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c    */.  (void)sql
11120 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
11130 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
11140 20 70 67 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20   pgno, 0, &p);. 
11150 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
11160 0a 2a 2a 20 44 69 73 63 61 72 64 20 74 68 65 20  .** Discard the 
11170 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20  entire contents 
11180 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  of the in-memory
11190 20 70 61 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a   page-cache..*/.
111a0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
111b0 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70  r_reset(Pager *p
111c0 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
111d0 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
111e0 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
111f0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
11200 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50  Clear(pPager->pP
11210 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Cache);.}../*.**
11220 20 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74   Free all struct
11230 75 72 65 73 20 69 6e 20 74 68 65 20 50 61 67 65  ures in the Page
11240 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61  r.aSavepoint[] a
11250 72 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74  rray and set bot
11260 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65  h.** Pager.aSave
11270 70 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e  point and Pager.
11280 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65  nSavepoint to ze
11290 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75  ro. Close the su
112a0 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20  b-journal.** if 
112b0 69 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74  it is open and t
112c0 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
112d0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
112e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
112f0 64 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65  d releaseAllSave
11300 70 6f 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50  points(Pager *pP
11310 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b  ager){.  int ii;
11320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11330 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c  * Iterator for l
11340 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50  ooping through P
11350 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20  ager.aSavepoint 
11360 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
11370 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
11380 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
11390 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
113a0 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53  stroy(pPager->aS
113b0 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e  avepoint[ii].pIn
113c0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a  Savepoint);.  }.
113d0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
113e0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20  xclusiveMode || 
113f0 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72  sqlite3IsMemJour
11400 6e 61 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  nal(pPager->sjfd
11410 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
11420 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
11430 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sjfd);.  }.  sql
11440 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
11450 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  ->aSavepoint);. 
11460 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
11470 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  int = 0;.  pPage
11480 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->nSavepoint = 
11490 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75  0;.  pPager->nSu
114a0 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  bRec = 0;.}../*.
114b0 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74 20 6e  ** Set the bit n
114c0 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68  umber pgno in th
114d0 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
114e0 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a  .pInSavepoint .*
114f0 2a 20 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c  * bitvecs of all
11500 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
11510 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
11520 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
11530 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  .** or SQLITE_NO
11540 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  MEM if a malloc 
11550 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a  failure occurs..
11560 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
11570 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
11580 65 63 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ecs(Pager *pPage
11590 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
115a0 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
115b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
115c0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
115d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
115e0 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73  OK;       /* Res
115f0 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66  ult code */..  f
11600 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
11610 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
11620 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72  ii++){.    Pager
11630 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26  Savepoint *p = &
11640 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
11650 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20  nt[ii];.    if( 
11660 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29  pgno<=p->nOrig )
11670 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71  {.      rc |= sq
11680 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
11690 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20  ->pInSavepoint, 
116a0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73  pgno);.      tes
116b0 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
116c0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
116d0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
116e0 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51  ITE_OK || rc==SQ
116f0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
11700 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
11710 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
11720 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
11730 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 70 61   no-op if the pa
11740 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73  ger is in exclus
11750 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 6e 6f 74  ive mode and not
11760 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52 52 4f 52  .** in the ERROR
11770 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73   state. Otherwis
11780 65 2c 20 69 74 20 73 77 69 74 63 68 65 73 20 74  e, it switches t
11790 68 65 20 70 61 67 65 72 20 74 6f 20 50 41 47 45  he pager to PAGE
117a0 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61 74 65 2e  R_OPEN.** state.
117b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
117c0 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78  ger is not in ex
117d0 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
117e0 6f 64 65 2c 20 74 68 65 20 64 61 74 61 62 61 73  ode, the databas
117f0 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6f 6d  e file is.** com
11800 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63 6b 65 64  pletely unlocked
11810 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  . If the file is
11820 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68   unlocked and th
11830 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 6f  e file-system do
11840 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68 69 62 69  es.** not exhibi
11850 74 20 74 68 65 20 55 4e 44 45 4c 45 54 41 42 4c  t the UNDELETABL
11860 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70 72 6f 70  E_WHEN_OPEN prop
11870 65 72 74 79 2c 20 74 68 65 20 6a 6f 75 72 6e 61  erty, the journa
11880 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 6c 6f  l file is.** clo
11890 73 65 64 20 28 69 66 20 69 74 20 69 73 20 6f 70  sed (if it is op
118a0 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  en)..**.** If th
118b0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 45 52  e pager is in ER
118c0 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e 20 74  ROR state when t
118d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
118e0 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a 2a 2a 20  called, the .** 
118f0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
11900 70 61 67 65 72 20 63 61 63 68 65 20 61 72 65 20  pager cache are 
11910 64 69 73 63 61 72 64 65 64 20 62 65 66 6f 72 65  discarded before
11920 20 73 77 69 74 63 68 69 6e 67 20 62 61 63 6b 20   switching back 
11930 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50 45 4e 20  to .** the OPEN 
11940 73 74 61 74 65 2e 20 52 65 67 61 72 64 6c 65 73  state. Regardles
11950 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65  s of whether the
11960 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63   pager is in exc
11970 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a 20 6f  lusive-mode.** o
11980 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75 72 6e  r not, any journ
11990 61 6c 20 66 69 6c 65 20 6c 65 66 74 20 69 6e 20  al file left in 
119a0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
119b0 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65 64 0a  will be treated.
119c0 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72  ** as a hot-jour
119d0 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62  nal and rolled b
119e0 61 63 6b 20 74 68 65 20 6e 65 78 74 20 74 69 6d  ack the next tim
119f0 65 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  e a read-transac
11a00 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65 6e 65  tion.** is opene
11a10 64 20 28 62 79 20 74 68 69 73 20 6f 72 20 62 79  d (by this or by
11a20 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e 6e 65   any other conne
11a30 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61 74 69  ction)..*/.stati
11a40 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c  c void pager_unl
11a50 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
11a60 72 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  r){..  assert( p
11a70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
11a80 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20 20  AGER_READER .   
11a90 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65      || pPager->e
11aa0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
11ab0 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61  N .       || pPa
11ac0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
11ad0 45 52 5f 45 52 52 4f 52 20 0a 20 20 29 3b 0a 0a  ER_ERROR .  );..
11ae0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
11af0 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
11b00 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
11b10 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
11b20 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 41   = 0;.  releaseA
11b30 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61  llSavepoints(pPa
11b40 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 61 67  ger);..  if( pag
11b50 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
11b60 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
11b70 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
11b80 6a 66 64 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  jfd) );.    sqli
11b90 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
11ba0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
11bb0 3e 70 57 61 6c 29 3b 0a 20 20 20 20 70 50 61 67  >pWal);.    pPag
11bc0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
11bd0 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65  ER_OPEN;.  }else
11be0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
11bf0 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
11c00 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20     int rc;      
11c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 72   /* Error code r
11c30 65 74 75 72 6e 65 64 20 62 79 20 70 61 67 65 72  eturned by pager
11c40 55 6e 6c 6f 63 6b 44 62 28 29 20 2a 2f 0a 20 20  UnlockDb() */.  
11c50 20 20 69 6e 74 20 69 44 63 20 3d 20 69 73 4f 70    int iDc = isOp
11c60 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 3f 73  en(pPager->fd)?s
11c70 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
11c80 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
11c90 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a 20 20  ager->fd):0;..  
11ca0 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70 65 72    /* If the oper
11cb0 61 74 69 6e 67 20 73 79 73 74 65 6d 20 73 75 70  ating system sup
11cc0 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20 6f 66  port deletion of
11cd0 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74 68 65   open files, the
11ce0 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65 20 74  n.    ** close t
11cf0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
11d00 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68  when dropping th
11d10 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e  e database lock.
11d20 20 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20    Otherwise.    
11d30 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65  ** another conne
11d40 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e  ction with journ
11d50 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d  al_mode=delete m
11d60 69 67 68 74 20 64 65 6c 65 74 65 20 74 68 65 20  ight delete the 
11d70 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75 74 20  file.    ** out 
11d80 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20  from under us.. 
11d90 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
11da0 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  ( (PAGER_JOURNAL
11db0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20 26 20  MODE_MEMORY   & 
11dc0 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  5)!=1 );.    ass
11dd0 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52  ert( (PAGER_JOUR
11de0 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20 20 20  NALMODE_OFF     
11df0 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20   & 5)!=1 );.    
11e00 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
11e10 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 20  OURNALMODE_WAL  
11e20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20      & 5)!=1 );. 
11e30 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
11e40 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
11e50 4c 45 54 45 20 20 20 26 20 35 29 21 3d 31 20 29  LETE   & 5)!=1 )
11e60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
11e70 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
11e80 5f 54 52 55 4e 43 41 54 45 20 26 20 35 29 3d 3d  _TRUNCATE & 5)==
11e90 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
11ea0 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
11eb0 4f 44 45 5f 50 45 52 53 49 53 54 20 20 26 20 35  ODE_PERSIST  & 5
11ec0 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66 28 20  )==1 );.    if( 
11ed0 30 3d 3d 28 69 44 63 20 26 20 53 51 4c 49 54 45  0==(iDc & SQLITE
11ee0 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
11ef0 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a 20 20  LE_WHEN_OPEN).  
11f00 20 20 20 7c 7c 20 31 21 3d 28 70 50 61 67 65 72     || 1!=(pPager
11f10 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 26 20  ->journalMode & 
11f20 35 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  5).    ){.      
11f30 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
11f40 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
11f50 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
11f60 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
11f70 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e  e ERROR state an
11f80 64 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e  d the call to un
11f90 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
11fa0 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 66 61  e.    ** file fa
11fb0 69 6c 73 2c 20 73 65 74 20 74 68 65 20 63 75 72  ils, set the cur
11fc0 72 65 6e 74 20 6c 6f 63 6b 20 74 6f 20 55 4e 4b  rent lock to UNK
11fd0 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20 74  NOWN_LOCK. See t
11fe0 68 65 20 63 6f 6d 6d 65 6e 74 0a 20 20 20 20 2a  he comment.    *
11ff0 2a 20 61 62 6f 76 65 20 74 68 65 20 23 64 65 66  * above the #def
12000 69 6e 65 20 66 6f 72 20 55 4e 4b 4e 4f 57 4e 5f  ine for UNKNOWN_
12010 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78 70 6c  LOCK for an expl
12020 61 6e 61 74 69 6f 6e 20 6f 66 20 77 68 79 20 74  anation of why t
12030 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 6e 65  his.    ** is ne
12040 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a  cessary..    */.
12050 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e      rc = pagerUn
12060 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20 4e  lockDb(pPager, N
12070 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  O_LOCK);.    if(
12080 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
12090 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
120a0 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 7b  ==PAGER_ERROR ){
120b0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
120c0 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57 4e 5f 4c  Lock = UNKNOWN_L
120d0 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  OCK;.    }..    
120e0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 73 74 61  /* The pager sta
120f0 74 65 20 6d 61 79 20 62 65 20 63 68 61 6e 67 65  te may be change
12100 64 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 52 52  d from PAGER_ERR
12110 4f 52 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e  OR to PAGER_OPEN
12120 20 68 65 72 65 0a 20 20 20 20 2a 2a 20 77 69 74   here.    ** wit
12130 68 6f 75 74 20 63 6c 65 61 72 69 6e 67 20 74 68  hout clearing th
12140 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68  e error code. Th
12150 69 73 20 69 73 20 69 6e 74 65 6e 74 69 6f 6e 61  is is intentiona
12160 6c 20 2d 20 74 68 65 20 65 72 72 6f 72 0a 20 20  l - the error.  
12170 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 63 6c 65    ** code is cle
12180 61 72 65 64 20 61 6e 64 20 74 68 65 20 63 61 63  ared and the cac
12190 68 65 20 72 65 73 65 74 20 69 6e 20 74 68 65 20  he reset in the 
121a0 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20 20 20  block below..   
121b0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
121c0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
121d0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
121e0 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
121f0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
12200 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
12210 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  0;.    pPager->e
12220 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50  State = PAGER_OP
12230 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  EN;.  }..  /* If
12240 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69   Pager.errCode i
12250 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65  s set, the conte
12260 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
12270 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65   cache cannot be
12280 0a 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e  .  ** trusted. N
12290 6f 77 20 74 68 61 74 20 74 68 65 72 65 20 61 72  ow that there ar
122a0 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
122b0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
122c0 68 65 20 70 61 67 65 72 2c 0a 20 20 2a 2a 20 69  he pager,.  ** i
122d0 74 20 63 61 6e 20 73 61 66 65 6c 79 20 6d 6f 76  t can safely mov
122e0 65 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f  e back to PAGER_
122f0 4f 50 45 4e 20 73 74 61 74 65 2e 20 54 68 69 73  OPEN state. This
12300 20 68 61 70 70 65 6e 73 20 69 6e 20 62 6f 74 68   happens in both
12310 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61 6e 64  .  ** normal and
12320 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63 6b 69   exclusive-locki
12330 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  ng mode..  */.  
12340 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
12350 6f 64 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ode ){.    asser
12360 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
12370 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
12380 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
12390 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
123a0 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
123b0 46 69 6c 65 3b 0a 20 20 20 20 70 50 61 67 65 72  File;.    pPager
123c0 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
123d0 5f 4f 50 45 4e 3b 0a 20 20 20 20 70 50 61 67 65  _OPEN;.    pPage
123e0 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c  r->errCode = SQL
123f0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70  ITE_OK;.  }..  p
12400 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
12410 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  f = 0;.  pPager-
12420 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
12430 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
12440 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  ster = 0;.}../*.
12450 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
12460 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65   is called whene
12470 76 65 72 20 61 6e 20 49 4f 45 52 52 20 6f 72 20  ver an IOERR or 
12480 46 55 4c 4c 20 65 72 72 6f 72 20 74 68 61 74 20  FULL error that 
12490 72 65 71 75 69 72 65 73 0a 2a 2a 20 74 68 65 20  requires.** the 
124a0 70 61 67 65 72 20 74 6f 20 74 72 61 6e 73 69 74  pager to transit
124b0 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 45 52 52  ion into the ERR
124c0 4f 52 20 73 74 61 74 65 20 6d 61 79 20 61 68 76  OR state may ahv
124d0 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 20 54  e occurred..** T
124e0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
124f0 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
12500 6f 20 74 68 65 20 70 61 67 65 72 20 73 74 72 75  o the pager stru
12510 63 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f 6e  cture, the secon
12520 64 20 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d  d .** the error-
12530 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65  code about to be
12540 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70   returned by a p
12550 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f  ager API functio
12560 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61 6c 75 65  n. The .** value
12570 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 63   returned is a c
12580 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e  opy of the secon
12590 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
125a0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a  is function. .**
125b0 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e  .** If the secon
125c0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51  d argument is SQ
125d0 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c 49 54  LITE_FULL, SQLIT
125e0 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65 20 6f  E_IOERR or one o
125f0 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52 52 20 73  f the.** IOERR s
12600 75 62 2d 63 6f 64 65 73 2c 20 74 68 65 20 70 61  ub-codes, the pa
12610 67 65 72 20 65 6e 74 65 72 73 20 74 68 65 20 45  ger enters the E
12620 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64 20 74  RROR state and t
12630 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  he error code.**
12640 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 50 61   is stored in Pa
12650 67 65 72 2e 65 72 72 43 6f 64 65 2e 20 57 68 69  ger.errCode. Whi
12660 6c 65 20 74 68 65 20 70 61 67 65 72 20 72 65 6d  le the pager rem
12670 61 69 6e 73 20 69 6e 20 74 68 65 20 45 52 52 4f  ains in the ERRO
12680 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61 6c 6c 20  R state,.** all 
12690 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c 6c 73 20  major API calls 
126a0 6f 6e 20 74 68 65 20 50 61 67 65 72 20 77 69 6c  on the Pager wil
126b0 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65  l immediately re
126c0 74 75 72 6e 20 50 61 67 65 72 2e 65 72 72 43 6f  turn Pager.errCo
126d0 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 52  de..**.** The ER
126e0 52 4f 52 20 73 74 61 74 65 20 69 6e 64 69 63 61  ROR state indica
126f0 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  tes that the con
12700 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
12710 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e  er-cache .** can
12720 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20  not be trusted. 
12730 54 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62  This state can b
12740 65 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d  e cleared by com
12750 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69  pletely discardi
12760 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ng .** the conte
12770 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
12780 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61  -cache. If a tra
12790 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74  nsaction was act
127a0 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ive when.** the 
127b0 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72  persistent error
127c0 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20   occurred, then 
127d0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
127e0 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a  rnal may need.**
127f0 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64 20   to be replayed 
12800 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
12810 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
12820 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
12830 20 69 66 0a 2a 2a 20 69 74 20 77 65 72 65 20 61   if.** it were a
12840 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a   hot-journal)..*
12850 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
12860 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a  er_error(Pager *
12870 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b  pPager, int rc){
12880 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20  .  int rc2 = rc 
12890 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74  & 0xff;.  assert
128a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
128b0 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61  || !MEMDB );.  a
128c0 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 70 50  ssert(.       pP
128d0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
128e0 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20  QLITE_FULL ||.  
128f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
12900 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
12910 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67 65  ||.       (pPage
12920 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66  r->errCode & 0xf
12930 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  f)==SQLITE_IOERR
12940 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 32 3d  .  );.  if( rc2=
12950 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 20  =SQLITE_FULL || 
12960 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  rc2==SQLITE_IOER
12970 52 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  R ){.    pPager-
12980 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
12990 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
129a0 65 20 3d 20 50 41 47 45 52 5f 45 52 52 4f 52 3b  e = PAGER_ERROR;
129b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
129c0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
129d0 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50  pager_truncate(P
129e0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
129f0 6e 6f 20 6e 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a  no nPage);../*.*
12a00 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
12a10 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nds a transactio
12a20 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e  n. A transaction
12a30 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65   is usually ende
12a40 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20  d by .** either 
12a50 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f  a COMMIT or a RO
12a60 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e  LLBACK operation
12a70 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  . This routine m
12a80 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a  ay be called .**
12a90 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20   after rollback 
12aa0 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  of a hot-journal
12ab0 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72  , or if an error
12ac0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70   occurs while op
12ad0 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75  ening.** the jou
12ae0 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69  rnal file or wri
12af0 74 69 6e 67 20 74 68 65 20 76 65 72 79 20 66 69  ting the very fi
12b00 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
12b10 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62  er of a.** datab
12b20 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ase transaction.
12b30 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  .** .** This rou
12b40 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61  tine is never ca
12b50 6c 6c 65 64 20 69 6e 20 50 41 47 45 52 5f 45 52  lled in PAGER_ER
12b60 52 4f 52 20 73 74 61 74 65 2e 20 49 66 20 69 74  ROR state. If it
12b70 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69 6e   is called.** in
12b80 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20 50   PAGER_NONE or P
12b90 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74  AGER_SHARED stat
12ba0 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 68  e and the lock h
12bb0 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20 65  eld is less.** e
12bc0 78 63 6c 75 73 69 76 65 20 74 68 61 6e 20 61 20  xclusive than a 
12bd0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 69  RESERVED lock, i
12be0 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  t is a no-op..**
12bf0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
12c00 6e 79 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  ny active savepo
12c10 69 6e 74 73 20 61 72 65 20 72 65 6c 65 61 73 65  ints are release
12c20 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
12c30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
12c40 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73  open, then it is
12c50 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e   "finalized". On
12c60 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a  ce a journal .**
12c70 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66   file has been f
12c80 69 6e 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e  inalized it is n
12c90 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75  ot possible to u
12ca0 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61  se it to roll ba
12cb0 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63  ck a .** transac
12cc0 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69  tion. Nor will i
12cd0 74 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20  t be considered 
12ce0 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72  to be a hot-jour
12cf0 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f  nal by this.** o
12d00 72 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61  r any other data
12d10 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
12d20 20 45 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a   Exactly how a j
12d30 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69  ournal is finali
12d40 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f  zed.** depends o
12d50 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
12d60 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
12d70 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
12d80 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74  ve mode and.** t
12d90 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e  he current journ
12da0 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a  al-mode (Pager.j
12db0 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65  ournalMode value
12dc0 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ), as follows:.*
12dd0 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
12de0 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20  de==MEMORY.**   
12df0 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64    Journal file d
12e00 65 73 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d  escriptor is sim
12e10 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73  ply closed. This
12e20 20 64 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a   destroys an .**
12e30 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a       in-memory j
12e40 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20  ournal..**.**   
12e50 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55  journalMode==TRU
12e60 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75  NCATE.**     Jou
12e70 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75  rnal file is tru
12e80 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62  ncated to zero b
12e90 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
12ea0 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
12eb0 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20  e==PERSIST.**   
12ec0 20 20 54 68 65 20 66 69 72 73 74 20 32 38 20 62    The first 28 b
12ed0 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ytes of the jour
12ee0 6e 61 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72  nal file are zer
12ef0 6f 65 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69  oed. This invali
12f00 64 61 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65  dates.**     the
12f10 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
12f20 65 61 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c  eader in the fil
12f30 65 2c 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65  e, and hence the
12f40 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a   entire journal.
12f50 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20  **     file. An 
12f60 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20  invalid journal 
12f70 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72  file cannot be r
12f80 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
12f90 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
12fa0 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54  =DELETE.**     T
12fb0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
12fc0 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65  is closed and de
12fd0 6c 65 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69  leted using sqli
12fe0 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a  te3OsDelete()..*
12ff0 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20  *.**     If the 
13000 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
13010 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
13020 64 65 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20  de, this method 
13030 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a  of finalizing.**
13040 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c       the journal
13050 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75   file is never u
13060 73 65 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66  sed. Instead, if
13070 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65   the journalMode
13080 20 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54   is.**     DELET
13090 45 20 61 6e 64 20 74 68 65 20 70 61 67 65 72 20  E and the pager 
130a0 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  is in exclusive 
130b0 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64  mode, the method
130c0 20 64 65 73 63 72 69 62 65 64 20 75 6e 64 65 72   described under
130d0 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d  .**     journalM
130e0 6f 64 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20  ode==PERSIST is 
130f0 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  used instead..**
13100 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f  .** After the jo
13110 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a  urnal is finaliz
13120 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 6d 6f  ed, the pager mo
13130 76 65 73 20 74 6f 20 50 41 47 45 52 5f 52 45 41  ves to PAGER_REA
13140 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49 66  DER state..** If
13150 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d   running in non-
13160 65 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62 61  exclusive rollba
13170 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f 63  ck mode, the loc
13180 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 73  k on the file is
13190 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64 20   .** downgraded 
131a0 74 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f 43 4b  to a SHARED_LOCK
131b0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
131c0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
131d0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
131e0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
131f0 63 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61  curs during.** a
13200 6e 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65  ny of the IO ope
13210 72 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c  rations to final
13220 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ize the journal 
13230 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74  file or unlock t
13240 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74  he.** database t
13250 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
13260 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
13270 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49  d to the user. I
13280 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74  f the .** operat
13290 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20  ion to finalize 
132a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
132b0 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65   fails, then the
132c0 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74   code still.** t
132d0 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  ries to unlock t
132e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
132f0 20 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75   if not in exclu
13300 73 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  sive mode. If th
13310 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72  e.** unlock oper
13320 61 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77  ation fails as w
13330 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69  ell, then the fi
13340 72 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72  rst error code r
13350 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65  elated.** to the
13360 20 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63   first error enc
13370 6f 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f  ountered (the jo
13380 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69  urnal finalizati
13390 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65  on one) is.** re
133a0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
133b0 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f  c int pager_end_
133c0 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  transaction(Page
133d0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68  r *pPager, int h
133e0 61 73 4d 61 73 74 65 72 2c 20 69 6e 74 20 62 43  asMaster, int bC
133f0 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e 74 20 72 63  ommit){.  int rc
13400 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
13410 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
13420 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69   from journal fi
13430 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61  nalization opera
13440 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tion */.  int rc
13450 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  2 = SQLITE_OK;  
13460 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
13470 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e   from db file un
13480 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a  lock operation *
13490 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69  /..  /* Do nothi
134a0 6e 67 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ng if the pager 
134b0 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e  does not have an
134c0 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
134d0 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72 20  saction.  ** or 
134e0 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52  at least a RESER
134f0 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73 20 66  VED lock. This f
13500 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63  unction may be c
13510 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
13520 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72 69 74  .  ** is no writ
13530 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  e-transaction ac
13540 74 69 76 65 20 62 75 74 20 61 20 52 45 53 45 52  tive but a RESER
13550 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  VED or greater l
13560 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65 6c 64  ock is.  ** held
13570 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72 63 75   under two circu
13580 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a 20  mstances:.  **. 
13590 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72 20 61   **   1. After a
135a0 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f 74 2d   successful hot-
135b0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
135c0 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64 20 77  , it is called w
135d0 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20 65 53  ith.  **      eS
135e0 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e 45  tate==PAGER_NONE
135f0 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c   and eLock==EXCL
13600 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a 2a  USIVE_LOCK..  **
13610 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20 61 20  .  **   2. If a 
13620 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
13630 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63  locking_mode=exc
13640 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67 20 61  lusive holding a
13650 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20 2a  n EXCLUSIVE .  *
13660 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77 69 74  *      lock swit
13670 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c 6f 63  ches back to loc
13680 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61 6c  king_mode=normal
13690 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63 75 74   and then execut
136a0 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20 20 72  es a.  **      r
136b0 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ead-transaction,
136c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
136d0 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 65 53  s called with eS
136e0 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
136f0 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20 61 6e  ER .  **      an
13700 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  d eLock==EXCLUSI
13710 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68 65  VE_LOCK when the
13720 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
13730 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20 2a  n is closed..  *
13740 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73 73 65  /.  assert( asse
13750 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
13760 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
13770 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
13780 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te!=PAGER_ERROR 
13790 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
137a0 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 57 52  >eState<PAGER_WR
137b0 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26 20 70  ITER_LOCKED && p
137c0 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45 53  Pager->eLock<RES
137d0 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  ERVED_LOCK ){.  
137e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
137f0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c 65 61  OK;.  }..  relea
13800 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
13810 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72  pPager);.  asser
13820 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
13830 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72  ->jfd) || pPager
13840 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
13850 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  );.  if( isOpen(
13860 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
13870 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67      assert( !pag
13880 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
13890 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61   );..    /* Fina
138a0 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lize the journal
138b0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
138c0 28 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f  ( sqlite3IsMemJo
138d0 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
138e0 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  d) ){.      asse
138f0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
13900 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
13910 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
13920 59 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Y );.      sqlit
13930 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
13940 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73  ->jfd);.    }els
13950 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
13960 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
13970 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
13980 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69  NCATE ){.      i
13990 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
139a0 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
139b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
139c0 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OK;.      }else{
139d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
139e0 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
139f0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
13a00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
13a10 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
13a20 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  f = 0;.    }else
13a30 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
13a40 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
13a50 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
13a60 49 53 54 0a 20 20 20 20 20 20 7c 7c 20 28 70 50  IST.      || (pP
13a70 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
13a80 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  ode && pPager->j
13a90 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
13aa0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
13ab0 4c 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  L).    ){.      
13ac0 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c  rc = zeroJournal
13ad0 48 64 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d  Hdr(pPager, hasM
13ae0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70 50  aster);.      pP
13af0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
13b00 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
13b10 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
13b20 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78 65  ranch may be exe
13b30 63 75 74 65 64 20 77 69 74 68 20 50 61 67 65 72  cuted with Pager
13b40 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45  .journalMode==ME
13b50 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a 2a  MORY if.      **
13b60 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 77   a hot-journal w
13b70 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20 62  as just rolled b
13b80 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ack. In this cas
13b90 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  e the journal.  
13ba0 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f 75      ** file shou
13bb0 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64  ld be closed and
13bc0 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68 69   deleted. If thi
13bd0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69  s connection wri
13be0 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  tes to.      ** 
13bf0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
13c00 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73 6f  e, it will do so
13c10 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65 6d   using an in-mem
13c20 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20  ory journal. .  
13c30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
13c40 20 62 44 65 6c 65 74 65 20 3d 20 28 21 70 50 61   bDelete = (!pPa
13c50 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26  ger->tempFile &&
13c60 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 45   sqlite3JournalE
13c70 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  xists(pPager->jf
13c80 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d));.      asser
13c90 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
13ca0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
13cb0 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
13cc0 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
13cd0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
13ce0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
13cf0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20  ALMODE_MEMORY . 
13d00 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
13d10 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
13d20 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
13d30 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 29  ODE_WAL .      )
13d40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
13d50 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
13d60 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62  fd);.      if( b
13d70 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
13d80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13d90 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
13da0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
13db0 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  urnal, 0);.     
13dc0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69   }.    }.  }..#i
13dd0 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
13de0 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c 69 74 65  K_PAGES.  sqlite
13df0 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69  3PcacheIterateDi
13e00 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
13e10 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70  che, pager_set_p
13e20 61 67 65 68 61 73 68 29 3b 0a 20 20 69 66 28 20  agehash);.  if( 
13e30 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
13e40 30 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63  0 && sqlite3Pcac
13e50 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
13e60 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b  r->pPCache)>0 ){
13e70 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20  .    PgHdr *p = 
13e80 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
13e90 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  ger, 1);.    if(
13ea0 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70   p ){.      p->p
13eb0 61 67 65 48 61 73 68 20 3d 20 30 3b 0a 20 20 20  ageHash = 0;.   
13ec0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
13ed0 6e 72 65 66 28 70 29 3b 0a 20 20 20 20 7d 0a 20  nref(p);.    }. 
13ee0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c   }.#endif..  sql
13ef0 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
13f00 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
13f10 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d  rnal);.  pPager-
13f20 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
13f30 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20  .  pPager->nRec 
13f40 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  = 0;.  sqlite3Pc
13f50 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61  acheCleanAll(pPa
13f60 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
13f70 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 54 72   sqlite3PcacheTr
13f80 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70  uncate(pPager->p
13f90 50 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e  PCache, pPager->
13fa0 64 62 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20  dbSize);..  if( 
13fb0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
13fc0 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72  er) ){.    /* Dr
13fd0 6f 70 20 74 68 65 20 57 41 4c 20 77 72 69 74 65  op the WAL write
13fe0 2d 6c 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41  -lock, if any. A
13ff0 6c 73 6f 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e  lso, if the conn
14000 65 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20  ection was in . 
14010 20 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f     ** locking_mo
14020 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  de=exclusive mod
14030 65 20 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67  e but is no long
14040 65 72 2c 20 64 72 6f 70 20 74 68 65 20 45 58 43  er, drop the EXC
14050 4c 55 53 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c  LUSIVE .    ** l
14060 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
14070 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
14080 20 20 20 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20     */.    rc2 = 
14090 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 57 72 69  sqlite3WalEndWri
140a0 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  teTransaction(pP
140b0 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20  ager->pWal);.   
140c0 20 61 73 73 65 72 74 28 20 72 63 32 3d 3d 53 51   assert( rc2==SQ
140d0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c  LITE_OK );.  }el
140e0 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
140f0 45 5f 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20  E_OK && bCommit 
14100 26 26 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  && pPager->dbFil
14110 65 53 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62  eSize>pPager->db
14120 53 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  Size ){.    /* T
14130 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
14140 6b 65 6e 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74  ken when committ
14150 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
14160 6e 20 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f  n in rollback-jo
14170 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64  urnal.    ** mod
14180 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
14190 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
141a0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
141b0 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
141c0 2e 0a 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73  ..    ** At this
141d0 20 70 6f 69 6e 74 20 74 68 65 20 6a 6f 75 72 6e   point the journ
141e0 61 6c 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61  al has been fina
141f0 6c 69 7a 65 64 20 61 6e 64 20 74 68 65 20 74 72  lized and the tr
14200 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a  ansaction .    *
14210 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  * successfully c
14220 6f 6d 6d 69 74 74 65 64 2c 20 62 75 74 20 74 68  ommitted, but th
14230 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  e EXCLUSIVE lock
14240 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f   is still held o
14250 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 6c  n the.    ** fil
14260 65 2e 20 53 6f 20 69 74 20 69 73 20 73 61 66 65  e. So it is safe
14270 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
14280 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
14290 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d 0a 20 20  o its minimum.  
142a0 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 73 69    ** required si
142b0 7a 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  ze.  */.    asse
142c0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  rt( pPager->eLoc
142d0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
142e0 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  K );.    rc = pa
142f0 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
14300 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  ger, pPager->dbS
14310 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ize);.  }..  if(
14320 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
14330 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 28  iveMode .   && (
14340 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
14350 67 65 72 29 20 7c 7c 20 73 71 6c 69 74 65 33 57  ger) || sqlite3W
14360 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28  alExclusiveMode(
14370 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29  pPager->pWal, 0)
14380 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 32 20 3d  ).  ){.    rc2 =
14390 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70   pagerUnlockDb(p
143a0 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
143b0 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  CK);.    pPager-
143c0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
143d0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67   = 0;.  }.  pPag
143e0 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47  er->eState = PAG
143f0 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 70 50 61  ER_READER;.  pPa
14400 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
14410 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72   0;..  return (r
14420 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32  c==SQLITE_OK?rc2
14430 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  :rc);.}../*.** E
14440 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63  xecute a rollbac
14450 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  k if a transacti
14460 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 64  on is active and
14470 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20   unlock the .** 
14480 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a  database file. .
14490 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
144a0 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65  er has already e
144b0 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f 52  ntered the ERROR
144c0 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61   state, do not a
144d0 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72  ttempt .** the r
144e0 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68 69 73 20  ollback at this 
144f0 74 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20 70  time. Instead, p
14500 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73  ager_unlock() is
14510 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20   called. The.** 
14520 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e  call to pager_un
14530 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69 73 63  lock() will disc
14540 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72  ard all in-memor
14550 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a  y pages, unlock.
14560 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
14570 66 69 6c 65 20 61 6e 64 20 6d 6f 76 65 20 74 68  file and move th
14580 65 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20  e pager back to 
14590 4f 50 45 4e 20 73 74 61 74 65 2e 20 49 66 20 74  OPEN state. If t
145a0 68 69 73 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  his .** means th
145b0 61 74 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  at there is a ho
145c0 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69  t-journal left i
145d0 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
145e0 6d 2c 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20  m, the next .** 
145f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62  connection to ob
14600 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f  tain a shared lo
14610 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ck on the pager 
14620 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 74 68  (which may be th
14630 69 73 20 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c  is one) .** will
14640 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a   roll it back..*
14650 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
14660 72 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64  r has not alread
14670 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 45 52  y entered the ER
14680 52 4f 52 20 73 74 61 74 65 2c 20 62 75 74 20 61  ROR state, but a
14690 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f  n IO or.** mallo
146a0 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  c error occurs d
146b0 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
146c0 2c 20 74 68 65 6e 20 74 68 69 73 20 77 69 6c 6c  , then this will
146d0 20 69 74 73 65 6c 66 20 63 61 75 73 65 20 0a 2a   itself cause .*
146e0 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65  * the pager to e
146f0 6e 74 65 72 20 74 68 65 20 45 52 52 4f 52 20 73  nter the ERROR s
14700 74 61 74 65 2e 20 57 68 69 63 68 20 77 69 6c 6c  tate. Which will
14710 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 74   be cleared by t
14720 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61  he.** call to pa
14730 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73  ger_unlock(), as
14740 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
14750 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14760 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
14770 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
14780 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
14790 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
147a0 47 45 52 5f 45 52 52 4f 52 20 26 26 20 70 50 61  GER_ERROR && pPa
147b0 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
147c0 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61  ER_OPEN ){.    a
147d0 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
147e0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
147f0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ) );.    if( pPa
14800 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47  ger->eState>=PAG
14810 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
14820 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14830 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
14840 6f 63 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  oc();.      sqli
14850 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
14860 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
14870 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
14880 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65  Malloc();.    }e
14890 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d  lse if( !pPager-
148a0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
148b0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
148c0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
148d0 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
148e0 20 20 20 20 20 20 70 61 67 65 72 5f 65 6e 64 5f        pager_end_
148f0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
14900 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  er, 0, 0);.    }
14910 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c  .  }.  pager_unl
14920 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  ock(pPager);.}..
14930 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
14940 61 44 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74  aData must point
14950 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20   to a buffer of 
14960 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
14970 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74   bytes.** of dat
14980 61 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72  a. Compute and r
14990 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d  eturn a checksum
149a0 20 62 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63   based ont the c
149b0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a  ontents of the .
149c0 2a 2a 20 70 61 67 65 20 6f 66 20 64 61 74 61 20  ** page of data 
149d0 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  and the current 
149e0 76 61 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d  value of pPager-
149f0 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a  >cksumInit..**.*
14a00 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
14a10 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49  real checksum. I
14a20 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  t is really just
14a30 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
14a40 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  .** random initi
14a50 61 6c 20 76 61 6c 75 65 20 28 70 50 61 67 65 72  al value (pPager
14a60 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64  ->cksumInit) and
14a70 20 65 76 65 72 79 20 32 30 30 74 68 20 62 79 74   every 200th byt
14a80 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  e.** of the page
14a90 20 64 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20   data, starting 
14aa0 77 69 74 68 20 62 79 74 65 20 6f 66 66 73 65 74  with byte offset
14ab0 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69   (pPager->pageSi
14ac0 7a 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68  ze%200)..** Each
14ad0 20 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72   byte is interpr
14ae0 65 74 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74  eted as an 8-bit
14af0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65   unsigned intege
14b00 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e  r..**.** Changin
14b10 67 20 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73  g the formula us
14b20 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
14b30 69 73 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75  is checksum resu
14b40 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63  lts in an.** inc
14b50 6f 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61  ompatible journa
14b60 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a  l file format..*
14b70 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20  *.** If journal 
14b80 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72  corruption occur
14b90 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72  s due to a power
14ba0 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f   failure, the mo
14bb0 73 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63  st likely .** sc
14bc0 65 6e 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f  enario is that o
14bd0 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74  ne end or the ot
14be0 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72  her of the recor
14bf0 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65  d will be change
14c00 64 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63  d. .** It is muc
14c10 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68  h less likely th
14c20 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20  at the two ends 
14c30 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  of the journal r
14c40 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a  ecord will be.**
14c50 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65   correct and the
14c60 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75   middle be corru
14c70 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20  pt.  Thus, this 
14c80 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d  "checksum" schem
14c90 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73  e,.** though fas
14ca0 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61  t and simple, ca
14cb0 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79  tches the mostly
14cc0 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20   likely kind of 
14cd0 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73  corruption..*/.s
14ce0 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
14cf0 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61  cksum(Pager *pPa
14d00 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  ger, const u8 *a
14d10 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73  Data){.  u32 cks
14d20 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73  um = pPager->cks
14d30 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  umInit;         
14d40 2f 2a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75  /* Checksum valu
14d50 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  e to return */. 
14d60 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d   int i = pPager-
14d70 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20  >pageSize-200;  
14d80 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
14d90 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69  counter */.  whi
14da0 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63  le( i>0 ){.    c
14db0 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d  ksum += aData[i]
14dc0 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a  ;.    i -= 200;.
14dd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73    }.  return cks
14de0 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70  um;.}../*.** Rep
14df0 6f 72 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  ort the current 
14e00 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75  page size and nu
14e10 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
14e20 20 62 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74   bytes back.** t
14e30 6f 20 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a  o the codec..*/.
14e40 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
14e50 53 5f 43 4f 44 45 43 0a 73 74 61 74 69 63 20 76  S_CODEC.static v
14e60 6f 69 64 20 70 61 67 65 72 52 65 70 6f 72 74 53  oid pagerReportS
14e70 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
14e80 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
14e90 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67  ->xCodecSizeChng
14ea0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
14eb0 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 28 70  xCodecSizeChng(p
14ec0 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70  Pager->pCodec, p
14ed0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
14ee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14ef0 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
14f00 29 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76  )pPager->nReserv
14f10 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  e);.  }.}.#else.
14f20 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 52 65  # define pagerRe
14f30 70 6f 72 74 53 69 7a 65 28 58 29 20 20 20 20 20  portSize(X)     
14f40 2f 2a 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64  /* No-op if we d
14f50 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 20  o not support a 
14f60 63 6f 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a  codec */.#endif.
14f70 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69  ./*.** Read a si
14f80 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 65  ngle page from e
14f90 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  ither the journa
14fa0 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d 61 69  l file (if isMai
14fb0 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20  nJrnl==1) or.** 
14fc0 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
14fd0 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a  rnal (if isMainJ
14fe0 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79  rnl==0) and play
14ff0 62 61 63 6b 20 74 68 61 74 20 70 61 67 65 2e 0a  back that page..
15000 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65 67 69  ** The page begi
15010 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a 70 4f  ns at offset *pO
15020 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66  ffset into the f
15030 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66 73 65  ile. The *pOffse
15040 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 69 6e  t.** value is in
15050 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20 73  creased to the s
15060 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74  tart of the next
15070 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75   page in the jou
15080 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rnal..**.** The 
15090 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  main rollback jo
150a0 75 72 6e 61 6c 20 75 73 65 73 20 63 68 65 63 6b  urnal uses check
150b0 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65  sums - the state
150c0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65  ment journal doe
150d0 73 20 0a 2a 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a  s .** not..**.**
150e0 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d   If the page num
150f0 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
15100 72 65 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d  record read from
15110 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
15120 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72  al file.** is gr
15130 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
15140 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
15150 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68  Pager.dbSize, th
15160 65 6e 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a  en playback is.*
15170 2a 20 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51  * skipped and SQ
15180 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
15190 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44  ned..**.** If pD
151a0 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  one is not NULL,
151b0 20 74 68 65 6e 20 69 74 20 69 73 20 61 20 72 65   then it is a re
151c0 63 6f 72 64 20 6f 66 20 70 61 67 65 73 20 74 68  cord of pages th
151d0 61 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  at have already.
151e0 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62  ** been played b
151f0 61 63 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67  ack.  If the pag
15200 65 20 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61  e at *pOffset ha
15210 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
15220 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69  layed back.** (i
15230 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
15240 69 6e 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73  ing pDone bit is
15250 20 73 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20   set) then skip 
15260 74 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a  the playback..**
15270 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70   Make sure the p
15280 44 6f 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70  Done bit corresp
15290 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70  onding to the *p
152a0 4f 66 66 73 65 74 20 70 61 67 65 20 69 73 20 73  Offset page is s
152b0 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72  et.** prior to r
152c0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
152d0 49 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f  If the page reco
152e0 72 64 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  rd is successful
152f0 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ly read from the
15300 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
15310 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65  ile.** and playe
15320 64 20 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c  d back, then SQL
15330 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
15340 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
15350 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69  or occurs.** whi
15360 6c 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 72  le reading the r
15370 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28  ecord from the (
15380 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
15390 65 20 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69  e or while writi
153a0 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74  ng.** to the dat
153b0 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
153c0 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
153d0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
153e0 49 66 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75  If data.** is su
153f0 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20  ccessfully read 
15400 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
15410 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20  ournal file but 
15420 61 70 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a  appears to be.**
15430 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49   corrupted, SQLI
15440 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
15450 6e 65 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e  ned. Data is con
15460 73 69 64 65 72 65 64 20 63 6f 72 72 75 70 74 65  sidered corrupte
15470 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63  d in.** two circ
15480 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a  umstances:.** .*
15490 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63  *   * If the rec
154a0 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  ord page-number 
154b0 69 73 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72  is illegal (0 or
154c0 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c   PAGER_MJ_PGNO),
154d0 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68   or.**   * If th
154e0 65 20 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e  e record is bein
154f0 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72  g rolled back fr
15500 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
15510 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20  nal file.**     
15520 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d  and the checksum
15530 20 66 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20   field does not 
15540 6d 61 74 63 68 20 74 68 65 20 72 65 63 6f 72 64  match the record
15550 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
15560 4e 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65  Neither of these
15570 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61   two scenarios a
15580 72 65 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69  re possible duri
15590 6e 67 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  ng a savepoint r
155a0 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ollback..**.** I
155b0 66 20 74 68 69 73 20 69 73 20 61 20 73 61 76 65  f this is a save
155c0 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20  point rollback, 
155d0 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20  then memory may 
155e0 68 61 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d  have to be dynam
155f0 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61  ically.** alloca
15600 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
15610 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73  tion. If this is
15620 20 74 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e   the case and an
15630 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
15640 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  s,.** SQLITE_NOM
15650 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  EM is returned..
15660 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
15670 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
15680 5f 70 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a  _page(.  Pager *
15690 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
156a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
156b0 67 65 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64  ger being played
156c0 20 62 61 63 6b 20 2a 2f 0a 20 20 69 36 34 20 2a   back */.  i64 *
156d0 70 4f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20  pOffset,        
156e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
156f0 65 74 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20  et of record to 
15700 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20 42 69  playback */.  Bi
15710 74 76 65 63 20 2a 70 44 6f 6e 65 2c 20 20 20 20  tvec *pDone,    
15720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
15730 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61  itvec of pages a
15740 6c 72 65 61 64 79 20 70 6c 61 79 65 64 20 62 61  lready played ba
15750 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61  ck */.  int isMa
15760 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20  inJrnl,         
15770 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61        /* 1 -> ma
15780 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e  in journal. 0 ->
15790 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f   sub-journal. */
157a0 0a 20 20 69 6e 74 20 69 73 53 61 76 65 70 6e 74  .  int isSavepnt
157b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157c0 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 73   /* True for a s
157d0 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
157e0 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  k */.){.  int rc
157f0 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20  ;.  PgHdr *pPg; 
15800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15810 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67    /* An existing
15820 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63   page in the cac
15830 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  he */.  Pgno pgn
15840 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
15850 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
15860 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61  e number of a pa
15870 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f  ge in journal */
15880 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
15890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
158a0 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65   /* Checksum use
158b0 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65  d for sanity che
158c0 63 6b 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20  cking */.  char 
158d0 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *aData;         
158e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
158f0 6f 72 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f  orary storage fo
15900 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  r the page */.  
15910 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66  sqlite3_file *jf
15920 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d;            /*
15930 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   The file descri
15940 70 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75  ptor for the jou
15950 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
15960 6e 74 20 69 73 53 79 6e 63 65 64 3b 20 20 20 20  nt isSynced;    
15970 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15980 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20  True if journal 
15990 70 61 67 65 20 69 73 20 73 79 6e 63 65 64 20 2a  page is synced *
159a0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28 69 73  /..  assert( (is
159b0 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20  MainJrnl&~1)==0 
159c0 29 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69  );      /* isMai
159d0 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20  nJrnl is 0 or 1 
159e0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 69 73  */.  assert( (is
159f0 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29  Savepnt&~1)==0 )
15a00 3b 20 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76  ;       /* isSav
15a10 65 70 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a  epnt is 0 or 1 *
15a20 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4d 61  /.  assert( isMa
15a30 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20  inJrnl || pDone 
15a40 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20  );     /* pDone 
15a50 61 6c 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73  always used on s
15a60 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20  ub-journals */. 
15a70 20 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70   assert( isSavep
15a80 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29  nt || pDone==0 )
15a90 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76  ;   /* pDone nev
15aa0 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73  er used on non-s
15ab0 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61  avepoint */..  a
15ac0 44 61 74 61 20 3d 20 70 50 61 67 65 72 2d 3e 70  Data = pPager->p
15ad0 54 6d 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65  TmpSpace;.  asse
15ae0 72 74 28 20 61 44 61 74 61 20 29 3b 20 20 20 20  rt( aData );    
15af0 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f       /* Temp sto
15b00 72 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61  rage must have a
15b10 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
15b20 63 61 74 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  cated */.  asser
15b30 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  t( pagerUseWal(p
15b40 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69  Pager)==0 || (!i
15b50 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53  sMainJrnl && isS
15b60 61 76 65 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a  avepnt) );..  /*
15b70 20 45 69 74 68 65 72 20 74 68 65 20 73 74 61 74   Either the stat
15b80 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  e is greater tha
15b90 6e 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  n PAGER_WRITER_C
15ba0 41 43 48 45 4d 4f 44 20 28 61 20 74 72 61 6e 73  ACHEMOD (a trans
15bb0 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20  action .  ** or 
15bc0 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
15bd0 63 6b 20 64 6f 6e 65 20 61 74 20 74 68 65 20 72  ck done at the r
15be0 65 71 75 65 73 74 20 6f 66 20 74 68 65 20 63 61  equest of the ca
15bf0 6c 6c 65 72 29 20 6f 72 20 74 68 69 73 20 69 73  ller) or this is
15c00 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72  .  ** a hot-jour
15c10 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66  nal rollback. If
15c20 20 69 74 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75   it is a hot-jou
15c30 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  rnal rollback, t
15c40 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 69 73  he pager.  ** is
15c50 20 69 6e 20 73 74 61 74 65 20 4f 50 45 4e 20 61   in state OPEN a
15c60 6e 64 20 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c  nd holds an EXCL
15c70 55 53 49 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d  USIVE lock. Hot-
15c80 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
15c90 0a 20 20 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73  .  ** only reads
15ca0 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
15cb0 6f 75 72 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20  ournal, not the 
15cc0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  sub-journal..  *
15cd0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
15ce0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
15cf0 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
15d00 44 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61  D.       || (pPa
15d10 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
15d20 45 52 5f 4f 50 45 4e 20 26 26 20 70 50 61 67 65  ER_OPEN && pPage
15d30 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  r->eLock==EXCLUS
15d40 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20  IVE_LOCK).  );. 
15d50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
15d60 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
15d70 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c  RITER_CACHEMOD |
15d80 7c 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a  | isMainJrnl );.
15d90 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70  .  /* Read the p
15da0 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70  age number and p
15db0 61 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68  age data from th
15dc0 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62  e journal or sub
15dd0 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69  -journal.  ** fi
15de0 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  le. Return an er
15df0 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
15e00 63 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20  caller if an IO 
15e10 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20  error occurs..  
15e20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69  */.  jfd = isMai
15e30 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e  nJrnl ? pPager->
15e40 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a  jfd : pPager->sj
15e50 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33  fd;.  rc = read3
15e60 32 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66  2bits(jfd, *pOff
15e70 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69  set, &pgno);.  i
15e80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15e90 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
15ea0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
15eb0 61 64 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61  ad(jfd, (u8*)aDa
15ec0 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
15ed0 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29  Size, (*pOffset)
15ee0 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  +4);.  if( rc!=S
15ef0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
15f00 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74  n rc;.  *pOffset
15f10 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
15f20 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69  Size + 4 + isMai
15f30 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53  nJrnl*4;..  /* S
15f40 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
15f50 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
15f60 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
15f70 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
15f80 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
15f90 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
15fa0 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
15fb0 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
15fc0 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
15fd0 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
15fe0 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
15ff0 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
16000 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
16010 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
16020 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
16030 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
16040 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
16050 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
16060 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
16070 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
16080 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
16090 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
160a0 73 65 72 74 28 20 21 69 73 53 61 76 65 70 6e 74  sert( !isSavepnt
160b0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
160c0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
160d0 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f    if( pgno>(Pgno
160e0 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  )pPager->dbSize 
160f0 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  || sqlite3Bitvec
16100 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f  Test(pDone, pgno
16110 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
16120 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
16130 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
16140 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  ){.    rc = read
16150 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f  32bits(jfd, (*pO
16160 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d  ffset)-4, &cksum
16170 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
16180 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
16190 66 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26  f( !isSavepnt &&
161a0 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
161b0 67 65 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29  ger, (u8*)aData)
161c0 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20  !=cksum ){.     
161d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
161e0 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
161f0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67    /* If this pag
16200 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
16210 65 6e 20 70 6c 61 79 65 64 20 62 79 20 62 65 66  en played by bef
16220 6f 72 65 20 64 75 72 69 6e 67 20 74 68 65 20 63  ore during the c
16230 75 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c  urrent.  ** roll
16240 62 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27 74  back, then don't
16250 20 62 6f 74 68 65 72 20 74 6f 20 70 6c 61 79 20   bother to play 
16260 69 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 20  it back again.. 
16270 20 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65 20   */.  if( pDone 
16280 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  && (rc = sqlite3
16290 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c  BitvecSet(pDone,
162a0 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f   pgno))!=SQLITE_
162b0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
162c0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57   rc;.  }..  /* W
162d0 68 65 6e 20 70 6c 61 79 69 6e 67 20 62 61 63 6b  hen playing back
162e0 20 70 61 67 65 20 31 2c 20 72 65 73 74 6f 72 65   page 1, restore
162f0 20 74 68 65 20 6e 52 65 73 65 72 76 65 20 73 65   the nReserve se
16300 74 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66 28  tting.  */.  if(
16310 20 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 67   pgno==1 && pPag
16320 65 72 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28 28  er->nReserve!=((
16330 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 20 29  u8*)aData)[20] )
16340 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  {.    pPager->nR
16350 65 73 65 72 76 65 20 3d 20 28 28 75 38 2a 29 61  eserve = ((u8*)a
16360 44 61 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20 70  Data)[20];.    p
16370 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 70  agerReportSize(p
16380 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Pager);.  }..  /
16390 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
163a0 73 20 69 6e 20 43 41 43 48 45 4d 4f 44 20 73 74  s in CACHEMOD st
163b0 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ate, then there 
163c0 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f  must be a copy o
163d0 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65  f this.  ** page
163e0 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
163f0 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  che. In this cas
16400 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68  e just update th
16410 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20  e pager cache,. 
16420 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61   ** not the data
16430 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70  base file. The p
16440 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b  age is left mark
16450 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73  ed dirty in this
16460 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   case..  **.  **
16470 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f   An exception to
16480 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a   the above rule:
16490 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
164a0 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d   is in no-sync m
164b0 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70  ode.  ** and a p
164c0 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72  age is moved dur
164d0 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  ing an increment
164e0 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74  al vacuum then t
164f0 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a  he page may.  **
16500 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70   not be in the p
16510 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65  ager cache. Late
16520 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  r: if a malloc()
16530 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   or IO error occ
16540 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20  urs.  ** during 
16550 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c  a Movepage() cal
16560 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  l, then the page
16570 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74   may not be in t
16580 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69  he cache.  ** ei
16590 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e  ther. So the con
165a0 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64  dition described
165b0 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61   in the above pa
165c0 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20  ragraph is not. 
165d0 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65   ** assert()able
165e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69  ..  **.  ** If i
165f0 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c 20  n WRITER_DBMOD, 
16600 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
16610 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74  or OPEN state, t
16620 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68  hen we update th
16630 65 0a 20 20 2a 2a 20 70 61 67 65 72 20 63 61 63  e.  ** pager cac
16640 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73 20  he if it exists 
16650 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  and the main fil
16660 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74  e. The page is t
16670 68 65 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a 2a  hen marked .  **
16680 20 6e 6f 74 20 64 69 72 74 79 2e 20 53 69 6e 63   not dirty. Sinc
16690 65 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 6f  e this code is o
166a0 6e 6c 79 20 65 78 65 63 75 74 65 64 20 69 6e 20  nly executed in 
166b0 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74 65  PAGER_OPEN state
166c0 20 66 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74 2d   for.  ** a hot-
166d0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
166e0 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  , it is guarante
166f0 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
16700 2d 63 61 63 68 65 20 69 73 20 65 6d 70 74 79 0a  -cache is empty.
16710 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65    ** if the page
16720 72 20 69 73 20 69 6e 20 4f 50 45 4e 20 73 74 61  r is in OPEN sta
16730 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69  te..  **.  ** Ti
16740 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65  cket #1171:  The
16750 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
16760 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  al might contain
16770 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68   page content th
16780 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65  at is.  ** diffe
16790 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61  rent from the pa
167a0 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68  ge content at th
167b0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
167c0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ransaction..  **
167d0 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65   This occurs whe
167e0 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e  n a page is chan
167f0 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ged prior to the
16800 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74   start of a stat
16810 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20  ement.  ** then 
16820 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69  changed again wi
16830 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
16840 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e  nt.  When rollin
16850 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20  g back such a.  
16860 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20  ** statement we 
16870 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74  must not write t
16880 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  o the original d
16890 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77  atabase unless w
168a0 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20  e know.  ** for 
168b0 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69  certain that ori
168c0 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
168d0 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69  nts are synced i
168e0 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c  nto the main rol
168f0 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
16900 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  al.  Otherwise, 
16910 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67  a power loss mig
16920 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65  ht leave modifie
16930 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20  d data in the.  
16940 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
16950 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72   without an entr
16960 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  y in the rollbac
16970 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63  k journal that c
16980 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20  an.  ** restore 
16990 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
169a0 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72  its original for
169b0 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f  m.  Two conditio
169c0 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  ns must be.  ** 
169d0 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69  met before writi
169e0 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
169f0 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68  se files. (1) th
16a00 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
16a10 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20  be.  ** locked. 
16a20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61   (2) we know tha
16a30 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
16a40 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66  age content is f
16a50 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a  ully synced.  **
16a60 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   in the main jou
16a70 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61  rnal either beca
16a80 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20  use the page is 
16a90 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
16aa0 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61  else.  ** the pa
16ab0 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
16ac0 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a  needSync==0..  *
16ad0 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31  *.  ** 2008-04-1
16ae0 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74  4:  When attempt
16af0 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20  ing to vacuum a 
16b00 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
16b10 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69   file, it.  ** i
16b20 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61  s possible to fa
16b30 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  il a statement o
16b40 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61  n a database tha
16b50 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65  t does not yet e
16b60 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f  xist..  ** Do no
16b70 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  t attempt to wri
16b80 74 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66  te if database f
16b90 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62 65  ile has never be
16ba0 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a  en opened..  */.
16bb0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
16bc0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
16bd0 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73   pPg = 0;.  }els
16be0 65 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67  e{.    pPg = pag
16bf0 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
16c00 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61  , pgno);.  }.  a
16c10 73 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d  ssert( pPg || !M
16c20 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
16c30 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
16c40 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20  !=PAGER_OPEN || 
16c50 70 50 67 3d 3d 30 20 29 3b 0a 20 20 50 41 47 45  pPg==0 );.  PAGE
16c60 52 54 52 41 43 45 28 28 22 50 4c 41 59 42 41 43  RTRACE(("PLAYBAC
16c70 4b 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  K %d page %d has
16c80 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20  h(%08x) %s\n",. 
16c90 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
16ca0 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c  D(pPager), pgno,
16cb0 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
16cc0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
16cd0 2c 20 28 75 38 2a 29 61 44 61 74 61 29 2c 0a 20  , (u8*)aData),. 
16ce0 20 20 20 20 20 20 20 20 20 20 28 69 73 4d 61 69            (isMai
16cf0 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72  nJrnl?"main-jour
16d00 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61  nal":"sub-journa
16d10 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20  l").  ));.  if( 
16d20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20  isMainJrnl ){.  
16d30 20 20 69 73 53 79 6e 63 65 64 20 3d 20 70 50 61    isSynced = pPa
16d40 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28  ger->noSync || (
16d50 2a 70 4f 66 66 73 65 74 20 3c 3d 20 70 50 61 67  *pOffset <= pPag
16d60 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 3b  er->journalHdr);
16d70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73  .  }else{.    is
16d80 53 79 6e 63 65 64 20 3d 20 28 70 50 67 3d 3d 30  Synced = (pPg==0
16d90 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61   || 0==(pPg->fla
16da0 67 73 20 26 20 50 47 48 44 52 5f 4e 45 45 44 5f  gs & PGHDR_NEED_
16db0 53 59 4e 43 29 29 3b 0a 20 20 7d 0a 20 20 69 66  SYNC));.  }.  if
16dc0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
16dd0 3e 66 64 29 0a 20 20 20 26 26 20 28 70 50 61 67  >fd).   && (pPag
16de0 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
16df0 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c  R_WRITER_DBMOD |
16e00 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
16e10 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20  ==PAGER_OPEN).  
16e20 20 26 26 20 69 73 53 79 6e 63 65 64 0a 20 20 29   && isSynced.  )
16e30 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d  {.    i64 ofst =
16e40 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
16e50 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
16e60 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 21  .    testcase( !
16e70 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 50 67  isSavepnt && pPg
16e80 21 3d 30 20 26 26 20 28 70 50 67 2d 3e 66 6c 61  !=0 && (pPg->fla
16e90 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
16ea0 4e 43 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  NC)!=0 );.    as
16eb0 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
16ec0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
16ed0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
16ee0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
16ef0 2c 20 28 75 38 20 2a 29 61 44 61 74 61 2c 20 70  , (u8 *)aData, p
16f00 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
16f10 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20   ofst);.    if( 
16f20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46  pgno>pPager->dbF
16f30 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ileSize ){.     
16f40 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
16f50 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  ize = pgno;.    
16f60 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
16f70 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20  ->pBackup ){.   
16f80 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72     CODEC1(pPager
16f90 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33  , aData, pgno, 3
16fa0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
16fb0 4d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  M);.      sqlite
16fc0 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50  3BackupUpdate(pP
16fd0 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70  ager->pBackup, p
16fe0 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74 61 29  gno, (u8*)aData)
16ff0 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70  ;.      CODEC2(p
17000 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67  Pager, aData, pg
17010 6e 6f 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45  no, 7, rc=SQLITE
17020 5f 4e 4f 4d 45 4d 2c 20 61 44 61 74 61 29 3b 0a  _NOMEM, aData);.
17030 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
17040 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c 20 26 26  ( !isMainJrnl &&
17050 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pPg==0 ){.    /
17060 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72  * If this is a r
17070 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 73 61 76  ollback of a sav
17080 65 70 6f 69 6e 74 20 61 6e 64 20 64 61 74 61 20  epoint and data 
17090 77 61 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20  was not written 
170a0 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  to.    ** the da
170b0 74 61 62 61 73 65 20 61 6e 64 20 74 68 65 20 70  tabase and the p
170c0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 2d 6d 65  age is not in-me
170d0 6d 6f 72 79 2c 20 74 68 65 72 65 20 69 73 20 61  mory, there is a
170e0 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20 20 20 2a   potential.    *
170f0 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68 65 6e 20  * problem. When 
17100 74 68 65 20 70 61 67 65 20 69 73 20 6e 65 78 74  the page is next
17110 20 66 65 74 63 68 65 64 20 62 79 20 74 68 65 20   fetched by the 
17120 62 2d 74 72 65 65 20 6c 61 79 65 72 2c 20 69 74  b-tree layer, it
17130 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65   .    ** will be
17140 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
17150 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68  atabase file, wh
17160 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ich may or may n
17170 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a 20 63 75  ot be .    ** cu
17180 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a 2a 0a 20  rrent. .    **. 
17190 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20     ** There are 
171a0 61 20 63 6f 75 70 6c 65 20 6f 66 20 64 69 66 66  a couple of diff
171b0 65 72 65 6e 74 20 77 61 79 73 20 74 68 69 73 20  erent ways this 
171c0 63 61 6e 20 68 61 70 70 65 6e 2e 20 41 6c 6c 20  can happen. All 
171d0 61 72 65 20 71 75 69 74 65 0a 20 20 20 20 2a 2a  are quite.    **
171e0 20 6f 62 73 63 75 72 65 2e 20 57 68 65 6e 20 72   obscure. When r
171f0 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e 63 68 72  unning in synchr
17200 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74 68 69 73  onous mode, this
17210 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
17220 20 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20   .    ** if the 
17230 70 61 67 65 20 69 73 20 6f 6e 20 74 68 65 20 66  page is on the f
17240 72 65 65 2d 6c 69 73 74 20 61 74 20 74 68 65 20  ree-list at the 
17250 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
17260 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 20  nsaction, then. 
17270 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 64 2c     ** populated,
17280 20 74 68 65 6e 20 6d 6f 76 65 64 20 75 73 69 6e   then moved usin
17290 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  g sqlite3PagerMo
172a0 76 65 70 61 67 65 28 29 2e 0a 20 20 20 20 2a 2a  vepage()..    **
172b0 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75  .    ** The solu
172c0 74 69 6f 6e 20 69 73 20 74 6f 20 61 64 64 20 61  tion is to add a
172d0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  n in-memory page
172e0 20 74 6f 20 74 68 65 20 63 61 63 68 65 20 63 6f   to the cache co
172f0 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  ntaining.    ** 
17300 74 68 65 20 64 61 74 61 20 6a 75 73 74 20 72 65  the data just re
17310 61 64 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ad from the sub-
17320 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b 20 74 68  journal. Mark th
17330 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 20  e page as dirty 
17340 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69 66 20 74  .    ** and if t
17350 68 65 20 70 61 67 65 72 20 72 65 71 75 69 72 65  he pager require
17360 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63  s a journal-sync
17370 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74 68 65 20  , then mark the 
17380 70 61 67 65 20 61 73 20 0a 20 20 20 20 2a 2a 20  page as .    ** 
17390 72 65 71 75 69 72 69 6e 67 20 61 20 6a 6f 75 72  requiring a jour
173a0 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f 72 65 20  nal-sync before 
173b0 69 74 20 69 73 20 77 72 69 74 74 65 6e 2e 0a 20  it is written.. 
173c0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
173d0 28 20 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20  ( isSavepnt );. 
173e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
173f0 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 3d 3d 30  r->doNotSpill==0
17400 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
17410 64 6f 4e 6f 74 53 70 69 6c 6c 2b 2b 3b 0a 20 20  doNotSpill++;.  
17420 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
17430 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67 65  gerAcquire(pPage
17440 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31  r, pgno, &pPg, 1
17450 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
17460 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
17470 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67  l==1 );.    pPag
17480 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 2d 2d  er->doNotSpill--
17490 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
174a0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
174b0 20 72 63 3b 0a 20 20 20 20 70 50 67 2d 3e 66 6c   rc;.    pPg->fl
174c0 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45  ags &= ~PGHDR_NE
174d0 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c  ED_READ;.    sql
174e0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
174f0 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  rty(pPg);.  }.  
17500 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f  if( pPg ){.    /
17510 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64  * No page should
17520 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69   ever be explici
17530 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  tly rolled back 
17540 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20  that is in use, 
17550 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
17560 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69  r page 1 which i
17570 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e  s held in use in
17580 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
17590 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  he lock on the. 
175a0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
175b0 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73  ctive. However s
175c0 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62  uch a page may b
175d0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  e rolled back as
175e0 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a   a result.    **
175f0 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   of an internal 
17600 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20  error resulting 
17610 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  in an automatic 
17620 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
17630 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
17640 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ack()..    */.  
17650 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20    void *pData;. 
17660 20 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e     pData = pPg->
17670 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70  pData;.    memcp
17680 79 28 70 44 61 74 61 2c 20 28 75 38 2a 29 61 44  y(pData, (u8*)aD
17690 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
176a0 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67  eSize);.    pPag
176b0 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50  er->xReiniter(pP
176c0 67 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4d 61  g);.    if( isMa
176d0 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61  inJrnl && (!isSa
176e0 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65  vepnt || *pOffse
176f0 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t<=pPager->journ
17700 61 6c 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20  alHdr) ){.      
17710 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e  /* If the conten
17720 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  ts of this page 
17730 77 65 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72  were just restor
17740 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ed from the main
17750 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e   .      ** journ
17760 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  al file, then it
17770 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62  s content must b
17780 65 20 61 73 20 74 68 65 79 20 77 65 72 65 20 77  e as they were w
17790 68 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a  hen the .      *
177a0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  * transaction wa
177b0 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20  s first opened. 
177c0 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20  In this case we 
177d0 63 61 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67  can mark the pag
177e0 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c  e.      ** as cl
177f0 65 61 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65  ean, since there
17800 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64   will be no need
17810 20 74 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74   to write it out
17820 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
17830 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
17840 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
17850 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65 70 74  re is one except
17860 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75 6c 65  ion to this rule
17870 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
17880 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20   being rolled.  
17890 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73 20 70      ** back as p
178a0 61 72 74 20 6f 66 20 61 20 73 61 76 65 70 6f 69  art of a savepoi
178b0 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74  nt (or statement
178c0 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20  ) rollback from 
178d0 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73  an .      ** uns
178e0 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66  ynced portion of
178f0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
17900 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  l file, then it 
17910 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20  is not safe.    
17920 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65    ** to mark the
17930 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20   page as clean. 
17940 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
17950 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61 67 65  marking the page
17960 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65   as.      ** cle
17970 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20 74 68  an will clear th
17980 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
17990 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20 74 68  C flag. Since th
179a0 65 20 70 61 67 65 20 69 73 0a 20 20 20 20 20 20  e page is.      
179b0 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
179c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
179d0 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61 67 65  recorded in Page
179e0 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e  r.pInJournal) an
179f0 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50  d.      ** the P
17a00 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
17a10 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 2c 20  lag is cleared, 
17a20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 77  if the page is w
17a30 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 20 20  ritten to.      
17a40 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20  ** again within 
17a50 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
17a60 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d 61 72  , it will be mar
17a70 6b 65 64 20 61 73 20 64 69 72 74 79 20 62 75 74  ked as dirty but
17a80 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47  .      ** the PG
17a90 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
17aa0 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73  ag will not be s
17ab0 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74 68 65  et. It could the
17ac0 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20  n potentially.  
17ad0 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65      ** be writte
17ae0 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65 20 64  n out into the d
17af0 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66  atabase file bef
17b00 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20  ore its journal 
17b10 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 65  file.      ** se
17b20 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65 64 2e  gment is synced.
17b30 20 49 66 20 61 20 63 72 61 73 68 20 6f 63 63 75   If a crash occu
17b40 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c  rs during or fol
17b50 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20 20 20  lowing this,.   
17b60 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63     ** database c
17b70 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e  orruption may en
17b80 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sue..      */.  
17b90 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67      assert( !pag
17ba0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
17bb0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
17bc0 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
17bd0 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
17be0 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
17bf0 61 73 68 28 70 50 67 29 3b 0a 0a 20 20 20 20 2f  ash(pPg);..    /
17c00 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61  * If this was pa
17c10 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f  ge 1, then resto
17c20 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
17c30 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
17c40 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73  ..    ** Do this
17c50 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f   before any deco
17c60 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ding. */.    if(
17c70 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
17c80 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
17c90 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
17ca0 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c  (u8*)pData)[24],
17cb0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
17cc0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
17cd0 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64   }..    /* Decod
17ce0 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20  e the page just 
17cf0 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a  read from disk *
17d00 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61  /.    CODEC1(pPa
17d10 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
17d20 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c  >pgno, 3, rc=SQL
17d30 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20  ITE_NOMEM);.    
17d40 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
17d50 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  ease(pPg);.  }. 
17d60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17d70 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a  *.** Parameter z
17d80 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61  Master is the na
17d90 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
17da0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73  ournal file. A s
17db0 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ingle journal.**
17dc0 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72   file that refer
17dd0 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65  red to the maste
17de0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  r journal file h
17df0 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c  as just been rol
17e00 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69  led back..** Thi
17e10 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
17e20 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
17e30 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
17e40 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
17e50 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65  file,.** and doe
17e60 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a  s so if it is..*
17e70 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d  *.** Argument zM
17e80 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20  aster may point 
17e90 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  to Pager.pTmpSpa
17ea0 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66  ce. So that buff
17eb0 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76  er is not .** av
17ec0 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20  ailable for use 
17ed0 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
17ee0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  tion..**.** When
17ef0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
17f00 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  l file is create
17f10 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c 61 74  d, it is populat
17f20 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  ed with the name
17f30 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20  s .** of all of 
17f40 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  its child journa
17f50 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20 61 6e  ls, one after an
17f60 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74 65 64  other, formatted
17f70 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e   as utf-8 .** en
17f80 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68 65 20  coded text. The 
17f90 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68 69 6c  end of each chil
17fa0 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  d journal file i
17fb0 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20 61 20  s marked with a 
17fc0 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
17fd0 6f 72 20 62 79 74 65 20 28 30 78 30 30 29 2e 20  or byte (0x00). 
17fe0 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72 65 20  i.e. the entire 
17ff0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d 61  contents of a ma
18000 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
18010 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61 6e 73  file for a trans
18020 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67  action involving
18030 20 74 77 6f 20 64 61 74 61 62 61 73 65 73 20 6d   two databases m
18040 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20  ight be:.**.**  
18050 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64   "/home/bill/a.d
18060 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f  b-journal\x00/ho
18070 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75  me/bill/b.db-jou
18080 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20  rnal\x00".**.** 
18090 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  A master journal
180a0 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62   file may only b
180b0 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 61  e deleted once a
180c0 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20  ll of its child 
180d0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76  .** journals hav
180e0 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  e been rolled ba
180f0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ck..**.** This f
18100 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68  unction reads th
18110 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
18120 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
18130 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d   file into .** m
18140 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20  emory and loops 
18150 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f 66 20  through each of 
18160 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
18170 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20  l names. For.** 
18180 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e  each child journ
18190 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66  al, it checks if
181a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74  :.**.**   * if t
181b0 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  he child journal
181c0 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69 66 20   exists, and if 
181d0 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65  so.**   * if the
181e0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63   child journal c
181f0 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65 72 65  ontains a refere
18200 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f  nce to master jo
18210 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69  urnal .**     fi
18220 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a  le zMaster.**.**
18230 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f 75 72   If a child jour
18240 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  nal can be found
18250 20 74 68 61 74 20 6d 61 74 63 68 65 73 20 62 6f   that matches bo
18260 74 68 20 6f 66 20 74 68 65 20 63 72 69 74 65 72  th of the criter
18270 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69  ia.** above, thi
18280 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
18290 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  ns without doing
182a0 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65 72   anything. Other
182b0 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73  wise, if.** no s
182c0 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  uch child journa
182d0 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20  l can be found, 
182e0 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20  file zMaster is 
182f0 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20  deleted from.** 
18300 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
18310 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
18320 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  elete()..**.** I
18330 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 69  f an IO error wi
18340 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69  thin this functi
18350 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  on, an error cod
18360 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54  e is returned. T
18370 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
18380 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79  allocates memory
18390 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69   by calling sqli
183a0 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20  te3Malloc(). If 
183b0 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  an allocation.**
183c0 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e   fails, SQLITE_N
183d0 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
183e0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
183f0 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20  no IO or malloc 
18400 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72  errors .** occur
18410 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
18420 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
18430 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69  ODO: This functi
18440 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 73  on allocates a s
18450 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d  ingle block of m
18460 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a  emory to load.**
18470 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
18480 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74  ents of the mast
18490 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
184a0 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a   This could be.*
184b0 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69  * a couple of ki
184c0 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20 2d 20  lobytes or so - 
184d0 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67  potentially larg
184e0 65 72 20 74 68 61 6e 20 74 68 65 20 70 61 67 65  er than the page
184f0 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74   .** size..*/.st
18500 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64  atic int pager_d
18510 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a  elmaster(Pager *
18520 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
18530 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
18540 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
18550 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
18560 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  ;.  int rc;     
18570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18580 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
18590 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
185a0 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d  pMaster;    /* M
185b0 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a  alloc'd master-j
185c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
185d0 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69  riptor */.  sqli
185e0 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e  te3_file *pJourn
185f0 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27  al;   /* Malloc'
18600 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20  d child-journal 
18610 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
18620 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
18630 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f  erJournal = 0; /
18640 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61  * Contents of ma
18650 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
18660 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74  e */.  i64 nMast
18670 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  erJournal;      
18680 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74   /* Size of mast
18690 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
186a0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  */.  char *zJour
186b0 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f  nal;           /
186c0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6f 6e 65  * Pointer to one
186d0 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 69 6e 20   journal within 
186e0 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  MJ file */.  cha
186f0 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 3b 20 20  r *zMasterPtr;  
18700 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
18710 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e  to hold MJ filen
18720 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f 75 72 6e  ame from a journ
18730 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  al file */.  int
18740 20 6e 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20   nMasterPtr;    
18750 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74         /* Amount
18760 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61   of space alloca
18770 74 65 64 20 74 6f 20 7a 4d 61 73 74 65 72 50 74  ted to zMasterPt
18780 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  r[] */..  /* All
18790 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
187a0 62 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61  both the pJourna
187b0 6c 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69  l and pMaster fi
187c0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a  le descriptors..
187d0 20 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66    ** If successf
187e0 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73  ul, open the mas
187f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18800 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20   for reading..  
18810 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28  */.  pMaster = (
18820 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73  sqlite3_file *)s
18830 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
18840 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20  (pVfs->szOsFile 
18850 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c  * 2);.  pJournal
18860 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
18870 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74   *)(((u8 *)pMast
18880 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73  er) + pVfs->szOs
18890 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d  File);.  if( !pM
188a0 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20  aster ){.    rc 
188b0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
188c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e    }else{.    con
188d0 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28  st int flags = (
188e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
188f0 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
18900 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29  _MASTER_JOURNAL)
18910 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
18920 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
18930 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c  Master, pMaster,
18940 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a   flags, 0);.  }.
18950 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18960 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
18970 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a 20  ster_out;..  /* 
18980 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20  Load the entire 
18990 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
189a0 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f  ile into space o
189b0 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 2a  btained from.  *
189c0 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
189d0 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74  () and pointed t
189e0 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72  o by zMasterJour
189f0 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74 61  nal.   Also obta
18a00 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63 69 65  in.  ** sufficie
18a10 6e 74 20 73 70 61 63 65 20 28 69 6e 20 7a 4d 61  nt space (in zMa
18a20 73 74 65 72 50 74 72 29 20 74 6f 20 68 6f 6c 64  sterPtr) to hold
18a30 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d 61   the names of ma
18a40 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  ster.  ** journa
18a50 6c 20 66 69 6c 65 73 20 65 78 74 72 61 63 74 65  l files extracte
18a60 64 20 66 72 6f 6d 20 72 65 67 75 6c 61 72 20 72  d from regular r
18a70 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c 73  ollback-journals
18a80 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
18a90 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
18aa0 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65  pMaster, &nMaste
18ab0 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28  rJournal);.  if(
18ac0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18ad0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
18ae0 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50 74  out;.  nMasterPt
18af0 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  r = pVfs->mxPath
18b00 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74 65  name+1;.  zMaste
18b10 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  rJournal = sqlit
18b20 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d  e3Malloc((int)nM
18b30 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e  asterJournal + n
18b40 4d 61 73 74 65 72 50 74 72 20 2b 20 31 29 3b 0a  MasterPtr + 1);.
18b50 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f    if( !zMasterJo
18b60 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 72 63 20  urnal ){.    rc 
18b70 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
18b80 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
18b90 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a 4d  er_out;.  }.  zM
18ba0 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73  asterPtr = &zMas
18bb0 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74  terJournal[nMast
18bc0 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20  erJournal+1];.  
18bd0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
18be0 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73  ad(pMaster, zMas
18bf0 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74  terJournal, (int
18c00 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c  )nMasterJournal,
18c10 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
18c20 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
18c30 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
18c40 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b   zMasterJournal[
18c50 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 20  nMasterJournal] 
18c60 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61 6c  = 0;..  zJournal
18c70 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61   = zMasterJourna
18c80 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f  l;.  while( (zJo
18c90 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75  urnal-zMasterJou
18ca0 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75  rnal)<nMasterJou
18cb0 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  rnal ){.    int 
18cc0 65 78 69 73 74 73 3b 0a 20 20 20 20 72 63 20 3d  exists;.    rc =
18cd0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
18ce0 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
18cf0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
18d00 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b  XISTS, &exists);
18d10 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
18d20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18d30 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
18d40 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ut;.    }.    if
18d50 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20  ( exists ){.    
18d60 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
18d70 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64  journals pointed
18d80 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65   to by the maste
18d90 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  r journal exists
18da0 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20  ..      ** Open 
18db0 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20  it and check if 
18dc0 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  it points at the
18dd0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
18de0 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f 2c   If.      ** so,
18df0 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
18e00 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73  deleting the mas
18e10 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
18e20 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
18e30 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 69 6e   int c;.      in
18e40 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54  t flags = (SQLIT
18e50 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
18e60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
18e70 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20  _JOURNAL);.     
18e80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
18e90 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e  pen(pVfs, zJourn
18ea0 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c  al, pJournal, fl
18eb0 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ags, 0);.      i
18ec0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18ed0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
18ee0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
18ef0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 72        }..      r
18f00 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
18f10 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20  urnal(pJournal, 
18f20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73  zMasterPtr, nMas
18f30 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 73  terPtr);.      s
18f40 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a  qlite3OsClose(pJ
18f50 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69  ournal);.      i
18f60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18f70 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
18f80 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
18f90 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63        }..      c
18fa0 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d   = zMasterPtr[0]
18fb0 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d  !=0 && strcmp(zM
18fc0 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65  asterPtr, zMaste
18fd0 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66 28  r)==0;.      if(
18fe0 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a   c ){.        /*
18ff0 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68   We have a match
19000 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  . Do not delete 
19010 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
19020 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
19030 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
19040 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
19050 20 20 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72 6e      }.    zJourn
19060 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74  al += (sqlite3St
19070 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29  rlen30(zJournal)
19080 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71 6c  +1);.  }. .  sql
19090 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73  ite3OsClose(pMas
190a0 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ter);.  rc = sql
190b0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
190c0 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
190d0 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a  .delmaster_out:.
190e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
190f0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
19100 20 20 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b    if( pMaster ){
19110 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
19120 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ose(pMaster);.  
19130 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
19140 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20  n(pJournal) );. 
19150 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
19160 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20  pMaster);.  }.  
19170 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
19180 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
19190 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 68  on is used to ch
191a0 61 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c 20  ange the actual 
191b0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
191c0 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e  base .** file in
191d0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
191e0 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70  . This only happ
191f0 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74  ens when committ
19200 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
19210 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67  n,.** or rolling
19220 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74   back a transact
19230 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72  ion (including r
19240 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f  olling back a ho
19250 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a  t-journal)..**.*
19260 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61  * If the main da
19270 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e  tabase file is n
19280 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65 20  ot open, or the 
19290 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
192a0 65 69 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44 20  either.** DBMOD 
192b0 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20 74  or OPEN state, t
192c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
192d0 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  a no-op. Otherwi
192e0 73 65 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a 2a  se, the size .**
192f0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
19300 63 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67 65  changed to nPage
19310 20 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70 50   pages (nPage*pP
19320 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
19330 79 74 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74 68  ytes). .** If th
19340 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
19350 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67  s currently larg
19360 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61  er than nPage pa
19370 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68  ges, then use th
19380 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61  e VFS.** xTrunca
19390 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74  te() method to t
193a0 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a  runcate it..**.*
193b0 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 6d  * Or, it might m
193c0 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65  ight be the case
193d0 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f   that the file o
193e0 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65  n disk is smalle
193f0 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65  r than .** nPage
19400 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65   pages. Some ope
19410 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d  rating system im
19420 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61  plementations ca
19430 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69  n get confused i
19440 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f  f .** you try to
19450 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65   truncate a file
19460 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68   to some size th
19470 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  at is larger tha
19480 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74  n it .** current
19490 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74  ly is, so detect
194a0 20 74 68 69 73 20 63 61 73 65 20 61 6e 64 20 77   this case and w
194b0 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65  rite a single ze
194c0 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74  ro byte to .** t
194d0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65  he end of the ne
194e0 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a  w file instead..
194f0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
19500 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ful, return SQLI
19510 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20  TE_OK. If an IO 
19520 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
19530 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20  le modifying.** 
19540 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19550 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  e, return the er
19560 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
19570 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  caller..*/.stati
19580 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e  c int pager_trun
19590 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
195a0 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
195b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
195c0 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
195d0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
195e0 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
195f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19600 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
19610 52 45 41 44 45 52 20 29 3b 0a 20 20 0a 20 20 69  READER );.  .  i
19620 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
19630 2d 3e 66 64 29 20 0a 20 20 20 26 26 20 28 70 50  ->fd) .   && (pP
19640 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
19650 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44  GER_WRITER_DBMOD
19660 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61   || pPager->eSta
19670 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 20  te==PAGER_OPEN) 
19680 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75  .  ){.    i64 cu
19690 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69  rrentSize, newSi
196a0 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 61  ze;.    int szPa
196b0 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ge = pPager->pag
196c0 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72  eSize;.    asser
196d0 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
196e0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
196f0 20 29 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a   );.    /* TODO:
19700 20 49 73 20 69 74 20 73 61 66 65 20 74 6f 20 75   Is it safe to u
19710 73 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53  se Pager.dbFileS
19720 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20  ize here? */.   
19730 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
19740 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
19750 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65  fd, &currentSize
19760 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d  );.    newSize =
19770 20 73 7a 50 61 67 65 2a 28 69 36 34 29 6e 50 61   szPage*(i64)nPa
19780 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ge;.    if( rc==
19790 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72  SQLITE_OK && cur
197a0 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a  rentSize!=newSiz
197b0 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  e ){.      if( c
197c0 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69  urrentSize>newSi
197d0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ze ){.        rc
197e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
197f0 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  cate(pPager->fd,
19800 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20   newSize);.     
19810 20 7d 65 6c 73 65 20 69 66 28 20 28 63 75 72 72   }else if( (curr
19820 65 6e 74 53 69 7a 65 2b 73 7a 50 61 67 65 29 3c  entSize+szPage)<
19830 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20  =newSize ){.    
19840 20 20 20 20 63 68 61 72 20 2a 70 54 6d 70 20 3d      char *pTmp =
19850 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
19860 63 65 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  ce;.        mems
19870 65 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a 50 61  et(pTmp, 0, szPa
19880 67 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  ge);.        tes
19890 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d  tcase( (newSize-
198a0 73 7a 50 61 67 65 29 20 3d 3d 20 63 75 72 72 65  szPage) == curre
198b0 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
198c0 20 20 74 65 73 74 63 61 73 65 28 20 28 6e 65 77    testcase( (new
198d0 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3e 20 20  Size-szPage) >  
198e0 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20  currentSize );. 
198f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
19900 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
19910 72 2d 3e 66 64 2c 20 70 54 6d 70 2c 20 73 7a 50  r->fd, pTmp, szP
19920 61 67 65 2c 20 6e 65 77 53 69 7a 65 2d 73 7a 50  age, newSize-szP
19930 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
19940 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19950 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19960 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
19970 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
19980 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
19990 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
199a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 61  *.** Return a sa
199b0 6e 69 74 69 7a 65 64 20 76 65 72 73 69 6f 6e 20  nitized version 
199c0 6f 66 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69  of the sector-si
199d0 7a 65 20 6f 66 20 4f 53 20 66 69 6c 65 20 70 46  ze of OS file pF
199e0 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 65 74 75  ile. The.** retu
199f0 72 6e 20 76 61 6c 75 65 20 69 73 20 67 75 61 72  rn value is guar
19a00 61 6e 74 65 65 64 20 74 6f 20 6c 69 65 20 62 65  anteed to lie be
19a10 74 77 65 65 6e 20 33 32 20 61 6e 64 20 4d 41 58  tween 32 and MAX
19a20 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f  _SECTOR_SIZE..*/
19a30 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 63 74  .int sqlite3Sect
19a40 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  orSize(sqlite3_f
19a50 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
19a60 6e 74 20 69 52 65 74 20 3d 20 73 71 6c 69 74 65  nt iRet = sqlite
19a70 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 46  3OsSectorSize(pF
19a80 69 6c 65 29 3b 0a 20 20 69 66 28 20 69 52 65 74  ile);.  if( iRet
19a90 3c 33 32 20 29 7b 0a 20 20 20 20 69 52 65 74 20  <32 ){.    iRet 
19aa0 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65 20 69  = 512;.  }else i
19ab0 66 28 20 69 52 65 74 3e 4d 41 58 5f 53 45 43 54  f( iRet>MAX_SECT
19ac0 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61  OR_SIZE ){.    a
19ad0 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f  ssert( MAX_SECTO
19ae0 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20  R_SIZE>=512 );. 
19af0 20 20 20 69 52 65 74 20 3d 20 4d 41 58 5f 53 45     iRet = MAX_SE
19b00 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20  CTOR_SIZE;.  }. 
19b10 20 72 65 74 75 72 6e 20 69 52 65 74 3b 0a 7d 0a   return iRet;.}.
19b20 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76  ./*.** Set the v
19b30 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67 65  alue of the Page
19b40 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
19b50 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69  iable for the gi
19b60 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73  ven.** pager bas
19b70 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ed on the value 
19b80 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
19b90 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68  xSectorSize meth
19ba0 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65  od.** of the ope
19bb0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
19bc0 20 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   The sector size
19bd0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 75 73   will be used us
19be0 65 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d  ed .** to determ
19bf0 69 6e 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64  ine the size and
19c00 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f   alignment of jo
19c10 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64  urnal header and
19c20 20 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72   .** master jour
19c30 6e 61 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74  nal pointers wit
19c40 68 69 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72  hin created jour
19c50 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  nal files..**.**
19c60 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   For temporary f
19c70 69 6c 65 73 20 74 68 65 20 65 66 66 65 63 74 69  iles the effecti
19c80 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  ve sector size i
19c90 73 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74  s always 512 byt
19ca0 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  es..**.** Otherw
19cb0 69 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d  ise, for non-tem
19cc0 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68  porary files, th
19cd0 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
19ce0 6f 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68  or size is.** th
19cf0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
19d00 20 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53   by the xSectorS
19d10 69 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75  ize() method rou
19d20 6e 64 65 64 20 75 70 20 74 6f 20 33 32 20 69 66  nded up to 32 if
19d30 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20 74  .** it is less t
19d40 68 61 6e 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64  han 32, or round
19d50 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53  ed down to MAX_S
19d60 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74  ECTOR_SIZE if it
19d70 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
19d80 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  han MAX_SECTOR_S
19d90 49 5a 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  IZE..**.** If th
19da0 65 20 66 69 6c 65 20 68 61 73 20 74 68 65 20 53  e file has the S
19db0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45  QLITE_IOCAP_POWE
19dc0 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20  RSAFE_OVERWRITE 
19dd0 70 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 73  property, then s
19de0 65 74 0a 2a 2a 20 74 68 65 20 65 66 66 65 63 74  et.** the effect
19df0 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  ive sector size 
19e00 74 6f 20 69 74 73 20 6d 69 6e 69 6d 75 6d 20 76  to its minimum v
19e10 61 6c 75 65 20 28 35 31 32 29 2e 20 20 54 68 65  alue (512).  The
19e20 20 70 75 72 70 6f 73 65 20 6f 66 0a 2a 2a 20 70   purpose of.** p
19e30 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
19e40 65 20 69 73 20 74 6f 20 64 65 66 69 6e 65 20 74  e is to define t
19e50 68 65 20 22 62 6c 61 73 74 20 72 61 64 69 75 73  he "blast radius
19e60 22 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 0a  " of bytes that.
19e70 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ** might change 
19e80 69 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72  if a crash occur
19e90 73 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  s while writing 
19ea0 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  to a single byte
19eb0 20 69 6e 0a 2a 2a 20 74 68 61 74 20 72 61 6e 67   in.** that rang
19ec0 65 2e 20 20 42 75 74 20 77 69 74 68 20 50 4f 57  e.  But with POW
19ed0 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
19ee0 2c 20 74 68 65 20 62 6c 61 73 74 20 72 61 64 69  , the blast radi
19ef0 75 73 20 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 74  us is zero.** (t
19f00 68 61 74 20 69 73 20 77 68 61 74 20 50 4f 57 45  hat is what POWE
19f10 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20  RSAFE_OVERWRITE 
19f20 6d 65 61 6e 73 29 2c 20 73 6f 20 77 65 20 6d 69  means), so we mi
19f30 6e 69 6d 69 7a 65 20 74 68 65 20 73 65 63 74 6f  nimize the secto
19f40 72 0a 2a 2a 20 73 69 7a 65 2e 20 20 46 6f 72 20  r.** size.  For 
19f50 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
19f60 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 72  ibility of the r
19f70 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
19f80 66 69 6c 65 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20  file format,.** 
19f90 77 65 20 63 61 6e 6e 6f 74 20 72 65 64 75 63 65  we cannot reduce
19fa0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
19fb0 65 63 74 6f 72 20 73 69 7a 65 20 62 65 6c 6f 77  ector size below
19fc0 20 35 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   512..*/.static 
19fd0 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53 69  void setSectorSi
19fe0 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
19ff0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  ){.  assert( isO
1a000 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1a010 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
1a020 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 50  ile );..  if( pP
1a030 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20  ager->tempFile. 
1a040 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44    || (sqlite3OsD
1a050 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1a060 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
1a070 20 26 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   & .            
1a080 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50    SQLITE_IOCAP_P
1a090 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1a0a0 54 45 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  TE)!=0.  ){.    
1a0b0 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 64  /* Sector size d
1a0c0 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66 6f  oesn't matter fo
1a0d0 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
1a0e0 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c  s. Also, the fil
1a0f0 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74  e.    ** may not
1a100 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
1a110 64 20 79 65 74 2c 20 69 6e 20 77 68 69 63 68 20  d yet, in which 
1a120 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74 6f  case the OsSecto
1a130 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63  rSize().    ** c
1a140 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75 6c  all will segfaul
1a150 74 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72  t. */.    pPager
1a160 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35  ->sectorSize = 5
1a170 31 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  12;.  }else{.   
1a180 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
1a190 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 53 65 63  ize = sqlite3Sec
1a1a0 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  torSize(pPager->
1a1b0 66 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  fd);.  }.}../*.*
1a1c0 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a  * Playback the j
1a1d0 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20  ournal and thus 
1a1e0 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
1a1f0 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20  base file to.** 
1a200 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73  the state it was
1a210 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74   in before we st
1a220 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61  arted making cha
1a230 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  nges.  .**.** Th
1a240 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
1a250 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c  ormat is as foll
1a260 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29  ows: .**.**  (1)
1a270 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e    8 byte prefix.
1a280 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75    A copy of aJou
1a290 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20  rnalMagic[]..** 
1a2a0 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67   (2)  4 byte big
1a2b0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
1a2c0 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
1a2d0 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67  ber of valid pag
1a2e0 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20  e records.**    
1a2f0 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61     in the journa
1a300 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75  l.  If this valu
1a310 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  e is 0xffffffff,
1a320 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68   then compute th
1a330 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65  e.**       numbe
1a340 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
1a350 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  s from the journ
1a360 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29  al size..**  (3)
1a370 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
1a380 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
1a390 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  h is the initial
1a3a0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a   value for the .
1a3b0 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20  **       sanity 
1a3c0 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34  checksum..**  (4
1a3d0 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65  )  4 byte intege
1a3e0 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
1a3f0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
1a400 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a  o truncate the.*
1a410 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65  *       database
1a420 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c   to during a rol
1a430 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20  lback..**  (5)  
1a440 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
1a450 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
1a460 69 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  is the sector si
1a470 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a  ze.  The header.
1a480 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68 69 73  **       is this
1a490 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73   many bytes in s
1a4a0 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20  ize..**  (6)  4 
1a4b0 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
1a4c0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1a4d0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a   the page size..
1a4e0 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f 20 70 61  **  (7)  zero pa
1a4f0 64 64 69 6e 67 20 6f 75 74 20 74 6f 20 74 68 65  dding out to the
1a500 20 6e 65 78 74 20 73 65 63 74 6f 72 20 73 69 7a   next sector siz
1a510 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f  e..**  (8)  Zero
1a520 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69   or more pages i
1a530 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61  nstances, each a
1a540 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20  s follows:.**   
1a550 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70       +  4 byte p
1a560 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20  age number..**  
1a570 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d        +  pPager-
1a580 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
1a590 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20  of data..**     
1a5a0 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65     +  4 byte che
1a5b0 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  cksum.**.** When
1a5c0 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65   we speak of the
1a5d0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c   journal header,
1a5e0 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72   we mean the fir
1a5f0 73 74 20 37 20 69 74 65 6d 73 20 61 62 6f 76 65  st 7 items above
1a600 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20  ..** Each entry 
1a610 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
1a620 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
1a630 20 74 68 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a   the 8th item..*
1a640 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61  *.** Call the va
1a650 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63  lue from the sec
1a660 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63  ond bullet "nRec
1a670 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20  ".  nRec is the 
1a680 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c  number of.** val
1a690 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20  id page entries 
1a6a0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
1a6b0 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20   In most cases, 
1a6c0 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20  you can compute 
1a6d0 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
1a6e0 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69  nRec from the si
1a6f0 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
1a700 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20  l file.  But if 
1a710 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  a power.** failu
1a720 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
1a730 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  e the journal wa
1a740 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
1a750 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65   it could be the
1a760 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68  .** case that th
1a770 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
1a780 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61  urnal file had a
1a790 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
1a7a0 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65  eased but.** the
1a7b0 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68   extra entries h
1a7c0 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20  ad not yet made 
1a7d0 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73  it safely to dis
1a7e0 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61  k.  In such a ca
1a7f0 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  se,.** the value
1a800 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65   of nRec compute
1a810 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  d from the file 
1a820 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  size would be to
1a830 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a  o large.  For.**
1a840 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65   that reason, we
1a850 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
1a860 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68  nRec value in th
1a870 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
1a880 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  If the nRec valu
1a890 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20  e is 0xffffffff 
1a8a0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52  it means that nR
1a8b0 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ec should be com
1a8c0 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68  puted.** from th
1a8d0 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68  e file size.  Th
1a8e0 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  is value is used
1a8f0 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73   when the user s
1a900 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f  elects the.** no
1a910 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72  -sync option for
1a920 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
1a930 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
1a940 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72  ould lead to cor
1a950 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  ruption.** in th
1a960 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f  is case.  But fo
1a970 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65  r things like te
1a980 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77  mporary table (w
1a990 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  hich will be.** 
1a9a0 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
1a9b0 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
1a9c0 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72  ed) we don't car
1a9d0 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e.  .**.** If th
1a9e0 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73  e file opened as
1a9f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1aa00 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d  e is not a well-
1aa10 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61  formed.** journa
1aa20 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20  l file then all 
1aa30 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20  pages up to the 
1aa40 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20  first corrupted 
1aa50 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a  page are rolled.
1aa60 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70  ** back (or no p
1aa70 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72  ages if the jour
1aa80 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f  nal header is co
1aa90 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f  rrupted). The jo
1aaa0 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
1aab0 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e   then deleted an
1aac0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
1aad0 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66  rned, just as if
1aae0 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68   no corruption h
1aaf0 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75  ad.** been encou
1ab00 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntered..**.** If
1ab10 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f   an I/O or mallo
1ab20 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73  c() error occurs
1ab30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69  , the journal-fi
1ab40 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65  le is not delete
1ab50 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  d.** and an erro
1ab60 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1ab70 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73  ed..**.** The is
1ab80 48 6f 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e  Hot parameter in
1ab90 64 69 63 61 74 65 73 20 74 68 61 74 20 77 65 20  dicates that we 
1aba0 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f  are trying to ro
1abb0 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  llback a journal
1abc0 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62  .** that might b
1abd0 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e  e a hot journal.
1abe0 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62    Or, it could b
1abf0 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
1ac00 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72  al is .** preser
1ac10 76 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a  ved because of J
1ac20 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
1ac30 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44  ST or JOURNALMOD
1ac40 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49  E_TRUNCATE..** I
1ac50 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  f the journal re
1ac60 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73  ally is hot, res
1ac70 65 74 20 74 68 65 20 70 61 67 65 72 20 63 61 63  et the pager cac
1ac80 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67  he prior rolling
1ac90 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e  .** back any con
1aca0 74 65 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f  tent.  If the jo
1acb0 75 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20  urnal is merely 
1acc0 70 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72  persistent, no r
1acd0 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65  eset is.** neede
1ace0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1acf0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
1ad00 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
1ad10 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c  nt isHot){.  sql
1ad20 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
1ad30 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
1ad40 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
1ad50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1ad60 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
1ad70 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
1ad80 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20  /.  u32 nRec;   
1ad90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ada0 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
1adb0 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
1adc0 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20   */.  u32 u;    
1add0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ade0 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
1adf0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e  counter */.  Pgn
1ae00 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20  o mxPg = 0;     
1ae10 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1ae20 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69   the original fi
1ae30 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20  le in pages */. 
1ae40 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1ae50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1ae60 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75  ult code of a su
1ae70 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
1ae80 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20  t res = 1;      
1ae90 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1aea0 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69  returned by sqli
1aeb0 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f  te3OsAccess() */
1aec0 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
1aed0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
1aee0 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ame of master jo
1aef0 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e  urnal file if an
1af00 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50  y */.  int needP
1af10 61 67 65 72 52 65 73 65 74 3b 20 20 20 20 20 20  agerReset;      
1af20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74  /* True to reset
1af30 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66   page prior to f
1af40 69 72 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61  irst page rollba
1af50 63 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  ck */..  /* Figu
1af60 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
1af70 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
1af80 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f  he journal.  Abo
1af90 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a  rt early if.  **
1afa0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1afb0 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73  empty..  */.  as
1afc0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1afd0 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72  ger->jfd) );.  r
1afe0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
1aff0 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
1b000 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  d, &szJ);.  if( 
1b010 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1b020 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
1b030 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
1b040 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  * Read the maste
1b050 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66  r journal name f
1b060 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
1b070 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
1b080 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73  t..  ** If a mas
1b090 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1b0a0 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69   name is specifi
1b0b0 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65  ed, but the file
1b0c0 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65   is not.  ** pre
1b0d0 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68  sent on disk, th
1b0e0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  en the journal i
1b0f0 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f  s not hot and do
1b100 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
1b110 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61  e.  ** played ba
1b120 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f  ck..  **.  ** TO
1b130 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20  DO: Technically 
1b140 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
1b150 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73   an error becaus
1b160 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61  e it assumes tha
1b170 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61  t.  ** buffer Pa
1b180 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73  ger.pTmpSpace is
1b190 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20   (mxPathname+1) 
1b1a0 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e  bytes or larger.
1b1b0 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20   i.e. that.  ** 
1b1c0 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
1b1d0 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  e >= pPager->pVf
1b1e0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
1b1f0 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e  . Using os_unix.
1b200 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e  c,.  **  mxPathn
1b210 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69 63  ame is 512, whic
1b220 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  h is the same as
1b230 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c   the minimum all
1b240 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a  owable value.  *
1b250 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a  * for pageSize..
1b260 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d    */.  zMaster =
1b270 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
1b280 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d  ce;.  rc = readM
1b290 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
1b2a0 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
1b2b0 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
1b2c0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
1b2d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1b2e0 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30  _OK && zMaster[0
1b2f0 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ] ){.    rc = sq
1b300 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
1b310 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
1b320 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
1b330 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20  S, &res);.  }.  
1b340 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69  zMaster = 0;.  i
1b350 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b360 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20   || !res ){.    
1b370 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1b380 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
1b390 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
1b3a0 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  .  needPagerRese
1b3b0 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a  t = isHot;..  /*
1b3c0 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69   This loop termi
1b3d0 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65  nates either whe
1b3e0 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  n a readJournalH
1b3f0 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61  dr() or .  ** pa
1b400 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
1b410 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74  _page() call ret
1b420 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
1b430 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
1b440 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20  .  ** occurs. . 
1b450 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29   */.  while( 1 )
1b460 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  {.    /* Read th
1b470 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
1b480 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a  eader from the j
1b490 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66  ournal file.  If
1b4a0 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a   there are.    *
1b4b0 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74  * not enough byt
1b4c0 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a  es left in the j
1b4d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
1b4e0 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65  a complete heade
1b4f0 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20  r, or.    ** it 
1b500 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68  is corrupted, th
1b510 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73  en a process mus
1b520 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 68  t have failed wh
1b530 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a  ile writing it..
1b540 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69      ** This indi
1b550 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f  cates nothing mo
1b560 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  re needs to be r
1b570 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
1b580 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  */.    rc = read
1b590 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
1b5a0 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26  r, isHot, szJ, &
1b5b0 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20  nRec, &mxPg);.  
1b5c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b5d0 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66  _OK ){ .      if
1b5e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
1b5f0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  E ){.        rc 
1b600 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1b610 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
1b620 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1b630 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
1b640 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66  Rec is 0xfffffff
1b650 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75  f, then this jou
1b660 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64  rnal was created
1b670 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20   by a process.  
1b680 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20    ** working in 
1b690 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68  no-sync mode. Th
1b6a0 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
1b6b0 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  e rest of the jo
1b6c0 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
1b6d0 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61  e consists of pa
1b6e0 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e  ges, there are n
1b6f0 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68  o more journal h
1b700 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a  eaders. Compute.
1b710 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
1b720 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f   of nRec based o
1b730 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f  n this assumptio
1b740 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
1b750 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66  ( nRec==0xffffff
1b760 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ff ){.      asse
1b770 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
1b780 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
1b790 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
1b7a0 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  ;.      nRec = (
1b7b0 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52  int)((szJ - JOUR
1b7c0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
1b7d0 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  r))/JOURNAL_PG_S
1b7e0 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
1b7f0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
1b800 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20  c is 0 and this 
1b810 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61  rollback is of a
1b820 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65   transaction cre
1b830 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20  ated by this.   
1b840 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20   ** process and 
1b850 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
1b860 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74  inal header in t
1b870 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e  he journal, then
1b880 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a   it means.    **
1b890 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20   that this part 
1b8a0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  of the journal w
1b8b0 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20  as being filled 
1b8c0 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20  but has not yet 
1b8d0 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63  been.    ** sync
1b8e0 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d  ed to disk.  Com
1b8f0 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  pute the number 
1b900 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f  of pages based o
1b910 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a  n the remaining.
1b920 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74      ** size of t
1b930 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  he file..    **.
1b940 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64      ** The third
1b950 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73   term of the tes
1b960 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66  t was added to f
1b970 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  ix ticket #2565.
1b980 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c  .    ** When rol
1b990 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20  ling back a hot 
1b9a0 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30  journal, nRec==0
1b9b0 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68   always means th
1b9c0 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20  at the next.    
1b9d0 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20  ** chunk of the 
1b9e0 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73  journal contains
1b9f0 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62   zero pages to b
1ba00 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
1ba10 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  But.    ** when 
1ba20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b  doing a ROLLBACK
1ba30 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30   and the nRec==0
1ba40 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61   chunk is the la
1ba50 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20  st chunk in.    
1ba60 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  ** the journal, 
1ba70 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
1ba80 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  e journal might 
1ba90 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e  contain addition
1baa0 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20  al.    ** pages 
1bab0 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
1bac0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20  rolled back and 
1bad0 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20  that the number 
1bae0 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a  of pages .    **
1baf0 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75   should be compu
1bb00 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ted based on the
1bb10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69   journal file si
1bb20 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
1bb30 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69  f( nRec==0 && !i
1bb40 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20  sHot &&.        
1bb50 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
1bb60 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
1bb70 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
1bb80 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
1bb90 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69  .      nRec = (i
1bba0 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  nt)((szJ - pPage
1bbb0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
1bbc0 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
1bbd0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a  Pager));.    }..
1bbe0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
1bbf0 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64  s the first head
1bc00 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  er read from the
1bc10 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61   journal, trunca
1bc20 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  te the.    ** da
1bc30 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b  tabase file back
1bc40 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
1bc50 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
1bc60 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
1bc70 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
1bc80 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
1bc90 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1bca0 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
1bcb0 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20  ager, mxPg);.   
1bcc0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1bcd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1bce0 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1bcf0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1bd00 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1bd10 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20  = mxPg;.    }.. 
1bd20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69     /* Copy origi
1bd30 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66  nal pages out of
1bd40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
1bd50 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a   back into the .
1bd60 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1bd70 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67 65  file and/or page
1bd80 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20   cache..    */. 
1bd90 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52     for(u=0; u<nR
1bda0 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20  ec; u++){.      
1bdb0 69 66 28 20 6e 65 65 64 50 61 67 65 72 52 65 73  if( needPagerRes
1bdc0 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  et ){.        pa
1bdd0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
1bde0 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64 50  );.        needP
1bdf0 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a 20  agerReset = 0;. 
1be00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
1be10 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
1be20 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
1be30 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ,&pPager->journa
1be40 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20 20  lOff,0,1,0);.   
1be50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1be60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1be70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
1be80 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
1be90 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1bea0 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20  Off = szJ;.     
1beb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bec0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
1bed0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
1bee0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
1bef0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
1bf00 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65   journal has bee
1bf10 6e 20 74 72 75 6e 63 61 74 65 64 2c 20 73 69 6d  n truncated, sim
1bf20 70 6c 79 20 73 74 6f 70 20 72 65 61 64 69 6e 67  ply stop reading
1bf30 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a   and.          *
1bf40 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65  * processing the
1bf50 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69 73 20 6d   journal. This m
1bf60 69 67 68 74 20 68 61 70 70 65 6e 20 69 66 20 74  ight happen if t
1bf70 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  he journal was. 
1bf80 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20           ** not 
1bf90 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72 69 74 74  completely writt
1bfa0 65 6e 20 61 6e 64 20 73 79 6e 63 65 64 20 70 72  en and synced pr
1bfb0 69 6f 72 20 74 6f 20 61 20 63 72 61 73 68 2e 20  ior to a crash. 
1bfc0 20 49 6e 20 74 68 61 74 0a 20 20 20 20 20 20 20   In that.       
1bfd0 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 20     ** case, the 
1bfe0 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20  database should 
1bff0 68 61 76 65 20 6e 65 76 65 72 20 62 65 65 6e 20  have never been 
1c000 77 72 69 74 74 65 6e 20 69 6e 20 74 68 65 0a 20  written in the. 
1c010 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73           ** firs
1c020 74 20 70 6c 61 63 65 20 73 6f 20 69 74 20 69 73  t place so it is
1c030 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79 20 61 62   OK to simply ab
1c040 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61  andon the rollba
1c050 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ck. */.         
1c060 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c070 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
1c080 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1c090 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c0a0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
1c0b0 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f  are unable to ro
1c0c0 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20 61 6e 64  llback, quit and
1c0d0 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
1c0e0 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  r.          ** c
1c0f0 6f 64 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  ode.  This will 
1c100 63 61 75 73 65 20 74 68 65 20 70 61 67 65 72 20  cause the pager 
1c110 74 6f 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  to enter the err
1c120 6f 72 20 73 74 61 74 65 0a 20 20 20 20 20 20 20  or state.       
1c130 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f     ** so that no
1c140 20 66 75 72 74 68 65 72 20 68 61 72 6d 20 77 69   further harm wi
1c150 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20 50 65 72  ll be done.  Per
1c160 68 61 70 73 20 74 68 65 20 6e 65 78 74 0a 20 20  haps the next.  
1c170 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
1c180 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67  ss to come along
1c190 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f   will be able to
1c1a0 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 64 61   rollback the da
1c1b0 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 20 20  tabase..        
1c1c0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67    */.          g
1c1d0 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
1c1e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c1f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1c200 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20  /*NOTREACHED*/. 
1c210 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65   assert( 0 );..e
1c220 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 2f  nd_playback:.  /
1c230 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20 72 6f  * Following a ro
1c240 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  llback, the data
1c250 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64  base file should
1c260 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74 73 20   be back in its 
1c270 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 73 74  original.  ** st
1c280 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ate prior to the
1c290 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
1c2a0 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20 69 6e  ansaction, so in
1c2b0 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20 53 51  voke the.  ** SQ
1c2c0 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e  LITE_FCNTL_DB_UN
1c2d0 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63 6f 6e  CHANGED file-con
1c2e0 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f 20 64  trol method to d
1c2f0 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a 2a 20  isable the.  ** 
1c300 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74 20 74  assertion that t
1c310 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1c320 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64 69 66  ounter was modif
1c330 69 65 64 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ied..  */.#ifdef
1c340 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
1c350 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e  if( pPager->fd->
1c360 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
1c370 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
1c380 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72 2d  trolHint(pPager-
1c390 3e 66 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c  >fd,SQLITE_FCNTL
1c3a0 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29  _DB_UNCHANGED,0)
1c3b0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1c3c0 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79 62  /* If this playb
1c3d0 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67  ack is happening
1c3e0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
1c3f0 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e  s a result of an
1c400 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c   IO or .  ** mal
1c410 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f  loc error that o
1c420 63 63 75 72 72 65 64 20 61 66 74 65 72 20 74 68  ccurred after th
1c430 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1c440 20 77 61 73 20 75 70 64 61 74 65 64 20 62 75 74   was updated but
1c450 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68   .  ** before th
1c460 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
1c470 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65  s committed, the
1c480 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  n the change-cou
1c490 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66  nter .  ** modif
1c4a0 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74  ication may just
1c4b0 20 68 61 76 65 20 62 65 65 6e 20 72 65 76 65 72   have been rever
1c4c0 74 65 64 2e 20 49 66 20 74 68 69 73 20 68 61 70  ted. If this hap
1c4d0 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76  pens in exclusiv
1c4e0 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68  e .  ** mode, th
1c4f0 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74 72  en subsequent tr
1c500 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f  ansactions perfo
1c510 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e  rmed by the conn
1c520 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a  ection will not.
1c530 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20    ** update the 
1c540 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61  change-counter a
1c550 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20  t all. This may 
1c560 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e  lead to cache in
1c570 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a  consistency.  **
1c580 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74   problems for ot
1c590 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 74  her processes at
1c5a0 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74   some point in t
1c5b0 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a  he future. So, j
1c5c0 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65  ust.  ** in case
1c5d0 20 74 68 69 73 20 68 61 73 20 68 61 70 70 65 6e   this has happen
1c5e0 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68  ed, clear the ch
1c5f0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c  angeCountDone fl
1c600 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70  ag now..  */.  p
1c610 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
1c620 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
1c630 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66  >tempFile;..  if
1c640 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c650 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  ){.    zMaster =
1c660 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
1c670 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61  ce;.    rc = rea
1c680 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
1c690 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
1c6a0 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66  ter, pPager->pVf
1c6b0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
1c6c0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1c6d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1c6e0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1c6f0 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 28  QLITE_OK.   && (
1c700 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
1c710 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
1c720 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OD || pPager->eS
1c730 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
1c740 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ).  ){.    rc = 
1c750 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63  sqlite3PagerSync
1c760 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
1c770 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c780 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
1c790 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
1c7a0 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  ion(pPager, zMas
1c7b0 74 65 72 5b 30 5d 21 3d 27 5c 30 27 2c 20 30 29  ter[0]!='\0', 0)
1c7c0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1c7d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1c7e0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
1c7f0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
1c800 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b  ter[0] && res ){
1c810 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
1c820 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f   was a master jo
1c830 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72  urnal and this r
1c840 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
1c850 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20  rn success,.    
1c860 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
1c870 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
1c880 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
1c890 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  urnal..    */.  
1c8a0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c    rc = pager_del
1c8b0 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a  master(pPager, z
1c8c0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73  Master);.    tes
1c8d0 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
1c8e0 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  E_OK );.  }..  /
1c8f0 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74  * The Pager.sect
1c900 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
1c910 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70  may have been up
1c920 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c  dated while roll
1c930 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20  ing.  ** back a 
1c940 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
1c950 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74  by a process wit
1c960 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65  h a different se
1c970 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76  ctor size.  ** v
1c980 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74  alue. Reset it t
1c990 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61  o the correct va
1c9a0 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  lue for this pro
1c9b0 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74  cess..  */.  set
1c9c0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
1c9d0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
1c9e0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  .}.../*.** Read 
1c9f0 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20  the content for 
1ca00 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20  page pPg out of 
1ca10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ca20 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20 70  e and into .** p
1ca30 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68 61  Pg->pData. A sha
1ca40 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61  red lock or grea
1ca50 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ter must be held
1ca60 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1ca70 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20  .** file before 
1ca80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1ca90 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
1caa0 66 20 70 61 67 65 20 31 20 69 73 20 72 65 61 64  f page 1 is read
1cab0 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
1cac0 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65   of Pager.dbFile
1cad0 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74 6f  Vers[] is set to
1cae0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65  .** the value re
1caf0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
1cb00 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
1cb10 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
1cb20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
1cb30 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65 74   IO error is ret
1cb40 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c  urned to the cal
1cb50 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ler..** Otherwis
1cb60 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  e, SQLITE_OK is 
1cb70 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1cb80 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61  tic int readDbPa
1cb90 67 65 28 50 67 48 64 72 20 2a 70 50 67 2c 20 75  ge(PgHdr *pPg, u
1cba0 33 32 20 69 46 72 61 6d 65 29 7b 0a 20 20 50 61  32 iFrame){.  Pa
1cbb0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1cbc0 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50 61  g->pPager; /* Pa
1cbd0 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f 63  ger object assoc
1cbe0 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20  iated with page 
1cbf0 70 50 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  pPg */.  Pgno pg
1cc00 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20  no = pPg->pgno; 
1cc10 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
1cc20 6d 62 65 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a  mber to read */.
1cc30 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1cc40 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f  E_OK;          /
1cc50 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1cc60 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 50  .  int pgsz = pP
1cc70 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20  ager->pageSize; 
1cc80 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1cc90 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20  es to read */.. 
1cca0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1ccb0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
1ccc0 45 41 44 45 52 20 26 26 20 21 4d 45 4d 44 42 20  EADER && !MEMDB 
1ccd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
1cce0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1ccf0 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28  );..  if( NEVER(
1cd00 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
1cd10 66 64 29 29 20 29 7b 0a 20 20 20 20 61 73 73 65  fd)) ){.    asse
1cd20 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  rt( pPager->temp
1cd30 46 69 6c 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73  File );.    mems
1cd40 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30  et(pPg->pData, 0
1cd50 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
1cd60 7a 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ze);.    return 
1cd70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
1cd80 20 20 69 66 28 20 69 46 72 61 6d 65 20 29 7b 0a    if( iFrame ){.
1cd90 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 70 75      /* Try to pu
1cda0 6c 6c 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ll the page from
1cdb0 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64   the write-ahead
1cdc0 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20   log. */.    rc 
1cdd0 3d 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64  = sqlite3WalRead
1cde0 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
1cdf0 61 6c 2c 20 69 46 72 61 6d 65 2c 20 70 67 73 7a  al, iFrame, pgsz
1ce00 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20  , pPg->pData);. 
1ce10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34 20   }else{.    i64 
1ce20 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d  iOffset = (pgno-
1ce30 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
1ce40 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63  pageSize;.    rc
1ce50 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
1ce60 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67  (pPager->fd, pPg
1ce70 2d 3e 70 44 61 74 61 2c 20 70 67 73 7a 2c 20 69  ->pData, pgsz, i
1ce80 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28  Offset);.    if(
1ce90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
1cea0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
1ceb0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1cec0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
1ced0 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29  .  if( pgno==1 )
1cee0 7b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  {.    if( rc ){.
1cef0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1cf00 72 65 61 64 20 69 73 20 75 6e 73 75 63 63 65 73  read is unsucces
1cf10 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 64 62  sful, set the db
1cf20 46 69 6c 65 56 65 72 73 5b 5d 20 74 6f 20 73 6f  FileVers[] to so
1cf30 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a  mething.      **
1cf40 20 74 68 61 74 20 77 69 6c 6c 20 6e 65 76 65 72   that will never
1cf50 20 62 65 20 61 20 76 61 6c 69 64 20 66 69 6c 65   be a valid file
1cf60 20 76 65 72 73 69 6f 6e 2e 20 20 64 62 46 69 6c   version.  dbFil
1cf70 65 56 65 72 73 5b 5d 20 69 73 20 61 20 63 6f 70  eVers[] is a cop
1cf80 79 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 62 79  y.      ** of by
1cf90 74 65 73 20 32 34 2e 2e 33 39 20 6f 66 20 74 68  tes 24..39 of th
1cfa0 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 79 74  e database.  Byt
1cfb0 65 73 20 32 38 2e 2e 33 31 20 73 68 6f 75 6c 64  es 28..31 should
1cfc0 20 61 6c 77 61 79 73 20 62 65 0a 20 20 20 20 20   always be.     
1cfd0 20 2a 2a 20 7a 65 72 6f 20 6f 72 20 74 68 65 20   ** zero or the 
1cfe0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1cff0 62 61 73 65 20 69 6e 20 70 61 67 65 2e 20 42 79  base in page. By
1d000 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20 33  tes 32..35 and 3
1d010 35 2e 2e 33 39 0a 20 20 20 20 20 20 2a 2a 20 73  5..39.      ** s
1d020 68 6f 75 6c 64 20 62 65 20 70 61 67 65 20 6e 75  hould be page nu
1d030 6d 62 65 72 73 20 77 68 69 63 68 20 61 72 65 20  mbers which are 
1d040 6e 65 76 65 72 20 30 78 66 66 66 66 66 66 66 66  never 0xffffffff
1d050 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 0a 20 20  .  So filling.  
1d060 20 20 20 20 2a 2a 20 70 50 61 67 65 72 2d 3e 64      ** pPager->d
1d070 62 46 69 6c 65 56 65 72 73 5b 5d 20 77 69 74 68  bFileVers[] with
1d080 20 61 6c 6c 20 30 78 66 66 20 62 79 74 65 73 20   all 0xff bytes 
1d090 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e 0a  should suffice..
1d0a0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1d0b0 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70 74  * For an encrypt
1d0c0 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ed database, the
1d0d0 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d 6f   situation is mo
1d0e0 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79 74  re complex:  byt
1d0f0 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e 2e  es.      ** 24..
1d100 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  39 of the databa
1d110 73 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f 69  se are white noi
1d120 73 65 2e 20 20 42 75 74 20 74 68 65 20 70 72 6f  se.  But the pro
1d130 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20 20  bability of.    
1d140 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73 69    ** white noisi
1d150 6e 67 20 65 71 75 61 6c 69 6e 67 20 31 36 20 62  ng equaling 16 b
1d160 79 74 65 73 20 6f 66 20 30 78 66 66 20 69 73 20  ytes of 0xff is 
1d170 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
1d180 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77 65  l so.      ** we
1d190 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62 65   should still be
1d1a0 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   ok..      */.  
1d1b0 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
1d1c0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 30  r->dbFileVers, 0
1d1d0 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  xff, sizeof(pPag
1d1e0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
1d1f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d200 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72     u8 *dbFileVer
1d210 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e  s = &((u8*)pPg->
1d220 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20  pData)[24];.    
1d230 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
1d240 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
1d250 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
1d260 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1d270 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ers));.    }.  }
1d280 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72  .  CODEC1(pPager
1d290 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67  , pPg->pData, pg
1d2a0 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c 49  no, 3, rc = SQLI
1d2b0 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50 41  TE_NOMEM);..  PA
1d2c0 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
1d2d0 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
1d2e0 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e  unt);.  PAGER_IN
1d2f0 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64  CR(pPager->nRead
1d300 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50  );.  IOTRACE(("P
1d310 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  GIN %p %d\n", pP
1d320 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
1d330 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45 54  PAGERTRACE(("FET
1d340 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CH %d page %d ha
1d350 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
1d360 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
1d370 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
1d380 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
1d390 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65 74  h(pPg)));..  ret
1d3a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d3b0 20 55 70 64 61 74 65 20 74 68 65 20 76 61 6c 75   Update the valu
1d3c0 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 2d  e of the change-
1d3d0 63 6f 75 6e 74 65 72 20 61 74 20 6f 66 66 73 65  counter at offse
1d3e0 74 73 20 32 34 20 61 6e 64 20 39 32 20 69 6e 0a  ts 24 and 92 in.
1d3f0 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 61 6e  ** the header an
1d400 64 20 74 68 65 20 73 71 6c 69 74 65 20 76 65 72  d the sqlite ver
1d410 73 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f  sion number at o
1d420 66 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20  ffset 96..**.** 
1d430 54 68 69 73 20 69 73 20 61 6e 20 75 6e 63 6f 6e  This is an uncon
1d440 64 69 74 69 6f 6e 61 6c 20 75 70 64 61 74 65 2e  ditional update.
1d450 20 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20 70    See also the p
1d460 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
1d470 63 6f 75 6e 74 65 72 28 29 0a 2a 2a 20 72 6f 75  counter().** rou
1d480 74 69 6e 65 20 77 68 69 63 68 20 6f 6e 6c 79 20  tine which only 
1d490 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
1d4a0 67 65 2d 63 6f 75 6e 74 65 72 20 69 66 20 74 68  ge-counter if th
1d4b0 65 20 75 70 64 61 74 65 20 69 73 20 61 63 74 75  e update is actu
1d4c0 61 6c 6c 79 0a 2a 2a 20 6e 65 65 64 65 64 2c 20  ally.** needed, 
1d4d0 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  as determined by
1d4e0 20 74 68 65 20 70 50 61 67 65 72 2d 3e 63 68 61   the pPager->cha
1d4f0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 73 74 61  ngeCountDone sta
1d500 74 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a  te variable..*/.
1d510 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
1d520 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f  r_write_changeco
1d530 75 6e 74 65 72 28 50 67 48 64 72 20 2a 70 50 67  unter(PgHdr *pPg
1d540 29 7b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f  ){.  u32 change_
1d550 63 6f 75 6e 74 65 72 3b 0a 0a 20 20 2f 2a 20 49  counter;..  /* I
1d560 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c  ncrement the val
1d570 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64  ue just read and
1d580 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74   write it back t
1d590 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20  o byte 24. */.  
1d5a0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d  change_counter =
1d5b0 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
1d5c0 28 28 75 38 2a 29 70 50 67 2d 3e 70 50 61 67 65  ((u8*)pPg->pPage
1d5d0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 2b 31  r->dbFileVers)+1
1d5e0 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 28 28  ;.  put32bits(((
1d5f0 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74 61  char*)pPg->pData
1d600 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75  )+24, change_cou
1d610 6e 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73  nter);..  /* Als
1d620 6f 20 73 74 6f 72 65 20 74 68 65 20 53 51 4c 69  o store the SQLi
1d630 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  te version numbe
1d640 72 20 69 6e 20 62 79 74 65 73 20 39 36 2e 2e 39  r in bytes 96..9
1d650 39 20 61 6e 64 20 69 6e 0a 20 20 2a 2a 20 62 79  9 and in.  ** by
1d660 74 65 73 20 39 32 2e 2e 39 35 20 73 74 6f 72 65  tes 92..95 store
1d670 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
1d680 74 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68  ter for which th
1d690 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  e version number
1d6a0 0a 20 20 2a 2a 20 69 73 20 76 61 6c 69 64 2e 20  .  ** is valid. 
1d6b0 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 28  */.  put32bits((
1d6c0 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74  (char*)pPg->pDat
1d6d0 61 29 2b 39 32 2c 20 63 68 61 6e 67 65 5f 63 6f  a)+92, change_co
1d6e0 75 6e 74 65 72 29 3b 0a 20 20 70 75 74 33 32 62  unter);.  put32b
1d6f0 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1d700 3e 70 44 61 74 61 29 2b 39 36 2c 20 53 51 4c 49  >pData)+96, SQLI
1d710 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  TE_VERSION_NUMBE
1d720 52 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  R);.}..#ifndef S
1d730 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
1d740 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1d750 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  on is invoked on
1d760 63 65 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  ce for each page
1d770 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
1d780 79 20 62 65 65 6e 20 0a 2a 2a 20 77 72 69 74 74  y been .** writt
1d790 65 6e 20 69 6e 74 6f 20 74 68 65 20 6c 6f 67 20  en into the log 
1d7a0 66 69 6c 65 20 77 68 65 6e 20 61 20 57 41 4c 20  file when a WAL 
1d7b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
1d7c0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 50  olled back..** P
1d7d0 61 72 61 6d 65 74 65 72 20 69 50 67 20 69 73 20  arameter iPg is 
1d7e0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1d7f0 6f 66 20 73 61 69 64 20 70 61 67 65 2e 20 54 68  of said page. Th
1d800 65 20 70 43 74 78 20 61 72 67 75 6d 65 6e 74 20  e pCtx argument 
1d810 0a 2a 2a 20 69 73 20 61 63 74 75 61 6c 6c 79 20  .** is actually 
1d820 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1d830 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
1d840 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20  ..**.** If page 
1d850 69 50 67 20 69 73 20 70 72 65 73 65 6e 74 20 69  iPg is present i
1d860 6e 20 74 68 65 20 63 61 63 68 65 2c 20 61 6e 64  n the cache, and
1d870 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
1d880 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2c 0a  ing references,.
1d890 2a 2a 20 69 74 20 69 73 20 64 69 73 63 61 72 64  ** it is discard
1d8a0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
1d8b0 66 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20  f there are one 
1d8c0 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e 64  or more outstand
1d8d0 69 6e 67 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  ing.** reference
1d8e0 73 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  s, the page cont
1d8f0 65 6e 74 20 69 73 20 72 65 6c 6f 61 64 65 64 20  ent is reloaded 
1d900 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1d910 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 61 74 74  e. If the.** att
1d920 65 6d 70 74 20 74 6f 20 72 65 6c 6f 61 64 20 63  empt to reload c
1d930 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ontent from the 
1d940 64 61 74 61 62 61 73 65 20 69 73 20 72 65 71 75  database is requ
1d950 69 72 65 64 20 61 6e 64 20 66 61 69 6c 73 2c 20  ired and fails, 
1d960 0a 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51  .** return an SQ
1d970 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
1d980 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
1d990 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
1d9a0 20 69 6e 74 20 70 61 67 65 72 55 6e 64 6f 43 61   int pagerUndoCa
1d9b0 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 43 74  llback(void *pCt
1d9c0 78 2c 20 50 67 6e 6f 20 69 50 67 29 7b 0a 20 20  x, Pgno iPg){.  
1d9d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1d9e0 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
1d9f0 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70  ger = (Pager *)p
1da00 43 74 78 3b 0a 20 20 50 67 48 64 72 20 2a 70 50  Ctx;.  PgHdr *pP
1da10 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61  g;..  assert( pa
1da20 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
1da30 29 20 29 3b 0a 20 20 70 50 67 20 3d 20 73 71 6c  ) );.  pPg = sql
1da40 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
1da50 70 50 61 67 65 72 2c 20 69 50 67 29 3b 0a 20 20  pPager, iPg);.  
1da60 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 69  if( pPg ){.    i
1da70 66 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  f( sqlite3Pcache
1da80 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50 67  PageRefcount(pPg
1da90 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  )==1 ){.      sq
1daa0 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
1dab0 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pPg);.    }else{
1dac0 0a 20 20 20 20 20 20 75 33 32 20 69 46 72 61 6d  .      u32 iFram
1dad0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  e = 0;.      rc 
1dae0 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64  = sqlite3WalFind
1daf0 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57  Frame(pPager->pW
1db00 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 26  al, pPg->pgno, &
1db10 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  iFrame);.      i
1db20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1db30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1db40 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2c   readDbPage(pPg,
1db50 20 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20   iFrame);.      
1db60 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
1db70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1db80 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
1db90 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
1dba0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1dbb0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
1dbc0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1dbd0 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20  /* Normally, if 
1dbe0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1dbf0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e   rolled back, an
1dc00 79 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73  y backup process
1dc10 65 73 20 61 72 65 0a 20 20 2a 2a 20 75 70 64 61  es are.  ** upda
1dc20 74 65 64 20 61 73 20 64 61 74 61 20 69 73 20 63  ted as data is c
1dc30 6f 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65  opied out of the
1dc40 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1dc50 6c 20 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20  l and into the. 
1dc60 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68   ** database. Th
1dc70 69 73 20 69 73 20 6e 6f 74 20 67 65 6e 65 72 61  is is not genera
1dc80 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74  lly possible wit
1dc90 68 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  h a WAL database
1dca0 2c 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61  , as.  ** rollba
1dcb0 63 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70  ck involves simp
1dcc0 6c 79 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68  ly truncating th
1dcd0 65 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65 72  e log file. Ther
1dce0 65 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20  efore, if one.  
1dcf0 2a 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65  ** or more frame
1dd00 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
1dd10 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
1dd20 68 65 20 6c 6f 67 20 28 61 6e 64 20 74 68 65 72  he log (and ther
1dd30 65 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f  efore .  ** also
1dd40 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
1dd50 20 62 61 63 6b 75 70 20 64 61 74 61 62 61 73 65   backup database
1dd60 73 29 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  s) as part of th
1dd70 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a  is transaction,.
1dd80 20 20 2a 2a 20 74 68 65 20 62 61 63 6b 75 70 73    ** the backups
1dd90 20 6d 75 73 74 20 62 65 20 72 65 73 74 61 72 74   must be restart
1dda0 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ed..  */.  sqlit
1ddb0 65 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28  e3BackupRestart(
1ddc0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29  pPager->pBackup)
1ddd0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
1dde0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1ddf0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1de00 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74   to rollback a t
1de10 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20  ransaction on a 
1de20 57 41 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  WAL database..*/
1de30 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1de40 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67  rRollbackWal(Pag
1de50 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1de60 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1de70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1de80 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
1de90 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 3b  .  PgHdr *pList;
1dea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1deb0 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69     /* List of di
1dec0 72 74 79 20 70 61 67 65 73 20 74 6f 20 72 65 76  rty pages to rev
1ded0 65 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72  ert */..  /* For
1dee0 20 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68   all pages in th
1def0 65 20 63 61 63 68 65 20 74 68 61 74 20 61 72 65  e cache that are
1df00 20 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79   currently dirty
1df10 20 6f 72 20 68 61 76 65 20 61 6c 72 65 61 64 79   or have already
1df20 0a 20 20 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  .  ** been writt
1df30 65 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d  en (but not comm
1df40 69 74 74 65 64 29 20 74 6f 20 74 68 65 20 6c 6f  itted) to the lo
1df50 67 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f  g file, do one o
1df60 66 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c  f the .  ** foll
1df70 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  owing:.  **.  **
1df80 20 20 20 2b 20 44 69 73 63 61 72 64 20 74 68 65     + Discard the
1df90 20 63 61 63 68 65 64 20 70 61 67 65 20 28 69 66   cached page (if
1dfa0 20 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f   refcount==0), o
1dfb0 72 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61  r.  **   + Reloa
1dfc0 64 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 66  d page content f
1dfd0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
1dfe0 20 28 69 66 20 72 65 66 63 6f 75 6e 74 3e 30 29   (if refcount>0)
1dff0 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
1e000 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
1e010 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20  ->dbOrigSize;.  
1e020 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 55  rc = sqlite3WalU
1e030 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ndo(pPager->pWal
1e040 2c 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62  , pagerUndoCallb
1e050 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50 61  ack, (void *)pPa
1e060 67 65 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20  ger);.  pList = 
1e070 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
1e080 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
1e090 50 43 61 63 68 65 29 3b 0a 20 20 77 68 69 6c 65  PCache);.  while
1e0a0 28 20 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53  ( pList && rc==S
1e0b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e0c0 50 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70  PgHdr *pNext = p
1e0d0 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20  List->pDirty;.  
1e0e0 20 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f    rc = pagerUndo
1e0f0 43 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a  Callback((void *
1e100 29 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e  )pPager, pList->
1e110 70 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74  pgno);.    pList
1e120 20 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20   = pNext;.  }.. 
1e130 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1e140 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1e150 6f 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20  on is a wrapper 
1e160 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61  around sqlite3Wa
1e170 6c 46 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65  lFrames(). As we
1e180 6c 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a  ll as logging.**
1e190 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1e1a0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67   the list of pag
1e1b0 65 73 20 68 65 61 64 65 64 20 62 79 20 70 4c 69  es headed by pLi
1e1c0 73 74 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79  st (connected by
1e1d0 20 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69   pDirty),.** thi
1e1e0 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66  s function notif
1e1f0 69 65 73 20 61 6e 79 20 61 63 74 69 76 65 20 62  ies any active b
1e200 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20  ackup processes 
1e210 74 68 61 74 20 74 68 65 20 70 61 67 65 73 20 68  that the pages h
1e220 61 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20  ave.** changed. 
1e230 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 69 73 74 20  .**.** The list 
1e240 6f 66 20 70 61 67 65 73 20 70 61 73 73 65 64 20  of pages passed 
1e250 69 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  into this routin
1e260 65 20 69 73 20 61 6c 77 61 79 73 20 73 6f 72 74  e is always sort
1e270 65 64 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65  ed by page numbe
1e280 72 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 69 66 20  r..** Hence, if 
1e290 70 61 67 65 20 31 20 61 70 70 65 61 72 73 20 61  page 1 appears a
1e2a0 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 6c  nywhere on the l
1e2b0 69 73 74 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ist, it will be 
1e2c0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 2e 0a  the first page..
1e2d0 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 70  */ .static int p
1e2e0 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a 20  agerWalFrames(. 
1e2f0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
1e300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e310 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
1e320 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69   */.  PgHdr *pLi
1e330 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
1e340 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
1e350 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a   frames to log *
1e360 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61  /.  Pgno nTrunca
1e370 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
1e380 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1e390 73 69 7a 65 20 61 66 74 65 72 20 74 68 69 73 20  size after this 
1e3a0 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20  commit */.  int 
1e3b0 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20  isCommit        
1e3c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e3d0 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
1e3e0 20 63 6f 6d 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20   commit */.){.  
1e3f0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
1e400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e410 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1e420 2f 0a 20 20 69 6e 74 20 6e 4c 69 73 74 3b 20 20  /.  int nList;  
1e430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e440 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1e450 20 70 61 67 65 73 20 69 6e 20 70 4c 69 73 74 20   pages in pList 
1e460 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
1e470 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
1e480 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43  defined(SQLITE_C
1e490 48 45 43 4b 5f 50 41 47 45 53 29 0a 20 20 50 67  HECK_PAGES).  Pg
1e4a0 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Hdr *p;         
1e4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e4c0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
1e4d0 72 20 70 61 67 65 73 20 2a 2f 0a 23 65 6e 64 69  r pages */.#endi
1e4e0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f..  assert( pPa
1e4f0 67 65 72 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 61  ger->pWal );.  a
1e500 73 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b 0a  ssert( pList );.
1e510 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1e520 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  BUG.  /* Verify 
1e530 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6c 69  that the page li
1e540 73 74 20 69 73 20 69 6e 20 61 63 63 65 6e 64 69  st is in accendi
1e550 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 66 6f  ng order */.  fo
1e560 72 28 70 3d 70 4c 69 73 74 3b 20 70 20 26 26 20  r(p=pList; p && 
1e570 70 2d 3e 70 44 69 72 74 79 3b 20 70 3d 70 2d 3e  p->pDirty; p=p->
1e580 70 44 69 72 74 79 29 7b 0a 20 20 20 20 61 73 73  pDirty){.    ass
1e590 65 72 74 28 20 70 2d 3e 70 67 6e 6f 20 3c 20 70  ert( p->pgno < p
1e5a0 2d 3e 70 44 69 72 74 79 2d 3e 70 67 6e 6f 20 29  ->pDirty->pgno )
1e5b0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1e5c0 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 70  assert( pList->p
1e5d0 44 69 72 74 79 3d 3d 30 20 7c 7c 20 69 73 43 6f  Dirty==0 || isCo
1e5e0 6d 6d 69 74 20 29 3b 0a 20 20 69 66 28 20 69 73  mmit );.  if( is
1e5f0 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a  Commit ){.    /*
1e600 20 49 66 20 61 20 57 41 4c 20 74 72 61 6e 73 61   If a WAL transa
1e610 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63  ction is being c
1e620 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 72 65 20  ommitted, there 
1e630 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 77  is no point in w
1e640 72 69 74 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e  riting.    ** an
1e650 79 20 70 61 67 65 73 20 77 69 74 68 20 70 61 67  y pages with pag
1e660 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65  e numbers greate
1e670 72 20 74 68 61 6e 20 6e 54 72 75 6e 63 61 74 65  r than nTruncate
1e680 20 69 6e 74 6f 20 74 68 65 20 57 41 4c 20 66 69   into the WAL fi
1e690 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 79 20  le..    ** They 
1e6a0 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 72 65  will never be re
1e6b0 61 64 20 62 79 20 61 6e 79 20 63 6c 69 65 6e 74  ad by any client
1e6c0 2e 20 53 6f 20 72 65 6d 6f 76 65 20 74 68 65 6d  . So remove them
1e6d0 20 66 72 6f 6d 20 74 68 65 20 70 44 69 72 74 79   from the pDirty
1e6e0 0a 20 20 20 20 2a 2a 20 6c 69 73 74 20 68 65 72  .    ** list her
1e6f0 65 2e 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20  e. */.    PgHdr 
1e700 2a 70 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 2a  *p;.    PgHdr **
1e710 70 70 4e 65 78 74 20 3d 20 26 70 4c 69 73 74 3b  ppNext = &pList;
1e720 0a 20 20 20 20 6e 4c 69 73 74 20 3d 20 30 3b 0a  .    nList = 0;.
1e730 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b      for(p=pList;
1e740 20 28 2a 70 70 4e 65 78 74 20 3d 20 70 29 21 3d   (*ppNext = p)!=
1e750 30 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  0; p=p->pDirty){
1e760 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67  .      if( p->pg
1e770 6e 6f 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29 7b  no<=nTruncate ){
1e780 0a 20 20 20 20 20 20 20 20 70 70 4e 65 78 74 20  .        ppNext 
1e790 3d 20 26 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20  = &p->pDirty;.  
1e7a0 20 20 20 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20        nList++;. 
1e7b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1e7c0 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 20 29   assert( pList )
1e7d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
1e7e0 4c 69 73 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  List = 1;.  }.  
1e7f0 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41  pPager->aStat[PA
1e800 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 20  GER_STAT_WRITE] 
1e810 2b 3d 20 6e 4c 69 73 74 3b 0a 0a 20 20 69 66 28  += nList;..  if(
1e820 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20   pList->pgno==1 
1e830 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68  ) pager_write_ch
1e840 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73  angecounter(pLis
1e850 74 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  t);.  rc = sqlit
1e860 65 33 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67  e3WalFrames(pPag
1e870 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20  er->pWal, .     
1e880 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1e890 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63  e, pList, nTrunc
1e8a0 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 70  ate, isCommit, p
1e8b0 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
1e8c0 61 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  ags.  );.  if( r
1e8d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1e8e0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
1e8f0 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b  ){.    PgHdr *p;
1e900 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74  .    for(p=pList
1e910 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79  ; p; p=p->pDirty
1e920 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1e930 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
1e940 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 2d  ger->pBackup, p-
1e950 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d 3e  >pgno, (u8 *)p->
1e960 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  pData);.    }.  
1e970 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1e980 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 70  _CHECK_PAGES.  p
1e990 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63  List = sqlite3Pc
1e9a0 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
1e9b0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
1e9c0 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70    for(p=pList; p
1e9d0 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1e9e0 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61      pager_set_pa
1e9f0 67 65 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a 23  gehash(p);.  }.#
1ea00 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
1ea10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  rc;.}../*.** Beg
1ea20 69 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73 61  in a read transa
1ea30 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41 4c  ction on the WAL
1ea40 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1ea50 74 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65 20  tine used to be 
1ea60 63 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70 65  called "pagerOpe
1ea70 6e 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65 63  nSnapshot()" bec
1ea80 61 75 73 65 20 69 74 20 65 73 73 65 6e 74 69 61  ause it essentia
1ea90 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20 73  lly.** makes a s
1eaa0 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20 64  napshot of the d
1eab0 61 74 61 62 61 73 65 20 61 74 20 74 68 65 20 63  atabase at the c
1eac0 75 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e 20  urrent point in 
1ead0 74 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72 76  time and preserv
1eae0 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70 73  es.** that snaps
1eaf0 68 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20 74  hot for use by t
1eb00 68 65 20 72 65 61 64 65 72 20 69 6e 20 73 70 69  he reader in spi
1eb10 74 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e 74  te of concurrent
1eb20 6c 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a 2a  ly changes by.**
1eb30 20 6f 74 68 65 72 20 77 72 69 74 65 72 73 20 6f   other writers o
1eb40 72 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73 2e  r checkpointers.
1eb50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1eb60 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61  agerBeginReadTra
1eb70 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a  nsaction(Pager *
1eb80 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1eb90 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1eba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1ebb0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1ebc0 6e 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b 20  nt changed = 0; 
1ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ebe0 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65 20  * True if cache 
1ebf0 6d 75 73 74 20 62 65 20 72 65 73 65 74 20 2a 2f  must be reset */
1ec00 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  ..  assert( page
1ec10 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
1ec20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1ec30 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
1ec40 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65  ER_OPEN || pPage
1ec50 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
1ec60 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f 2a  _READER );..  /*
1ec70 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65   sqlite3WalEndRe
1ec80 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20  adTransaction() 
1ec90 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 66  was not called f
1eca0 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a  or the previous.
1ecb0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1ecc0 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
1ecd0 3d 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f 20  =EXCLUSIVE.  So 
1ece0 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49 66  call it now.  If
1ecf0 20 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e 20   we.  ** are in 
1ed00 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52  locking_mode=NOR
1ed10 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64 28  MAL and EndRead(
1ed20 29 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  ) was previously
1ed30 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74 68   called,.  ** th
1ed40 65 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c 6c  e duplicate call
1ed50 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20   is harmless..  
1ed60 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 45  */.  sqlite3WalE
1ed70 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
1ed80 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
1ed90 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1eda0 57 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61 6e  WalBeginReadTran
1edb0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e  saction(pPager->
1edc0 70 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29 3b  pWal, &changed);
1edd0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1ede0 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64 20  E_OK || changed 
1edf0 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  ){.    pager_res
1ee00 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
1ee10 69 66 28 20 70 50 61 67 65 72 2d 3e 62 55 73 65  if( pPager->bUse
1ee20 46 65 74 63 68 20 29 20 73 71 6c 69 74 65 33 4f  Fetch ) sqlite3O
1ee30 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
1ee40 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  >fd, 0, 0);.  }.
1ee50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ee60 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1ee70 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1ee80 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66  alled as part of
1ee90 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20   the transition 
1eea0 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a  from PAGER_OPEN.
1eeb0 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44  ** to PAGER_READ
1eec0 45 52 20 73 74 61 74 65 20 74 6f 20 64 65 74 65  ER state to dete
1eed0 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 6f  rmine the size o
1eee0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1eef0 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20  ile.** in pages 
1ef00 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20 70 61  (assuming the pa
1ef10 67 65 20 73 69 7a 65 20 63 75 72 72 65 6e 74 6c  ge size currentl
1ef20 79 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65  y stored in Page
1ef30 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a  r.pageSize)..**.
1ef40 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ** If no error o
1ef50 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b  ccurs, SQLITE_OK
1ef60 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1ef70 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1ef80 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20   database.** in 
1ef90 70 61 67 65 73 20 69 73 20 73 74 6f 72 65 64 20  pages is stored 
1efa0 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65  in *pnPage. Othe
1efb0 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20  rwise, an error 
1efc0 63 6f 64 65 20 28 70 65 72 68 61 70 73 0a 2a 2a  code (perhaps.**
1efd0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
1efe0 54 41 54 29 20 69 73 20 72 65 74 75 72 6e 65 64  TAT) is returned
1eff0 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20   and *pnPage is 
1f000 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e  left unmodified.
1f010 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1f020 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61  agerPagecount(Pa
1f030 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
1f040 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67  o *pnPage){.  Pg
1f050 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  no nPage;       
1f060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f070 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
1f080 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a   via *pnPage */.
1f090 0a 20 20 2f 2a 20 51 75 65 72 79 20 74 68 65 20  .  /* Query the 
1f0a0 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 66  WAL sub-system f
1f0b0 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
1f0c0 73 69 7a 65 2e 20 54 68 65 20 57 61 6c 44 62 73  size. The WalDbs
1f0d0 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74  ize().  ** funct
1f0e0 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f  ion returns zero
1f0f0 20 69 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e   if the WAL is n
1f100 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61  ot open (i.e. Pa
1f110 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72  ger.pWal==0), or
1f120 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 64 61 74  .  ** if the dat
1f130 61 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f  abase size is no
1f140 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65  t available. The
1f150 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69   database size i
1f160 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c  s not.  ** avail
1f170 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41  able from the WA
1f180 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 69 66 20  L sub-system if 
1f190 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20  the log file is 
1f1a0 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f  empty or.  ** co
1f1b0 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20  ntains no valid 
1f1c0 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61  committed transa
1f1d0 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61  ctions..  */.  a
1f1e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
1f1f0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
1f200 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  N );.  assert( p
1f210 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48  Pager->eLock>=SH
1f220 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 6e  ARED_LOCK );.  n
1f230 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 57 61  Page = sqlite3Wa
1f240 6c 44 62 73 69 7a 65 28 70 50 61 67 65 72 2d 3e  lDbsize(pPager->
1f250 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  pWal);..  /* If 
1f260 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1f270 65 20 77 61 73 20 6e 6f 74 20 61 76 61 69 6c 61  e was not availa
1f280 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41 4c  ble from the WAL
1f290 20 73 75 62 2d 73 79 73 74 65 6d 2c 0a 20 20 2a   sub-system,.  *
1f2a0 2a 20 64 65 74 65 72 6d 69 6e 65 20 69 74 20 62  * determine it b
1f2b0 61 73 65 64 20 6f 6e 20 74 68 65 20 73 69 7a 65  ased on the size
1f2c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1f2d0 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 73 69   file. If the si
1f2e0 7a 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 64  ze.  ** of the d
1f2f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
1f300 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d  not an integer m
1f310 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70  ultiple of the p
1f320 61 67 65 2d 73 69 7a 65 2c 0a 20 20 2a 2a 20 72  age-size,.  ** r
1f330 6f 75 6e 64 20 64 6f 77 6e 20 74 6f 20 74 68 65  ound down to the
1f340 20 6e 65 61 72 65 73 74 20 70 61 67 65 2e 20 45   nearest page. E
1f350 78 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20  xcept, any file 
1f360 6c 61 72 67 65 72 20 74 68 61 6e 20 30 0a 20 20  larger than 0.  
1f370 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
1f380 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74   is considered t
1f390 6f 20 63 6f 6e 74 61 69 6e 20 61 74 20 6c 65 61  o contain at lea
1f3a0 73 74 20 6f 6e 65 20 70 61 67 65 2e 0a 20 20 2a  st one page..  *
1f3b0 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30  /.  if( nPage==0
1f3c0 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d 20   ){.    i64 n = 
1f3d0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1f3e0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1f3f0 20 64 62 20 66 69 6c 65 20 69 6e 20 62 79 74 65   db file in byte
1f400 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  s */.    assert(
1f410 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1f420 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  fd) || pPager->t
1f430 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
1f440 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
1f450 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69  ->fd) ){.      i
1f460 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  nt rc = sqlite3O
1f470 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
1f480 2d 3e 66 64 2c 20 26 6e 29 3b 0a 20 20 20 20 20  ->fd, &n);.     
1f490 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f4a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
1f4b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1f4c0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 67 65  .    }.    nPage
1f4d0 20 3d 20 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61   = (Pgno)((n+pPa
1f4e0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29  ger->pageSize-1)
1f4f0 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   / pPager->pageS
1f500 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ize);.  }..  /* 
1f510 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e  If the current n
1f520 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1f530 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 67 72  n the file is gr
1f540 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 0a 20  eater than the. 
1f550 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d   ** configured m
1f560 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d  aximum pager num
1f570 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68  ber, increase th
1f580 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20  e allowed limit 
1f590 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  so.  ** that the
1f5a0 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61   file can be rea
1f5b0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50  d..  */.  if( nP
1f5c0 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  age>pPager->mxPg
1f5d0 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
1f5e0 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f  ->mxPgno = (Pgno
1f5f0 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a  )nPage;.  }..  *
1f600 70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  pnPage = nPage;.
1f610 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f620 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
1f630 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
1f640 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68  *.** Check if th
1f650 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61  e *-wal file tha
1f660 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
1f670 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70   the database op
1f680 65 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a  ened by pPager.*
1f690 2a 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20  * exists if the 
1f6a0 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
1f6b0 65 6d 70 79 2c 20 6f 72 20 76 65 72 69 66 79 20  empy, or verify 
1f6c0 74 68 61 74 20 74 68 65 20 2a 2d 77 61 6c 20 66  that the *-wal f
1f6d0 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  ile does.** not 
1f6e0 65 78 69 73 74 20 28 62 79 20 64 65 6c 65 74 69  exist (by deleti
1f6f0 6e 67 20 69 74 29 20 69 66 20 74 68 65 20 64 61  ng it) if the da
1f700 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 65  tabase file is e
1f710 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  mpty..**.** If t
1f720 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
1f730 6f 74 20 65 6d 70 74 79 20 61 6e 64 20 74 68 65  ot empty and the
1f740 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78 69 73   *-wal file exis
1f750 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 70 61 67  ts, open the pag
1f760 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64  er.** in WAL mod
1f770 65 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  e.  If the datab
1f780 61 73 65 20 69 73 20 65 6d 70 74 79 20 6f 72 20  ase is empty or 
1f790 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65  if no *-wal file
1f7a0 20 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69   exists and.** i
1f7b0 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
1f7c0 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 50 61 67  s, make sure Pag
1f7d0 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69  er.journalMode i
1f7e0 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20  s not set to.** 
1f7f0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
1f800 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  E_WAL..**.** Ret
1f810 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  urn SQLITE_OK or
1f820 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   an error code..
1f830 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
1f840 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53 48 41   must hold a SHA
1f850 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  RED lock on the 
1f860 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
1f870 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75   call this.** fu
1f880 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73 65 20  nction. Because 
1f890 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
1f8a0 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65  k on the db file
1f8b0 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
1f8c0 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c  delete .** a WAL
1f8d0 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79   on a none-empty
1f8e0 20 64 61 74 61 62 61 73 65 2c 20 74 68 69 73 20   database, this 
1f8f0 65 6e 73 75 72 65 73 20 74 68 65 72 65 20 69 73  ensures there is
1f900 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69 74 69   no race conditi
1f910 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74  on .** between t
1f920 68 65 20 78 41 63 63 65 73 73 28 29 20 62 65 6c  he xAccess() bel
1f930 6f 77 20 61 6e 64 20 61 6e 20 78 44 65 6c 65 74  ow and an xDelet
1f940 65 28 29 20 62 65 69 6e 67 20 65 78 65 63 75 74  e() being execut
1f950 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f  ed by some .** o
1f960 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  ther connection.
1f970 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1f980 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
1f990 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  sent(Pager *pPag
1f9a0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
1f9b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
1f9c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1f9d0 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
1f9e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1f9f0 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52  ger->eLock>=SHAR
1fa00 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66  ED_LOCK );..  if
1fa10 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
1fa20 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ile ){.    int i
1fa30 73 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  sWal;           
1fa40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1fa50 20 69 66 20 57 41 4c 20 66 69 6c 65 20 65 78 69   if WAL file exi
1fa60 73 74 73 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  sts */.    Pgno 
1fa70 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
1fa80 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1fa90 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1faa0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 72 63   file */..    rc
1fab0 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e   = pagerPagecoun
1fac0 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  t(pPager, &nPage
1fad0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1fae0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
1faf0 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20  f( nPage==0 ){. 
1fb00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1fb10 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
1fb20 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
1fb30 7a 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  zWal, 0);.      
1fb40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
1fb50 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e  OERR_DELETE_NOEN
1fb60 54 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  T ) rc = SQLITE_
1fb70 4f 4b 3b 0a 20 20 20 20 20 20 69 73 57 61 6c 20  OK;.      isWal 
1fb80 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1fb90 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1fba0 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20 20 20  e3OsAccess(.    
1fbb0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 56        pPager->pV
1fbc0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  fs, pPager->zWal
1fbd0 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
1fbe0 45 58 49 53 54 53 2c 20 26 69 73 57 61 6c 0a 20  EXISTS, &isWal. 
1fbf0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
1fc00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1fc10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
1fc20 20 69 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20   isWal ){.      
1fc30 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
1fc40 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75  te3PcachePagecou
1fc50 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
1fc60 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  he)==0 );.      
1fc70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1fc80 67 65 72 4f 70 65 6e 57 61 6c 28 70 50 61 67 65  gerOpenWal(pPage
1fc90 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  r, 0);.      }el
1fca0 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
1fcb0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
1fcc0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
1fcd0 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  L ){.        pPa
1fce0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
1fcf0 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
1fd00 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20  MODE_DELETE;.   
1fd10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1fd20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
1fd30 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  ndif../*.** Play
1fd40 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70  back savepoint p
1fd50 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69  Savepoint. Or, i
1fd60 66 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  f pSavepoint==NU
1fd70 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  LL, then playbac
1fd80 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20  k.** the entire 
1fd90 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1fda0 69 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70 53  ile. The case pS
1fdb0 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f  avepoint==NULL o
1fdc0 63 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61  ccurs when .** a
1fdd0 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d   ROLLBACK TO com
1fde0 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20  mand is invoked 
1fdf0 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74  on a SAVEPOINT t
1fe00 68 61 74 20 69 73 20 61 20 74 72 61 6e 73 61 63  hat is a transac
1fe10 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69  tion .** savepoi
1fe20 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  nt..**.** When p
1fe30 53 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74  Savepoint is not
1fe40 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61   NULL (meaning a
1fe50 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e   non-transaction
1fe60 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a   savepoint is .*
1fe70 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  * being rolled b
1fe80 61 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72  ack), then the r
1fe90 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73  ollback consists
1fea0 20 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65 20   of up to three 
1feb0 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f  stages,.** perfo
1fec0 72 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65  rmed in the orde
1fed0 72 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a  r specified:.**.
1fee0 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65  **   * Pages are
1fef0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f   played back fro
1ff00 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
1ff10 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20 62  al starting at b
1ff20 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65  yte.**     offse
1ff30 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
1ff40 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e  .iOffset and con
1ff50 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20  tinuing to .**  
1ff60 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
1ff70 74 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72  t.iHdrOffset, or
1ff80 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
1ff90 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a  he main journal.
1ffa0 2a 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20 50  **     file if P
1ffb0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
1ffc0 64 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f  drOffset is zero
1ffd0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50  ..**.**   * If P
1ffe0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
1fff0 64 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20  drOffset is not 
20000 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73  zero, then pages
20010 20 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20   are played.**  
20020 20 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67     back starting
20030 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
20040 6c 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61  l header immedia
20050 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a  tely following .
20060 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
20070 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
20080 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
20090 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
200a0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  file..**.**   * 
200b0 50 61 67 65 73 20 61 72 65 20 74 68 65 6e 20 70  Pages are then p
200c0 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
200d0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
200e0 66 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a  file, starting.*
200f0 2a 20 20 20 20 20 77 69 74 68 20 74 68 65 20 50  *     with the P
20100 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53  agerSavepoint.iS
20110 75 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e  ubRec and contin
20120 75 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20  uing to the end 
20130 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f  of.**     the jo
20140 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
20150 2a 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65  * Throughout the
20160 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73   rollback proces
20170 73 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20 70  s, each time a p
20180 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  age is rolled ba
20190 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65  ck, the.** corre
201a0 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
201b0 73 65 74 20 69 6e 20 61 20 62 69 74 76 65 63 20  set in a bitvec 
201c0 73 74 72 75 63 74 75 72 65 20 28 76 61 72 69 61  structure (varia
201d0 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65  ble pDone in the
201e0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
201f0 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20  on below). This 
20200 69 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72  is used to ensur
20210 65 20 74 68 61 74 20 61 20 70 61 67 65 20 69 73  e that a page is
20220 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20   only.** rolled 
20230 62 61 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  back the first t
20240 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e  ime it is encoun
20250 74 65 72 65 64 20 69 6e 20 65 69 74 68 65 72 20  tered in either 
20260 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
20270 66 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  f pSavepoint is 
20280 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73  NULL, then pages
20290 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64   are only played
202a0 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d   back from the m
202b0 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ain.** journal f
202c0 69 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  ile. There is no
202d0 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74 76   need for a bitv
202e0 65 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ec in this case.
202f0 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72  .**.** In either
20300 20 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c   case, before pl
20310 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73  ayback commences
20320 20 74 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a   the Pager.dbSiz
20330 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73  e variable.** is
20340 20 72 65 73 65 74 20 74 6f 20 74 68 65 20 76 61   reset to the va
20350 6c 75 65 20 74 68 61 74 20 69 74 20 68 65 6c 64  lue that it held
20360 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
20370 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a   the savepoint .
20380 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69  ** (or transacti
20390 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74  on). No page wit
203a0 68 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  h a page-number 
203b0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69  greater than thi
203c0 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c  s value.** is pl
203d0 61 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e  ayed back. If on
203e0 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  e is encountered
203f0 20 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b   it is simply sk
20400 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ipped..*/.static
20410 20 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61   int pagerPlayba
20420 63 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65  ckSavepoint(Page
20430 72 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72  r *pPager, Pager
20440 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65  Savepoint *pSave
20450 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a  point){.  i64 sz
20460 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
20470 20 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20     /* Effective 
20480 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e  size of the main
20490 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
204a0 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
204b0 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
204c0 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f   first segment o
204d0 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72  f main-journal r
204e0 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20  ecords */.  int 
204f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
20500 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
20510 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ode */.  Bitvec 
20520 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20  *pDone = 0;     
20530 20 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65    /* Bitvec to e
20540 6e 73 75 72 65 20 70 61 67 65 73 20 70 6c 61 79  nsure pages play
20550 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63  ed back only onc
20560 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
20570 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
20580 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
20590 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
205a0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
205b0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
205c0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
205d0 20 62 69 74 76 65 63 20 74 6f 20 75 73 65 20 74   bitvec to use t
205e0 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20  o store the set 
205f0 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20  of pages rolled 
20600 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53  back */.  if( pS
20610 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
20620 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42  pDone = sqlite3B
20630 69 74 76 65 63 43 72 65 61 74 65 28 70 53 61 76  itvecCreate(pSav
20640 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a  epoint->nOrig);.
20650 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29      if( !pDone )
20660 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
20670 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
20680 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74   }.  }..  /* Set
20690 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
206a0 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76  ze back to the v
206b0 61 6c 75 65 20 69 74 20 77 61 73 20 62 65 66 6f  alue it was befo
206c0 72 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  re the savepoint
206d0 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76   .  ** being rev
206e0 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64  erted was opened
206f0 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
20700 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70  >dbSize = pSavep
20710 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  oint ? pSavepoin
20720 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65  t->nOrig : pPage
20730 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20  r->dbOrigSize;. 
20740 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
20750 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
20760 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20  r->tempFile;..  
20770 69 66 28 20 21 70 53 61 76 65 70 6f 69 6e 74 20  if( !pSavepoint 
20780 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  && pagerUseWal(p
20790 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
207a0 74 75 72 6e 20 70 61 67 65 72 52 6f 6c 6c 62 61  turn pagerRollba
207b0 63 6b 57 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  ckWal(pPager);. 
207c0 20 7d 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61   }..  /* Use pPa
207d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
207e0 61 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65  as the effective
207f0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69   size of the mai
20800 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
20810 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63  journal.  The ac
20820 74 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20  tual file might 
20830 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  be larger than t
20840 68 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45  his in.  ** PAGE
20850 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
20860 55 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f  UNCATE or PAGER_
20870 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
20880 49 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69  IST.  But anythi
20890 6e 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61  ng.  ** past pPa
208a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
208b0 69 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f  is off-limits to
208c0 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20   us..  */.  szJ 
208d0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
208e0 6c 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20  lOff;.  assert( 
208f0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
20900 65 72 29 3d 3d 30 20 7c 7c 20 73 7a 4a 3d 3d 30  er)==0 || szJ==0
20910 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20   );..  /* Begin 
20920 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  by rolling back 
20930 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
20940 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
20950 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50  arting at.  ** P
20960 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
20970 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
20980 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74  uing to the next
20990 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
209a0 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68  .  ** There migh
209b0 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20  t be records in 
209c0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
209d0 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61 67   that have a pag
209e0 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72  e number.  ** gr
209f0 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
20a00 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
20a10 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62  size (pPager->db
20a20 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a  Size) but those.
20a30 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69    ** will be ski
20a40 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  pped automatical
20a50 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20 61  ly.  Pages are a
20a60 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73  dded to pDone as
20a70 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70   they.  ** are p
20a80 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
20a90 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
20aa0 74 20 26 26 20 21 70 61 67 65 72 55 73 65 57 61  t && !pagerUseWa
20ab0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
20ac0 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65   iHdrOff = pSave
20ad0 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65  point->iHdrOffse
20ae0 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t ? pSavepoint->
20af0 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a  iHdrOffset : szJ
20b00 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
20b10 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65  urnalOff = pSave
20b20 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a  point->iOffset;.
20b30 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
20b40 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
20b50 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69  er->journalOff<i
20b60 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  HdrOff ){.      
20b70 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
20b80 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
20b90 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  ger, &pPager->jo
20ba0 75 72 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c  urnalOff, pDone,
20bb0 20 31 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 1);.    }.  
20bc0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
20bd0 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
20be0 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
20bf0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
20c00 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74  ;.  }..  /* Cont
20c10 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63  inue rolling bac
20c20 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66  k records out of
20c30 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
20c40 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
20c50 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  ** the first jou
20c60 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e  rnal header seen
20c70 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
20c80 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63 74  until the effect
20c90 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20  ive end.  ** of 
20ca0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
20cb0 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65   file.  Continue
20cc0 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d   to skip out-of-
20cd0 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a  range pages and.
20ce0 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64    ** continue ad
20cf0 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65  ding pages rolle
20d00 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e  d back to pDone.
20d10 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72  .  */.  while( r
20d20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
20d30 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20d40 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33  ff<szJ ){.    u3
20d50 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  2 ii;           
20d60 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
20d70 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 4a 52 65   */.    u32 nJRe
20d80 63 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75  c = 0;     /* Nu
20d90 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20  mber of Journal 
20da0 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75  Records */.    u
20db0 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63  32 dummy;.    rc
20dc0 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
20dd0 72 28 70 50 61 67 65 72 2c 20 30 2c 20 73 7a 4a  r(pPager, 0, szJ
20de0 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79  , &nJRec, &dummy
20df0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
20e00 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
20e10 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ;..    /*.    **
20e20 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e 6a 6f   The "pPager->jo
20e30 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
20e40 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
20e50 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
20e60 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65 73 74  Off".    ** test
20e70 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74   is related to t
20e80 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20 53 65  icket #2565.  Se
20e90 65 20 74 68 65 20 64 69 73 63 75 73 73 69 6f 6e  e the discussion
20ea0 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70   in the.    ** p
20eb0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
20ec0 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 64 64  function for add
20ed0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
20ee0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
20ef0 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20  if( nJRec==0 .  
20f00 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
20f10 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
20f20 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
20f30 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
20f40 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  Off.    ){.     
20f50 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28   nJRec = (u32)((
20f60 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
20f70 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41  urnalOff)/JOURNA
20f80 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
20f90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
20fa0 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ii=0; rc==SQLITE
20fb0 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20  _OK && ii<nJRec 
20fc0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
20fd0 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29  alOff<szJ; ii++)
20fe0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
20ff0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
21000 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
21010 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21020 2c 20 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a  , pDone, 1, 1);.
21030 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
21040 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
21050 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  E );.  }.  asser
21060 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
21070 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
21080 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20 29 3b 0a 0a  nalOff>=szJ );..
21090 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72    /* Finally,  r
210a0 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72  ollback pages fr
210b0 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
210c0 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74 20 77  al.  Page that w
210d0 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75  ere.  ** previou
210e0 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  sly rolled back 
210f0 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
21100 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65  journal (and are
21110 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29   hence in pDone)
21120 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b  .  ** will be sk
21130 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72  ipped.  Out-of-r
21140 61 6e 67 65 20 70 61 67 65 73 20 61 72 65 20 61  ange pages are a
21150 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a  lso skipped..  *
21160 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
21170 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69  nt ){.    u32 ii
21180 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
21190 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
211a0 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
211b0 20 28 69 36 34 29 70 53 61 76 65 70 6f 69 6e 74   (i64)pSavepoint
211c0 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->iSubRec*(4+pPa
211d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
211e0 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
211f0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
21200 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21210 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e  e3WalSavepointUn
21220 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
21230 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61   pSavepoint->aWa
21240 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  lData);.    }.  
21250 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f    for(ii=pSavepo
21260 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63  int->iSubRec; rc
21270 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
21280 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  i<pPager->nSubRe
21290 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
212a0 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d  assert( offset==
212b0 28 69 36 34 29 69 69 2a 28 34 2b 70 50 61 67 65  (i64)ii*(4+pPage
212c0 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a  r->pageSize) );.
212d0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
212e0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
212f0 67 65 28 70 50 61 67 65 72 2c 20 26 6f 66 66 73  ge(pPager, &offs
21300 65 74 2c 20 70 44 6f 6e 65 2c 20 30 2c 20 31 29  et, pDone, 0, 1)
21310 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
21320 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
21330 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  ONE );.  }..  sq
21340 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
21350 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28  oy(pDone);.  if(
21360 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21370 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
21380 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
21390 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
213a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
213b0 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
213c0 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
213d0 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  y pages that are
213e0 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69   allowed..*/.voi
213f0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
21400 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72  tCachesize(Pager
21410 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
21420 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Page){.  sqlite3
21430 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73 69  PcacheSetCachesi
21440 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
21450 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a  he, mxPage);.}..
21460 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 53 51 4c  /*.** Invoke SQL
21470 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 4c  ITE_FCNTL_MMAP_L
21480 49 4d 49 54 20 62 61 73 65 64 20 6f 6e 20 74 68  IMIT based on th
21490 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
214a0 6f 66 20 6d 78 4d 6d 61 70 2e 0a 2a 2f 0a 73 74  of mxMmap..*/.st
214b0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 46  atic void pagerF
214c0 69 78 4d 61 70 6c 69 6d 69 74 28 50 61 67 65 72  ixMaplimit(Pager
214d0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c   *pPager){.  sql
214e0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20  ite3_file *fd = 
214f0 70 50 61 67 65 72 2d 3e 66 64 3b 0a 20 20 69 66  pPager->fd;.  if
21500 28 20 69 73 4f 70 65 6e 28 66 64 29 20 29 7b 0a  ( isOpen(fd) ){.
21510 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
21520 34 20 6d 78 3b 0a 20 20 20 20 70 50 61 67 65 72  4 mx;.    pPager
21530 2d 3e 62 55 73 65 46 65 74 63 68 20 3d 20 28 66  ->bUseFetch = (f
21540 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 69 56 65  d->pMethods->iVe
21550 72 73 69 6f 6e 3e 3d 33 29 20 26 26 20 70 50 61  rsion>=3) && pPa
21560 67 65 72 2d 3e 6d 78 4d 6d 61 70 3e 30 3b 0a 20  ger->mxMmap>0;. 
21570 20 20 20 6d 78 20 3d 20 70 50 61 67 65 72 2d 3e     mx = pPager->
21580 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 73 71 6c 69  mxMmap;.    sqli
21590 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
215a0 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c  Hint(pPager->fd,
215b0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d   SQLITE_FCNTL_MM
215c0 41 50 5f 4c 49 4d 49 54 2c 20 26 6d 78 29 3b 0a  AP_LIMIT, &mx);.
215d0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
215e0 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
215f0 73 69 7a 65 20 6f 66 20 61 6e 79 20 6d 65 6d 6f  size of any memo
21600 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 64 65 20  ry mapping made 
21610 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
21620 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  file..*/.void sq
21630 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61  lite3PagerSetMma
21640 70 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50  pLimit(Pager *pP
21650 61 67 65 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e  ager, sqlite3_in
21660 74 36 34 20 6d 78 4d 6d 61 70 29 7b 0a 20 20 70  t64 mxMmap){.  p
21670 50 61 67 65 72 2d 3e 6d 78 4d 6d 61 70 20 3d 20  Pager->mxMmap = 
21680 6d 78 4d 6d 61 70 3b 0a 20 20 70 61 67 65 72 46  mxMmap;.  pagerF
21690 69 78 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65  ixMaplimit(pPage
216a0 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  r);.}../*.** Fre
216b0 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79  e as much memory
216c0 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f   as possible fro
216d0 6d 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a  m the pager..*/.
216e0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
216f0 72 53 68 72 69 6e 6b 28 50 61 67 65 72 20 2a 70  rShrink(Pager *p
21700 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
21710 33 50 63 61 63 68 65 53 68 72 69 6e 6b 28 70 50  3PcacheShrink(pP
21720 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
21730 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
21740 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f  the robustness o
21750 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
21760 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  o damage due to 
21770 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72  OS crashes.** or
21780 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20   power failures 
21790 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  by changing the 
217a0 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28  number of syncs(
217b0 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a  )s when writing.
217c0 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
217d0 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20  journal.  There 
217e0 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73  are three levels
217f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20  :.**.**    OFF  
21800 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79       sqlite3OsSy
21810 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
21820 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
21830 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
21840 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
21850 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
21860 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
21870 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
21880 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
21890 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
218a0 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
218b0 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
218c0 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
218d0 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
218e0 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
218f0 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
21900 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
21910 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
21920 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
21930 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
21940 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
21950 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
21960 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
21970 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
21980 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
21990 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
219a0 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
219b0 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
219c0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
219d0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
219e0 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
219f0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
21a00 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
21a10 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
21a20 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
21a30 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
21a40 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
21a50 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
21a60 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
21a70 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20  formation - the 
21a80 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20  nRec field.**   
21a90 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
21aa0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
21ab0 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e   - being written
21ac0 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
21ad0 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  two.**          
21ae0 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20      syncs).  If 
21af0 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  we assume that w
21b00 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  riting a.**     
21b10 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20           single 
21b20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61  disk sector is a
21b30 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73  tomic, then this
21b40 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a   mode provides.*
21b50 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
21b60 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68  ssurance that th
21b70 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e  e journal will n
21b80 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
21b90 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
21ba0 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20         point of 
21bb0 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74  causing damage t
21bc0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
21bd0 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a  uring rollback..
21be0 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f 76 65 20  **.** The above 
21bf0 69 73 20 66 6f 72 20 61 20 72 6f 6c 6c 62 61 63  is for a rollbac
21c00 6b 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20  k-journal mode. 
21c10 20 46 6f 72 20 57 41 4c 20 6d 6f 64 65 2c 20 4f   For WAL mode, O
21c20 46 46 20 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20  FF continues.** 
21c30 74 6f 20 6d 65 61 6e 20 74 68 61 74 20 6e 6f 20  to mean that no 
21c40 73 79 6e 63 73 20 65 76 65 72 20 6f 63 63 75 72  syncs ever occur
21c50 2e 20 20 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20  .  NORMAL means 
21c60 74 68 61 74 20 74 68 65 20 57 41 4c 20 69 73 20  that the WAL is 
21c70 73 79 6e 63 65 64 0a 2a 2a 20 70 72 69 6f 72 20  synced.** prior 
21c80 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
21c90 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 64 20 74  checkpoint and t
21ca0 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
21cb0 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 0a   file is synced.
21cc0 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ** at the conclu
21cd0 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 65 63  sion of the chec
21ce0 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 65 6e  kpoint if the en
21cf0 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  tire content of 
21d00 74 68 65 20 57 41 4c 0a 2a 2a 20 77 61 73 20 77  the WAL.** was w
21d10 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f  ritten back into
21d20 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
21d30 42 75 74 20 6e 6f 20 73 79 6e 63 20 6f 70 65 72  But no sync oper
21d40 61 74 69 6f 6e 73 20 6f 63 63 75 72 20 66 6f 72  ations occur for
21d50 0a 2a 2a 20 61 6e 20 6f 72 64 69 6e 61 72 79 20  .** an ordinary 
21d60 63 6f 6d 6d 69 74 20 69 6e 20 4e 4f 52 4d 41 4c  commit in NORMAL
21d70 20 6d 6f 64 65 20 77 69 74 68 20 57 41 4c 2e 20   mode with WAL. 
21d80 20 46 55 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74   FULL means that
21d90 20 74 68 65 20 57 41 4c 0a 2a 2a 20 66 69 6c 65   the WAL.** file
21da0 20 69 73 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f   is synced follo
21db0 77 69 6e 67 20 65 61 63 68 20 63 6f 6d 6d 69 74  wing each commit
21dc0 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 6e 20 61   operation, in a
21dd0 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 0a 2a  ddition to the.*
21de0 2a 20 73 79 6e 63 73 20 61 73 73 6f 63 69 61 74  * syncs associat
21df0 65 64 20 77 69 74 68 20 4e 4f 52 4d 41 4c 2e 0a  ed with NORMAL..
21e00 2a 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e  **.** Do not con
21e10 66 75 73 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73  fuse synchronous
21e20 3d 46 55 4c 4c 20 77 69 74 68 20 53 51 4c 49 54  =FULL with SQLIT
21e30 45 5f 53 59 4e 43 5f 46 55 4c 4c 2e 20 20 54 68  E_SYNC_FULL.  Th
21e40 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 59 4e 43  e.** SQLITE_SYNC
21e50 5f 46 55 4c 4c 20 6d 61 63 72 6f 20 6d 65 61 6e  _FULL macro mean
21e60 73 20 74 6f 20 75 73 65 20 74 68 65 20 4d 61 63  s to use the Mac
21e70 4f 53 58 2d 73 74 79 6c 65 20 66 75 6c 6c 2d 66  OSX-style full-f
21e80 73 79 6e 63 0a 2a 2a 20 75 73 69 6e 67 20 66 63  sync.** using fc
21e90 6e 74 6c 28 46 5f 46 55 4c 4c 46 53 59 4e 43 29  ntl(F_FULLFSYNC)
21ea0 2e 20 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  .  SQLITE_SYNC_N
21eb0 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 6f 20 64  ORMAL means to d
21ec0 6f 20 61 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79  o an.** ordinary
21ed0 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 2e 20 20   fsync() call.  
21ee0 54 68 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66  There is no diff
21ef0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 53  erence between S
21f00 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a  QLITE_SYNC_FULL.
21f10 2a 2a 20 61 6e 64 20 53 51 4c 49 54 45 5f 53 59  ** and SQLITE_SY
21f20 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61  NC_NORMAL on pla
21f30 74 66 6f 72 6d 73 20 6f 74 68 65 72 20 74 68 61  tforms other tha
21f40 6e 20 4d 61 63 4f 53 58 2e 20 20 42 75 74 20 74  n MacOSX.  But t
21f50 68 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75  he.** synchronou
21f60 73 3d 46 55 4c 4c 20 76 65 72 73 75 73 20 73 79  s=FULL versus sy
21f70 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c  nchronous=NORMAL
21f80 20 73 65 74 74 69 6e 67 20 64 65 74 65 72 6d 69   setting determi
21f90 6e 65 73 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  nes when.** the 
21fa0 78 53 79 6e 63 20 70 72 69 6d 69 74 69 76 65 20  xSync primitive 
21fb0 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 20 69 73  is called and is
21fc0 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 61 6c 6c   relevant to all
21fd0 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a   platforms..**.*
21fe0 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73  * Numeric values
21ff0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
22000 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72   these states ar
22010 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c  e OFF==1, NORMAL
22020 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d  =2,.** and FULL=
22030 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  3..*/.#ifndef SQ
22040 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
22050 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c  PRAGMAS.void sql
22060 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65  ite3PagerSetSafe
22070 74 79 4c 65 76 65 6c 28 0a 20 20 50 61 67 65 72  tyLevel(.  Pager
22080 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
22090 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f   /* The pager to
220a0 20 73 65 74 20 73 61 66 65 74 79 20 6c 65 76 65   set safety leve
220b0 6c 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6c  l for */.  int l
220c0 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20  evel,           
220d0 20 2f 2a 20 50 52 41 47 4d 41 20 73 79 6e 63 68   /* PRAGMA synch
220e0 72 6f 6e 6f 75 73 2e 20 20 31 3d 4f 46 46 2c 20  ronous.  1=OFF, 
220f0 32 3d 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c 4c  2=NORMAL, 3=FULL
22100 20 2a 2f 20 20 0a 20 20 69 6e 74 20 62 46 75 6c   */  .  int bFul
22110 6c 46 73 79 6e 63 2c 20 20 20 20 20 20 20 2f 2a  lFsync,       /*
22120 20 50 52 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e   PRAGMA fullfsyn
22130 63 20 2a 2f 0a 20 20 69 6e 74 20 62 43 6b 70 74  c */.  int bCkpt
22140 46 75 6c 6c 46 73 79 6e 63 20 20 20 20 2f 2a 20  FullFsync    /* 
22150 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69 6e  PRAGMA checkpoin
22160 74 5f 66 75 6c 6c 66 73 79 6e 63 20 2a 2f 0a 29  t_fullfsync */.)
22170 7b 0a 20 20 61 73 73 65 72 74 28 20 6c 65 76 65  {.  assert( leve
22180 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d 33  l>=1 && level<=3
22190 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f   );.  pPager->no
221a0 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d  Sync =  (level==
221b0 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  1 || pPager->tem
221c0 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70  pFile) ?1:0;.  p
221d0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
221e0 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21  = (level==3 && !
221f0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
22200 29 20 3f 31 3a 30 3b 0a 20 20 69 66 28 20 70 50  ) ?1:0;.  if( pP
22210 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
22220 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63      pPager->sync
22230 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 70  Flags = 0;.    p
22240 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46  Pager->ckptSyncF
22250 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  lags = 0;.  }els
22260 65 20 69 66 28 20 62 46 75 6c 6c 46 73 79 6e 63  e if( bFullFsync
22270 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
22280 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  syncFlags = SQLI
22290 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20  TE_SYNC_FULL;.  
222a0 20 20 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79    pPager->ckptSy
222b0 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
222c0 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d 65  _SYNC_FULL;.  }e
222d0 6c 73 65 20 69 66 28 20 62 43 6b 70 74 46 75 6c  lse if( bCkptFul
222e0 6c 46 73 79 6e 63 20 29 7b 0a 20 20 20 20 70 50  lFsync ){.    pP
222f0 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20  ager->syncFlags 
22300 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  = SQLITE_SYNC_NO
22310 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61 67 65 72  RMAL;.    pPager
22320 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61 67 73 20  ->ckptSyncFlags 
22330 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  = SQLITE_SYNC_FU
22340 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LL;.  }else{.   
22350 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
22360 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
22370 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70 50 61  _NORMAL;.    pPa
22380 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63 46 6c 61  ger->ckptSyncFla
22390 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
223a0 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 70  _NORMAL;.  }.  p
223b0 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
223c0 61 67 73 20 3d 20 70 50 61 67 65 72 2d 3e 73 79  ags = pPager->sy
223d0 6e 63 46 6c 61 67 73 3b 0a 20 20 69 66 28 20 70  ncFlags;.  if( p
223e0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
223f0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77  ){.    pPager->w
22400 61 6c 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20 57  alSyncFlags |= W
22410 41 4c 5f 53 59 4e 43 5f 54 52 41 4e 53 41 43 54  AL_SYNC_TRANSACT
22420 49 4f 4e 53 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  IONS;.  }.}.#end
22430 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
22440 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
22450 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65  ariable is incre
22460 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20  mented whenever 
22470 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61  the library.** a
22480 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20  ttempts to open 
22490 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
224a0 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
224b0 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a  ion is used for.
224c0 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  ** testing and a
224d0 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a  nalysis only.  .
224e0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
224f0 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
22500 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
22510 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
22520 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f  .** Open a tempo
22530 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rary file..**.**
22540 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
22550 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20  descriptor into 
22560 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53  *pFile. Return S
22570 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
22580 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20  ess .** or some 
22590 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
225a0 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65   if we fail. The
225b0 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74   OS will automat
225c0 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74  ically .** delet
225d0 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
225e0 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20  file when it is 
225f0 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  closed..**.** Th
22600 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74  e flags passed t
22610 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20  o the VFS layer 
22620 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65  xOpen() call are
22630 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
22640 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72  .** by parameter
22650 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77   vfsFlags ORed w
22660 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
22670 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c  g:.**.**     SQL
22680 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
22690 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  TE.**     SQLITE
226a0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20  _OPEN_CREATE.** 
226b0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
226c0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
226d0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
226e0 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74  ETEONCLOSE.*/.st
226f0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70  atic int pagerOp
22700 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20  entemp(.  Pager 
22710 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
22720 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a  /* The pager obj
22730 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ect */.  sqlite3
22740 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f  _file *pFile,  /
22750 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
22760 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65   descriptor here
22770 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
22780 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  gs          /* F
22790 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
227a0 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a  ugh to the VFS *
227b0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
227c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
227d0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
227e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
227f0 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  ST.  sqlite3_ope
22800 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20  ntemp_count++;  
22810 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  /* Used for test
22820 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
22830 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a   only */.#endif.
22840 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20  .  vfsFlags |=  
22850 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
22860 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
22870 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20  PEN_CREATE |.   
22880 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
22890 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c  OPEN_EXCLUSIVE |
228a0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
228b0 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63  ETEONCLOSE;.  rc
228c0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
228d0 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30  (pPager->pVfs, 0
228e0 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67  , pFile, vfsFlag
228f0 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  s, 0);.  assert(
22900 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
22910 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20  | isOpen(pFile) 
22920 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
22930 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
22940 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75   busy handler fu
22950 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  nction..**.** Th
22960 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20  e pager invokes 
22970 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
22980 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   if sqlite3OsLoc
22990 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  k() returns .** 
229a0 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e  SQLITE_BUSY when
229b0 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61   trying to upgra
229c0 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20  de from no-lock 
229d0 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  to a SHARED lock
229e0 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79  ,.** or when try
229f0 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66  ing to upgrade f
22a00 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c  rom a RESERVED l
22a10 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  ock to an EXCLUS
22a20 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74  IVE .** lock. It
22a30 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f   does *not* invo
22a40 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
22a50 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69  ler when upgradi
22a60 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45  ng from.** SHARE
22a70 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f  D to RESERVED, o
22a80 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  r when upgrading
22a90 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20   from SHARED to 
22aa0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68  EXCLUSIVE.** (wh
22ab0 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ich occurs durin
22ac0 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  g hot-journal ro
22ad0 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79  llback). Summary
22ae0 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69  :.**.**   Transi
22af0 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
22b00 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e              | In
22b10 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c  vokes xBusyHandl
22b20 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  er.**   --------
22b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22b60 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20  .**   NO_LOCK   
22b70 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f      -> SHARED_LO
22b80 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a  CK      | Yes.**
22b90 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20     SHARED_LOCK  
22ba0 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43   -> RESERVED_LOC
22bb0 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53  K    | No.**   S
22bc0 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20  HARED_LOCK   -> 
22bd0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20  EXCLUSIVE_LOCK  
22be0 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52   | No.**   RESER
22bf0 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c  VED_LOCK -> EXCL
22c00 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59  USIVE_LOCK   | Y
22c10 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  es.**.** If the 
22c20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
22c30 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f  lback returns no
22c40 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b  n-zero, the lock
22c50 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e   is .** retried.
22c60 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a   If it returns z
22c70 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51  ero, then the SQ
22c80 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20  LITE_BUSY error 
22c90 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74  is.** returned t
22ca0 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20  o the caller of 
22cb0 74 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75  the pager API fu
22cc0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nction..*/.void 
22cd0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
22ce0 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61  usyhandler(.  Pa
22cf0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
22d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d10 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
22d20 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42  ct */.  int (*xB
22d30 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64  usyHandler)(void
22d40 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20   *),         /* 
22d50 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d  Pointer to busy-
22d60 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
22d70 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73   */.  void *pBus
22d80 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20  yHandlerArg     
22d90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
22da0 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74  gument to pass t
22db0 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  o xBusyHandler *
22dc0 2f 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  /.){.  pPager->x
22dd0 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42  BusyHandler = xB
22de0 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50  usyHandler;.  pP
22df0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
22e00 65 72 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e  erArg = pBusyHan
22e10 64 6c 65 72 41 72 67 3b 0a 0a 20 20 69 66 28 20  dlerArg;..  if( 
22e20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
22e30 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a  d) ){.    void *
22e40 2a 61 70 20 3d 20 28 76 6f 69 64 20 2a 2a 29 26  *ap = (void **)&
22e50 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
22e60 64 6c 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74  dler;.    assert
22e70 28 20 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 20  ( ((int(*)(void 
22e80 2a 29 29 28 61 70 5b 30 5d 29 29 3d 3d 78 42 75  *))(ap[0]))==xBu
22e90 73 79 48 61 6e 64 6c 65 72 20 29 3b 0a 20 20 20  syHandler );.   
22ea0 20 61 73 73 65 72 74 28 20 61 70 5b 31 5d 3d 3d   assert( ap[1]==
22eb0 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
22ec0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
22ed0 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28  FileControlHint(
22ee0 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49  pPager->fd, SQLI
22ef0 54 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48 41 4e  TE_FCNTL_BUSYHAN
22f00 44 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29 61 70  DLER, (void *)ap
22f10 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
22f20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20  Change the page 
22f30 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65  size used by the
22f40 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54   Pager object. T
22f50 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65  he new page size
22f60 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69   .** is passed i
22f70 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a  n *pPageSize..**
22f80 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
22f90 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
22fa0 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
22fb0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
22fc0 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20  led, it.** is a 
22fd0 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65  no-op. The value
22fe0 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
22ff0 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72   error state err
23000 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a  or code (i.e. .*
23010 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  * one of SQLITE_
23020 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49 54 45  IOERR, an SQLITE
23030 5f 49 4f 45 52 52 5f 78 78 78 20 73 75 62 2d 63  _IOERR_xxx sub-c
23040 6f 64 65 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  ode or SQLITE_FU
23050 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  LL)..**.** Other
23060 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20  wise, if all of 
23070 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
23080 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
23090 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73  * the new page s
230a0 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70  ize (value of *p
230b0 50 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c  PageSize) is val
230c0 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20  id (a power .** 
230d0 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65      of two betwe
230e0 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54  en 512 and SQLIT
230f0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c  E_MAX_PAGE_SIZE,
23100 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64   inclusive), and
23110 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65  .**.**   * there
23120 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
23130 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e  ing page referen
23140 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ces, and.**.**  
23150 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20   * the database 
23160 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e  is either not an
23170 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
23180 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20  ase or it is.** 
23190 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79      an in-memory
231a0 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63   database that c
231b0 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74  urrently consist
231c0 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e  s of zero pages.
231d0 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  .**.** then the 
231e0 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67  pager object pag
231f0 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f  e size is set to
23200 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a   *pPageSize..**.
23210 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73  ** If the page s
23220 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20  ize is changed, 
23230 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
23240 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50  on uses sqlite3P
23250 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a  agerMalloc() .**
23260 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77   to obtain a new
23270 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
23280 20 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73   buffer. If this
23290 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65   allocation atte
232a0 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53  mpt .** fails, S
232b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
232c0 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
232d0 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e  page size remain
232e0 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a  s unchanged. .**
232f0 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61   In all other ca
23300 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ses, SQLITE_OK i
23310 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
23320 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
23330 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65  ze is not change
23340 64 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73  d, either becaus
23350 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75  e one of the enu
23360 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69  merated.** condi
23370 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e  tions above is n
23380 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67  ot true, the pag
23390 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20  er was in error 
233a0 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a  state when this.
233b0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  ** function was 
233c0 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75  called, or becau
233d0 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  se the memory al
233e0 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74  location attempt
233f0 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65   failed, .** the
23400 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20  n *pPageSize is 
23410 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20  set to the old, 
23420 72 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69  retained page si
23430 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ze before return
23440 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
23450 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
23460 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
23470 72 2c 20 75 33 32 20 2a 70 50 61 67 65 53 69 7a  r, u32 *pPageSiz
23480 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29  e, int nReserve)
23490 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
234a0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 74  ITE_OK;..  /* It
234b0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
234c0 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61 73   to do a full as
234d0 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
234e0 28 29 20 68 65 72 65 2c 20 61 73 20 74 68 69 73  () here, as this
234f0 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d  .  ** function m
23500 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f  ay be called fro
23510 6d 20 77 69 74 68 69 6e 20 50 61 67 65 72 4f 70  m within PagerOp
23520 65 6e 28 29 2c 20 62 65 66 6f 72 65 20 74 68 65  en(), before the
23530 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20 74   state.  ** of t
23540 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
23550 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63 6f  is internally co
23560 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a 20  nsistent..  **. 
23570 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74   ** At one point
23580 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
23590 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72  eturned an error
235a0 20 69 66 20 74 68 65 20 70 61 67 65 72 20 77 61   if the pager wa
235b0 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45 52  s in .  ** PAGER
235c0 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 42 75  _ERROR state. Bu
235d0 74 20 73 69 6e 63 65 20 50 41 47 45 52 5f 45 52  t since PAGER_ER
235e0 52 4f 52 20 73 74 61 74 65 20 67 75 61 72 61 6e  ROR state guaran
235f0 74 65 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  tees that.  ** t
23600 68 65 72 65 20 69 73 20 61 74 20 6c 65 61 73 74  here is at least
23610 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
23620 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2c   page reference,
23630 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
23640 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66   ** is a no-op f
23650 6f 72 20 74 68 61 74 20 63 61 73 65 20 61 6e 79  or that case any
23660 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33 32  how..  */..  u32
23670 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61   pageSize = *pPa
23680 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
23690 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c  ( pageSize==0 ||
236a0 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20   (pageSize>=512 
236b0 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
236c0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
236d0 45 29 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61  E) );.  if( (pPa
236e0 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c  ger->memDb==0 ||
236f0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
23700 3d 30 29 0a 20 20 20 26 26 20 73 71 6c 69 74 65  =0).   && sqlite
23710 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
23720 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
23730 3d 3d 30 20 0a 20 20 20 26 26 20 70 61 67 65 53  ==0 .   && pageS
23740 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21  ize && pageSize!
23750 3d 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70 61  =(u32)pPager->pa
23760 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20  geSize .  ){.   
23770 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e 55   char *pNew = NU
23780 4c 4c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  LL;             
23790 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73 70 61 63  /* New temp spac
237a0 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42 79  e */.    i64 nBy
237b0 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  te = 0;..    if(
237c0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
237d0 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 69 73  PAGER_OPEN && is
237e0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
237f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
23800 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
23810 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 42  (pPager->fd, &nB
23820 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  yte);.    }.    
23830 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23840 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20  K ){.      pNew 
23850 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
23860 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65  3PageMalloc(page
23870 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
23880 20 21 70 4e 65 77 20 29 20 72 63 20 3d 20 53 51   !pNew ) rc = SQ
23890 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
238a0 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
238b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
238c0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
238d0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61  ager);.      pPa
238e0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50  ger->dbSize = (P
238f0 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61 67 65  gno)((nByte+page
23900 53 69 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a 65  Size-1)/pageSize
23910 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
23920 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
23930 53 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69  Size;.      sqli
23940 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67  te3PageFree(pPag
23950 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  er->pTmpSpace);.
23960 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54        pPager->pT
23970 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a  mpSpace = pNew;.
23980 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
23990 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28 70  cheSetPageSize(p
239a0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
239b0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
239c0 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65 53 69  .  }..  *pPageSi
239d0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
239e0 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 72 63 3d  eSize;.  if( rc=
239f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23a00 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
23a10 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20 70 50   ) nReserve = pP
23a20 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 3b 0a  ager->nReserve;.
23a30 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
23a40 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
23a50 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20 20 20  rve<1000 );.    
23a60 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
23a70 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72 76 65   = (i16)nReserve
23a80 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f 72  ;.    pagerRepor
23a90 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  tSize(pPager);. 
23aa0 20 20 20 70 61 67 65 72 46 69 78 4d 61 70 6c 69     pagerFixMapli
23ab0 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  mit(pPager);.  }
23ac0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
23ad0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
23ae0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22  pointer to the "
23af0 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20  temporary page" 
23b00 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65  buffer held inte
23b10 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65  rnally.** by the
23b20 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73   pager.  This is
23b30 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69   a buffer that i
23b40 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  s big enough to 
23b50 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69  hold the.** enti
23b60 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  re content of a 
23b70 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20  database page.  
23b80 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75  This buffer is u
23b90 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  sed internally.*
23ba0 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  * during rollbac
23bb0 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76  k and will be ov
23bc0 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76  erwritten whenev
23bd0 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  er a rollback.**
23be0 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74   occurs.  But ot
23bf0 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20  her modules are 
23c00 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74  free to use it t
23c10 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a  oo, as long as.*
23c20 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61  * no rollbacks a
23c30 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f  re happening..*/
23c40 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
23c50 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67  gerTempSpace(Pag
23c60 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
23c70 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54  eturn pPager->pT
23c80 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  mpSpace;.}../*.*
23c90 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
23ca0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74   the maximum dat
23cb0 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
23cc0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
23cd0 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65  sitive. .** Make
23ce0 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d   no changes if m
23cf0 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72  xPage is zero or
23d00 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20   negative.  And 
23d10 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65  never reduce the
23d20 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  .** maximum page
23d30 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65   count below the
23d40 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
23d50 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
23d60 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  *.** Regardless 
23d70 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
23d80 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  n the current ma
23d90 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
23da0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23db0 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
23dc0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
23dd0 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
23de0 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a  if( mxPage>0 ){.
23df0 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
23e00 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  no = mxPage;.  }
23e10 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
23e20 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
23e30 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20 20 2f 2a  _OPEN );      /*
23e40 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62 79 20   Called only by 
23e50 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f 0a 20  OP_MaxPgcnt */. 
23e60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
23e70 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67 65 72 2d  >mxPgno>=pPager-
23e80 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f 2a 20 4f  >dbSize );  /* O
23e90 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e 66 6f 72  P_MaxPgcnt enfor
23ea0 63 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 72 65  ces this */.  re
23eb0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50  turn pPager->mxP
23ec0 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  gno;.}../*.** Th
23ed0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20  e following set 
23ee0 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  of routines are 
23ef0 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20  used to disable 
23f00 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  the simulated.**
23f10 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61   I/O error mecha
23f20 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75  nism.  These rou
23f30 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
23f40 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65  o avoid simulate
23f50 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70  d.** errors in p
23f60 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64  laces where we d
23f70 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
23f80 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55   errors..**.** U
23f90 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54  nless -DSQLITE_T
23fa0 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74  EST=1 is used, t
23fb0 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
23fc0 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20  e all no-ops.** 
23fd0 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20  and generate no 
23fe0 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  code..*/.#ifdef 
23ff0 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65  SQLITE_TEST.exte
24000 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
24010 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
24020 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
24030 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  te3_io_error_hit
24040 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
24050 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73  ed_cnt;.void dis
24060 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
24070 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
24080 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71    saved_cnt = sq
24090 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
240a0 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65  ending;.  sqlite
240b0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
240c0 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20  ng = -1;.}.void 
240d0 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
240e0 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
240f0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  {.  sqlite3_io_e
24100 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73  rror_pending = s
24110 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73  aved_cnt;.}.#els
24120 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62  e.# define disab
24130 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
24140 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e  errors().# defin
24150 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  e enable_simulat
24160 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
24170 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
24180 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79  d the first N by
24190 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67  tes from the beg
241a0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69  inning of the fi
241b0 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a  le into memory.*
241c0 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69  * that pDest poi
241d0 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  nts to. .**.** I
241e0 66 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  f the pager was 
241f0 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e  opened on a tran
24200 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c  sient file (zFil
24210 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a  ename==""), or.*
24220 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69  * opened on a fi
24230 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62  le less than N b
24240 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68  ytes in size, th
24250 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
24260 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64  is.** zeroed and
24270 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
24280 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61  ned. The rationa
24290 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73 20 74  le for this is t
242a0 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  hat this .** fun
242b0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
242c0 20 72 65 61 64 20 64 61 74 61 62 61 73 65 20 68   read database h
242d0 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65  eaders, and a ne
242e0 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a  w transient or.*
242f0 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74  * zero sized dat
24300 61 62 61 73 65 20 68 61 73 20 61 20 68 65 61 64  abase has a head
24310 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73  er than consists
24320 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72   entirely of zer
24330 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  oes..**.** If an
24340 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74  y IO error apart
24350 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45   from SQLITE_IOE
24360 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73  RR_SHORT_READ is
24370 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a   encountered,.**
24380 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
24390 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
243a0 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68  he caller and th
243b0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
243c0 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66  e.** output buff
243d0 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  er undefined..*/
243e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
243f0 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
24400 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
24410 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63  nt N, unsigned c
24420 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69  har *pDest){.  i
24430 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
24440 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73  K;.  memset(pDes
24450 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65  t, 0, N);.  asse
24460 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
24470 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
24480 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20  ->tempFile );.. 
24490 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
244a0 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
244b0 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64 69 61  by btree immedia
244c0 74 65 6c 79 20 61 66 74 65 72 20 63 72 65 61 74  tely after creat
244d0 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50 61 67  ing.  ** the Pag
244e0 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 72  er object.  Ther
244f0 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  e has not been a
24500 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
24510 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20 2a 2a   transition.  **
24520 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79 65 74   to WAL mode yet
24530 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
24540 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
24550 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  ager) );..  if( 
24560 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
24570 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  d) ){.    IOTRAC
24580 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25  E(("DBHDR %p 0 %
24590 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29  d\n", pPager, N)
245a0 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
245b0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
245c0 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30  >fd, pDest, N, 0
245d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
245e0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
245f0 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
24600 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24610 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
24620 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
24630 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
24640 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
24650 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
24660 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
24670 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 72   on.** the pager
24680 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74 68 65  . It returns the
24690 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
246a0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
246b0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 48 6f  tabase..**.** Ho
246c0 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 66 69  wever, if the fi
246d0 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20 31 20  le is between 1 
246e0 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20  and <page-size> 
246f0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  bytes in size, t
24700 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20  hen .** this is 
24710 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20 70  considered a 1 p
24720 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76 6f 69  age file..*/.voi
24730 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  d sqlite3PagerPa
24740 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
24750 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61  Pager, int *pnPa
24760 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
24770 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
24780 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
24790 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
247a0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 57  >eState!=PAGER_W
247b0 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20 29  RITER_FINISHED )
247c0 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 28 69  ;.  *pnPage = (i
247d0 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  nt)pPager->dbSiz
247e0 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  e;.}.../*.** Try
247f0 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63   to obtain a loc
24800 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79  k of type lockty
24810 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  pe on the databa
24820 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61  se file. If.** a
24830 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61   similar or grea
24840 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  ter lock is alre
24850 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66  ady held, this f
24860 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
24870 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67  op.** (returning
24880 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64   SQLITE_OK immed
24890 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f  iately)..**.** O
248a0 74 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70  therwise, attemp
248b0 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  t to obtain the 
248c0 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74  lock using sqlit
248d0 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f  e3OsLock(). Invo
248e0 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20  ke .** the busy 
248f0 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20  callback if the 
24900 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c  lock is currentl
24910 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  y not available.
24920 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69   Repeat .** unti
24930 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  l the busy callb
24940 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ack returns fals
24950 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61  e or until the a
24960 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62  ttempt to .** ob
24970 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75  tain the lock su
24980 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  cceeds..**.** Re
24990 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
249a0 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e  n success and an
249b0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
249c0 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a  e cannot obtain.
249d0 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20  ** the lock. If 
249e0 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61  the lock is obta
249f0 69 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ined successfull
24a00 79 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72  y, set the Pager
24a10 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61  .state .** varia
24a20 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20  ble to locktype 
24a30 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
24a40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24a50 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
24a60 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
24a70 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
24a80 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
24a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24aa0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
24ab0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
24ac0 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20  Check that this 
24ad0 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f  is either a no-o
24ae0 70 20 28 62 65 63 61 75 73 65 20 74 68 65 20 72  p (because the r
24af0 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73  equested lock is
24b00 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68   .  ** already h
24b10 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74  eld, or one of t
24b20 68 65 20 74 72 61 6e 73 69 73 74 69 6f 6e 73 20  he transistions 
24b30 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68 61  that the busy-ha
24b40 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62  ndler.  ** may b
24b50 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67  e invoked during
24b60 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
24b70 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
24b80 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  .  ** sqlite3Pag
24b90 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
24ba0 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ()..  */.  asser
24bb0 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  t( (pPager->eLoc
24bc0 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20  k>=locktype).   
24bd0 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
24be0 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26  eLock==NO_LOCK &
24bf0 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  & locktype==SHAR
24c00 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20  ED_LOCK).       
24c10 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63  || (pPager->eLoc
24c20 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
24c30 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58   && locktype==EX
24c40 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20  CLUSIVE_LOCK).  
24c50 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72  );..  do {.    r
24c60 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
24c70 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65  pPager, locktype
24c80 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  );.  }while( rc=
24c90 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
24ca0 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
24cb0 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
24cc0 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b  syHandlerArg) );
24cd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24ce0 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  ./*.** Function 
24cf0 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
24d00 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72 29  nstraint(pPager)
24d10 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f 6e 65   checks that one
24d20 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c   of the .** foll
24d30 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20 66 6f  owing is true fo
24d40 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  r all dirty page
24d50 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  s currently in t
24d60 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a 0a 2a  he page-cache:.*
24d70 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20 70 61  *.**   a) The pa
24d80 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73  ge number is les
24d90 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  s than or equal 
24da0 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
24db0 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 72  he .**      curr
24dc0 65 6e 74 20 64 61 74 61 62 61 73 65 20 69 6d 61  ent database ima
24dd0 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 4f 52  ge, in pages, OR
24de0 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66 20 74  .**.**   b) if t
24df0 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
24e00 77 65 72 65 20 77 72 69 74 74 65 6e 20 61 74 20  were written at 
24e10 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20 77 6f  this time, it wo
24e20 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  uld not.**      
24e30 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  be necessary to 
24e40 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
24e50 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 74 6f  t content out to
24e60 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
24e70 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64 65 74  .**      (as det
24e80 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e 63 74  ermined by funct
24e90 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72 65 73  ion subjRequires
24ea0 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 49  Page())..**.** I
24eb0 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  f the condition 
24ec0 61 73 73 65 72 74 65 64 20 62 79 20 74 68 69 73  asserted by this
24ed0 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65 20 6e   function were n
24ee0 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65  ot true, and the
24ef0 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 77  .** dirty page w
24f00 65 72 65 20 74 6f 20 62 65 20 64 69 73 63 61 72  ere to be discar
24f10 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63  ded from the cac
24f20 68 65 20 76 69 61 20 74 68 65 20 70 61 67 65 72  he via the pager
24f30 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f 75 74  Stress().** rout
24f40 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65 73 73  ine, pagerStress
24f50 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77 72 69  () would not wri
24f60 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
24f70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f 0a 2a  age content to.*
24f80 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
24f90 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65 70 6f  ile. If a savepo
24fa0 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  int transaction 
24fb0 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  were rolled back
24fc0 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73 20 68   after.** this h
24fd0 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63 6f 72  appened, the cor
24fe0 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 77 6f  rect behavior wo
24ff0 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74 6f 72  uld be to restor
25000 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  e the current.**
25010 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
25020 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c 20 73  page. However, s
25030 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74 65 6e  ince this conten
25040 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  t is not present
25050 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20 74 68   in either.** th
25060 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
25070 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 6f  or the portion o
25080 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  f the rollback j
25090 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a 20 73  ournal and .** s
250a0 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 65  ub-journal rolle
250b0 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e 74 65  d back the conte
250c0 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  nt could not be 
250d0 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74 68 65  restored and the
250e0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61  .** database ima
250f0 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d 65 20  ge would become 
25100 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73 20 74  corrupt. It is t
25110 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75 6e 61  herefore fortuna
25120 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68 69 73  te that .** this
25130 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 63 61   circumstance ca
25140 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f 0a 23  nnot arise..*/.#
25150 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
25160 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63 20  E_DEBUG).static 
25170 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63  void assertTrunc
25180 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 28  ateConstraintCb(
25190 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 61  PgHdr *pPg){.  a
251a0 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67  ssert( pPg->flag
251b0 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b  s&PGHDR_DIRTY );
251c0 0a 20 20 61 73 73 65 72 74 28 20 21 73 75 62 6a  .  assert( !subj
251d0 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
251e0 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d  ) || pPg->pgno<=
251f0 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62 53  pPg->pPager->dbS
25200 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69 63 20  ize );.}.static 
25210 76 6f 69 64 20 61 73 73 65 72 74 54 72 75 6e 63  void assertTrunc
25220 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28 50 61  ateConstraint(Pa
25230 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
25240 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65  sqlite3PcacheIte
25250 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72  rateDirty(pPager
25260 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73 65 72  ->pPCache, asser
25270 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
25280 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73 65 0a  intCb);.}.#else.
25290 23 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 54  # define assertT
252a0 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
252b0 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64 69 66  t(pPager).#endif
252c0 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
252d0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   the in-memory d
252e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61  atabase file ima
252f0 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65  ge to nPage page
25300 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  s. This .** func
25310 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63  tion does not ac
25320 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68  tually modify th
25330 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
25340 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20  on disk. It .** 
25350 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69 6e  just sets the in
25360 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20  ternal state of 
25370 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
25380 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a   so that the .**
25390 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c   truncation will
253a0 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68   be done when th
253b0 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
253c0 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
253d0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ed..**.** This f
253e0 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
253f0 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66  called right bef
25400 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ore committing a
25410 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
25420 20 4f 6e 63 65 20 74 68 69 73 20 66 75 6e 63 74   Once this funct
25430 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 61 6c  ion has been cal
25440 6c 65 64 2c 20 74 68 65 20 74 72 61 6e 73 61 63  led, the transac
25450 74 69 6f 6e 20 6d 75 73 74 20 65 69 74 68 65 72  tion must either
25460 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61   be.** rolled ba
25470 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 74 65 64 2e  ck or committed.
25480 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20   It is not safe 
25490 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  to call this fun
254a0 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74 68 65  ction and.** the
254b0 6e 20 63 6f 6e 74 69 6e 75 65 20 77 72 69 74 69  n continue writi
254c0 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
254d0 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
254e0 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
254f0 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  Image(Pager *pPa
25500 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
25510 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
25520 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67  er->dbSize>=nPag
25530 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
25540 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
25550 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
25560 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67 65 72  EMOD );.  pPager
25570 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
25580 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70  ;..  /* At one p
25590 6f 69 6e 74 20 74 68 65 20 63 6f 64 65 20 68 65  oint the code he
255a0 72 65 20 63 61 6c 6c 65 64 20 61 73 73 65 72 74  re called assert
255b0 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69  TruncateConstrai
255c0 6e 74 28 29 20 74 6f 0a 20 20 2a 2a 20 65 6e 73  nt() to.  ** ens
255d0 75 72 65 20 74 68 61 74 20 61 6c 6c 20 70 61 67  ure that all pag
255e0 65 73 20 62 65 69 6e 67 20 74 72 75 6e 63 61 74  es being truncat
255f0 65 64 20 61 77 61 79 20 62 79 20 74 68 69 73 20  ed away by this 
25600 6f 70 65 72 61 74 69 6f 6e 20 61 72 65 2c 0a 20  operation are,. 
25610 20 2a 2a 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f   ** if one or mo
25620 72 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  re savepoints ar
25630 65 20 6f 70 65 6e 2c 20 70 72 65 73 65 6e 74 20  e open, present 
25640 69 6e 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  in the savepoint
25650 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 73   .  ** journal s
25660 6f 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20  o that they can 
25670 62 65 20 72 65 73 74 6f 72 65 64 20 69 66 20 74  be restored if t
25680 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  he savepoint is 
25690 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b  rolled.  ** back
256a0 2e 20 54 68 69 73 20 69 73 20 6e 6f 20 6c 6f 6e  . This is no lon
256b0 67 65 72 20 6e 65 63 65 73 73 61 72 79 20 61 73  ger necessary as
256c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
256d0 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a 2a 20  s now only.  ** 
256e0 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62 65 66  called right bef
256f0 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ore committing a
25700 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f   transaction. So
25710 20 61 6c 74 68 6f 75 67 68 20 74 68 65 20 0a 20   although the . 
25720 20 2a 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   ** Pager object
25730 20 6d 61 79 20 73 74 69 6c 6c 20 68 61 76 65 20   may still have 
25740 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
25750 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e  (Pager.nSavepoin
25760 74 21 3d 30 29 2c 20 0a 20 20 2a 2a 20 74 68 65  t!=0), .  ** the
25770 79 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c  y cannot be roll
25780 65 64 20 62 61 63 6b 2e 20 53 6f 20 74 68 65 20  ed back. So the 
25790 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f  assertTruncateCo
257a0 6e 73 74 72 61 69 6e 74 28 29 20 63 61 6c 6c 0a  nstraint() call.
257b0 20 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65    ** is no longe
257c0 72 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a 7d 0a  r correct. */.}.
257d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
257e0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
257f0 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
25800 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  g a hot-journal 
25810 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a 2a 20  rollback. It.** 
25820 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72 6e 61  syncs the journa
25830 6c 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2c 20  l file to disk, 
25840 74 68 65 6e 20 73 65 74 73 20 70 50 61 67 65 72  then sets pPager
25850 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20  ->journalHdr to 
25860 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74  the.** size of t
25870 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
25880 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65  so that the page
25890 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75  r_playback() rou
258a0 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20 74 68  tine knows.** th
258b0 61 74 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f  at the entire jo
258c0 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62  urnal file has b
258d0 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a  een synced..**.*
258e0 2a 20 53 79 6e 63 69 6e 67 20 61 20 68 6f 74 2d  * Syncing a hot-
258f0 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73 6b 20  journal to disk 
25900 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
25910 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  g to roll it bac
25920 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20 74 68  k ensures .** th
25930 61 74 20 69 66 20 61 20 70 6f 77 65 72 2d 66 61  at if a power-fa
25940 69 6c 75 72 65 20 6f 63 63 75 72 73 20 64 75 72  ilure occurs dur
25950 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
25960 2c 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  , the process th
25970 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 72  at.** attempts r
25980 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e  ollback followin
25990 67 20 73 79 73 74 65 6d 20 72 65 63 6f 76 65 72  g system recover
259a0 79 20 73 65 65 73 20 74 68 65 20 73 61 6d 65 20  y sees the same 
259b0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e 74 65  journal.** conte
259c0 6e 74 20 61 73 20 74 68 69 73 20 70 72 6f 63 65  nt as this proce
259d0 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  ss..**.** If eve
259e0 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 73 20  rything goes as 
259f0 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54 45 5f  planned, SQLITE_
25a00 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
25a10 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 61  Otherwise, .** a
25a20 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
25a30 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
25a40 6e 74 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a  nt pagerSyncHotJ
25a50 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
25a60 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
25a70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
25a80 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
25a90 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  nc ){.    rc = s
25aa0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
25ab0 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
25ac0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20  _SYNC_NORMAL);. 
25ad0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
25ae0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
25af0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
25b00 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
25b10 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
25b20 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65  alHdr);.  }.  re
25b30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
25b40 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66 65 72  * Obtain a refer
25b50 65 6e 63 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79  ence to a memory
25b60 20 6d 61 70 70 65 64 20 70 61 67 65 20 6f 62 6a   mapped page obj
25b70 65 63 74 20 66 6f 72 20 70 61 67 65 20 6e 75 6d  ect for page num
25b80 62 65 72 20 70 67 6e 6f 2e 20 0a 2a 2a 20 54 68  ber pgno. .** Th
25b90 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 77 69 6c  e new object wil
25ba0 6c 20 75 73 65 20 74 68 65 20 70 6f 69 6e 74 65  l use the pointe
25bb0 72 20 70 44 61 74 61 2c 20 6f 62 74 61 69 6e 65  r pData, obtaine
25bc0 64 20 66 72 6f 6d 20 78 46 65 74 63 68 28 29 2e  d from xFetch().
25bd0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
25be0 6c 2c 20 73 65 74 20 2a 70 70 50 61 67 65 20 74  l, set *ppPage t
25bf0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
25c00 65 77 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ew page referenc
25c10 65 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20  e.** and return 
25c20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72  SQLITE_OK. Other
25c30 77 69 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20  wise, return an 
25c40 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
25c50 65 20 61 6e 64 20 73 65 74 0a 2a 2a 20 2a 70 70  e and set.** *pp
25c60 50 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a  Page to zero..**
25c70 0a 2a 2a 20 50 61 67 65 20 72 65 66 65 72 65 6e  .** Page referen
25c80 63 65 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20  ces obtained by 
25c90 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
25ca0 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  ction should be 
25cb0 72 65 6c 65 61 73 65 64 0a 2a 2a 20 62 79 20 63  released.** by c
25cc0 61 6c 6c 69 6e 67 20 70 61 67 65 72 52 65 6c 65  alling pagerRele
25cd0 61 73 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f  aseMapPage()..*/
25ce0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
25cf0 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28  rAcquireMapPage(
25d00 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
25d10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25d20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
25d30 63 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ct */.  Pgno pgn
25d40 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
25d50 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
25d60 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 76 6f 69 64  number */.  void
25d70 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20 20 20   *pData,        
25d80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
25d90 46 65 74 63 68 28 29 27 64 20 64 61 74 61 20 66  Fetch()'d data f
25da0 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
25db0 20 20 50 67 48 64 72 20 2a 2a 70 70 50 61 67 65    PgHdr **ppPage
25dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25dd0 20 20 2f 2a 20 4f 55 54 3a 20 41 63 71 75 69 72    /* OUT: Acquir
25de0 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74 20 2a  ed page object *
25df0 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b  /.){.  PgHdr *p;
25e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e10 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
25e20 20 6d 61 70 70 65 64 20 70 61 67 65 20 74 6f 20   mapped page to 
25e30 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 69 66 28  return */..  if(
25e40 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72   pPager->pMmapFr
25e50 65 65 6c 69 73 74 20 29 7b 0a 20 20 20 20 2a 70  eelist ){.    *p
25e60 70 50 61 67 65 20 3d 20 70 20 3d 20 70 50 61 67  pPage = p = pPag
25e70 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73  er->pMmapFreelis
25e80 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  t;.    pPager->p
25e90 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 3d 20 70  MmapFreelist = p
25ea0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 70 2d  ->pDirty;.    p-
25eb0 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
25ec0 20 6d 65 6d 73 65 74 28 70 2d 3e 70 45 78 74 72   memset(p->pExtr
25ed0 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45  a, 0, pPager->nE
25ee0 78 74 72 61 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  xtra);.  }else{.
25ef0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 20      *ppPage = p 
25f00 3d 20 28 50 67 48 64 72 20 2a 29 73 71 6c 69 74  = (PgHdr *)sqlit
25f10 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
25f20 65 6f 66 28 50 67 48 64 72 29 20 2b 20 70 50 61  eof(PgHdr) + pPa
25f30 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20  ger->nExtra);.  
25f40 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
25f50 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66      sqlite3OsUnf
25f60 65 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c  etch(pPager->fd,
25f70 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a   (i64)(pgno-1) *
25f80 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
25f90 65 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20  e, pData);.     
25fa0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
25fb0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
25fc0 70 2d 3e 70 45 78 74 72 61 20 3d 20 28 76 6f 69  p->pExtra = (voi
25fd0 64 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 70  d *)&p[1];.    p
25fe0 2d 3e 66 6c 61 67 73 20 3d 20 50 47 48 44 52 5f  ->flags = PGHDR_
25ff0 4d 4d 41 50 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  MMAP;.    p->nRe
26000 66 20 3d 20 31 3b 0a 20 20 20 20 70 2d 3e 70 50  f = 1;.    p->pP
26010 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
26020 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d   }..  assert( p-
26030 3e 70 45 78 74 72 61 3d 3d 28 76 6f 69 64 20 2a  >pExtra==(void *
26040 29 26 70 5b 31 5d 20 29 3b 0a 20 20 61 73 73 65  )&p[1] );.  asse
26050 72 74 28 20 70 2d 3e 70 50 61 67 65 3d 3d 30 20  rt( p->pPage==0 
26060 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
26070 66 6c 61 67 73 3d 3d 50 47 48 44 52 5f 4d 4d 41  flags==PGHDR_MMA
26080 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  P );.  assert( p
26090 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
260a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
260b0 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 0a 20 20 70  >nRef==1 );..  p
260c0 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
260d0 20 70 2d 3e 70 44 61 74 61 20 3d 20 70 44 61 74   p->pData = pDat
260e0 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d  a;.  pPager->nMm
260f0 61 70 4f 75 74 2b 2b 3b 0a 0a 20 20 72 65 74 75  apOut++;..  retu
26100 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
26110 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
26120 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
26130 67 65 20 70 50 67 2e 20 70 50 67 20 6d 75 73 74  ge pPg. pPg must
26140 20 68 61 76 65 20 62 65 65 6e 20 72 65 74 75 72   have been retur
26150 6e 65 64 20 62 79 20 61 6e 20 0a 2a 2a 20 65 61  ned by an .** ea
26160 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 70 61  rlier call to pa
26170 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61 67  gerAcquireMapPag
26180 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e()..*/.static v
26190 6f 69 64 20 70 61 67 65 72 52 65 6c 65 61 73 65  oid pagerRelease
261a0 4d 61 70 50 61 67 65 28 50 67 48 64 72 20 2a 70  MapPage(PgHdr *p
261b0 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
261c0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
261d0 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d  er;.  pPager->nM
261e0 6d 61 70 4f 75 74 2d 2d 3b 0a 20 20 70 50 67 2d  mapOut--;.  pPg-
261f0 3e 70 44 69 72 74 79 20 3d 20 70 50 61 67 65 72  >pDirty = pPager
26200 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b  ->pMmapFreelist;
26210 0a 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70  .  pPager->pMmap
26220 46 72 65 65 6c 69 73 74 20 3d 20 70 50 67 3b 0a  Freelist = pPg;.
26230 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
26240 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d  r->fd->pMethods-
26250 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 3b 0a  >iVersion>=3 );.
26260 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74    sqlite3OsUnfet
26270 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  ch(pPager->fd, (
26280 69 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31  i64)(pPg->pgno-1
26290 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  )*pPager->pageSi
262a0 7a 65 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b  ze, pPg->pData);
262b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
262c0 6c 6c 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73  ll PgHdr objects
262d0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 50   stored in the P
262e0 61 67 65 72 2e 70 4d 6d 61 70 46 72 65 65 6c 69  ager.pMmapFreeli
262f0 73 74 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  st list..*/.stat
26300 69 63 20 76 6f 69 64 20 70 61 67 65 72 46 72 65  ic void pagerFre
26310 65 4d 61 70 48 64 72 73 28 50 61 67 65 72 20 2a  eMapHdrs(Pager *
26320 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
26330 20 2a 70 3b 0a 20 20 50 67 48 64 72 20 2a 70 4e   *p;.  PgHdr *pN
26340 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61  ext;.  for(p=pPa
26350 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
26360 73 74 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b  st; p; p=pNext){
26370 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e  .    pNext = p->
26380 70 44 69 72 74 79 3b 0a 20 20 20 20 73 71 6c 69  pDirty;.    sqli
26390 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
263a0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64  .}.../*.** Shutd
263b0 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63  own the page cac
263c0 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65  he.  Free all me
263d0 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61  mory and close a
263e0 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ll files..**.** 
263f0 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
26400 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73   was in progress
26410 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
26420 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
26430 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  at.** transactio
26440 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
26450 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69  .  All outstandi
26460 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
26470 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20  alidated.** and 
26480 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20  their memory is 
26490 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65  freed.  Any atte
264a0 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67  mpt to use a pag
264b0 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
264c0 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63  with this page c
264d0 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20  ache after this 
264e0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
264f0 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
26500 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
26510 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dump..**.** This
26520 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
26530 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61 20   succeeds. If a 
26540 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
26550 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74  ctive an attempt
26560 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72  .** is made to r
26570 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20  oll it back. If 
26580 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
26590 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
265a0 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f  ack .** a hot jo
265b0 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66  urnal may be lef
265c0 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73  t in the filesys
265d0 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  tem but no error
265e0 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
265f0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
26600 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
26610 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70  erClose(Pager *p
26620 50 61 67 65 72 29 7b 0a 20 20 75 38 20 2a 70 54  Pager){.  u8 *pT
26630 6d 70 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65  mp = (u8 *)pPage
26640 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20  r->pTmpSpace;.. 
26650 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
26660 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
26670 65 72 29 20 29 3b 0a 20 20 64 69 73 61 62 6c 65  er) );.  disable
26680 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
26690 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65  rors();.  sqlite
266a0 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
266b0 6f 63 28 29 3b 0a 20 20 70 61 67 65 72 46 72 65  oc();.  pagerFre
266c0 65 4d 61 70 48 64 72 73 28 70 50 61 67 65 72 29  eMapHdrs(pPager)
266d0 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65  ;.  /* pPager->e
266e0 72 72 43 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a 20  rrCode = 0; */. 
266f0 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
26700 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e  veMode = 0;.#ifn
26710 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
26720 57 41 4c 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  WAL.  sqlite3Wal
26730 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 57  Close(pPager->pW
26740 61 6c 2c 20 70 50 61 67 65 72 2d 3e 63 6b 70 74  al, pPager->ckpt
26750 53 79 6e 63 46 6c 61 67 73 2c 20 70 50 61 67 65  SyncFlags, pPage
26760 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 54 6d  r->pageSize, pTm
26770 70 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 57  p);.  pPager->pW
26780 61 6c 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  al = 0;.#endif. 
26790 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
267a0 67 65 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  ger);.  if( MEMD
267b0 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75  B ){.    pager_u
267c0 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
267d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
267e0 66 20 69 74 20 69 73 20 6f 70 65 6e 2c 20 73 79  f it is open, sy
267f0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
26800 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ile before calli
26810 6e 67 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  ng UnlockAndRoll
26820 62 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 49 66 20  back..    ** If 
26830 74 68 69 73 20 69 73 20 6e 6f 74 20 64 6f 6e 65  this is not done
26840 2c 20 74 68 65 6e 20 61 6e 20 75 6e 73 79 6e 63  , then an unsync
26850 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  ed portion of th
26860 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a  e open journal .
26870 20 20 20 20 2a 2a 20 66 69 6c 65 20 6d 61 79 20      ** file may 
26880 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69  be played back i
26890 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
268a0 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69  . If a power fai
268b0 6c 75 72 65 20 6f 63 63 75 72 73 20 0a 20 20 20  lure occurs .   
268c0 20 2a 2a 20 77 68 69 6c 65 20 74 68 69 73 20 69   ** while this i
268d0 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68 65  s happening, the
268e0 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20   database could 
268f0 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a  become corrupt..
26900 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
26910 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
26920 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
26930 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
26940 6c 2c 20 73 68 69 66 74 20 74 68 65 20 70 61 67  l, shift the pag
26950 65 72 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74  er.    ** into t
26960 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e 20  he ERROR state. 
26970 54 68 69 73 20 63 61 75 73 65 73 20 55 6e 6c 6f  This causes Unlo
26980 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 20 74 6f  ckAndRollback to
26990 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 20 20 20 20   unlock the.    
269a0 2a 2a 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ** database and 
269b0 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61  close the journa
269c0 6c 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61  l file without a
269d0 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72 6f 6c  ttempting to rol
269e0 6c 20 69 74 0a 20 20 20 20 2a 2a 20 62 61 63 6b  l it.    ** back
269f0 20 6f 72 20 66 69 6e 61 6c 69 7a 65 20 69 74 2e   or finalize it.
26a00 20 54 68 65 20 6e 65 78 74 20 64 61 74 61 62 61   The next databa
26a10 73 65 20 75 73 65 72 20 77 69 6c 6c 20 68 61 76  se user will hav
26a20 65 20 74 6f 20 64 6f 20 68 6f 74 2d 6a 6f 75 72  e to do hot-jour
26a30 6e 61 6c 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  nal.    ** rollb
26a40 61 63 6b 20 62 65 66 6f 72 65 20 61 63 63 65 73  ack before acces
26a50 73 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  sing the databas
26a60 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
26a70 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
26a80 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
26a90 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28      pager_error(
26aa0 70 50 61 67 65 72 2c 20 70 61 67 65 72 53 79 6e  pPager, pagerSyn
26ab0 63 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  cHotJournal(pPag
26ac0 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  er));.    }.    
26ad0 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
26ae0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
26af0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64    }.  sqlite3End
26b00 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
26b10 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74    enable_simulat
26b20 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
26b30 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43    PAGERTRACE(("C
26b40 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45  LOSE %d\n", PAGE
26b50 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
26b60 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45   IOTRACE(("CLOSE
26b70 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
26b80 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
26b90 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
26ba0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
26bb0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
26bc0 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
26bd0 70 54 6d 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  pTmp);.  sqlite3
26be0 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61 67  PcacheClose(pPag
26bf0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 23  er->pPCache);..#
26c00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
26c10 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 70 50 61  _CODEC.  if( pPa
26c20 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 20  ger->xCodecFree 
26c30 29 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ) pPager->xCodec
26c40 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 43 6f  Free(pPager->pCo
26c50 64 65 63 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  dec);.#endif..  
26c60 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
26c70 3e 61 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21  >aSavepoint && !
26c80 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
26c90 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
26ca0 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
26cb0 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28  jfd) && !isOpen(
26cc0 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b  pPager->sjfd) );
26cd0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
26ce0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
26cf0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
26d00 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
26d10 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
26d20 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
26d30 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
26d40 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  age number for p
26d50 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f  age pPg..*/.Pgno
26d60 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
26d70 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a  enumber(DbPage *
26d80 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pPg){.  return p
26d90 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64  Pg->pgno;.}.#end
26da0 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d  if../*.** Increm
26db0 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
26dc0 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65  e count for page
26dd0 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   pPg..*/.void sq
26de0 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44 62  lite3PagerRef(Db
26df0 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 73 71  Page *pPg){.  sq
26e00 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 28 70  lite3PcacheRef(p
26e10 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79  Pg);.}../*.** Sy
26e20 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  nc the journal. 
26e30 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
26e40 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68  make sure all th
26e50 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  e pages that hav
26e60 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65  e.** been writte
26e70 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
26e80 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72   have actually r
26e90 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61  eached the surfa
26ea0 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73  ce of the.** dis
26eb0 6b 20 61 6e 64 20 63 61 6e 20 62 65 20 72 65 73  k and can be res
26ec0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 65 76 65  tored in the eve
26ed0 6e 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72  nt of a hot-jour
26ee0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  nal rollback..**
26ef0 0a 2a 2a 20 49 66 20 74 68 65 20 50 61 67 65 72  .** If the Pager
26f00 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69 73 20  .noSync flag is 
26f10 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66  set, then this f
26f20 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
26f30 6f 70 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  op..** Otherwise
26f40 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20 72 65  , the actions re
26f50 71 75 69 72 65 64 20 64 65 70 65 6e 64 20 6f 6e  quired depend on
26f60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
26f70 65 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 64 65  e and the .** de
26f80 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
26f90 74 69 63 73 20 6f 66 20 74 68 65 20 66 69 6c 65  tics of the file
26fa0 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c  -system, as foll
26fb0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ows:.**.**   * I
26fc0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
26fd0 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  le is an in-memo
26fe0 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ry journal file,
26ff0 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a   no action need.
27000 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e  **     be taken.
27010 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72  .**.**   * Other
27020 77 69 73 65 2c 20 69 66 20 74 68 65 20 64 65 76  wise, if the dev
27030 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ice does not sup
27040 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41 50  port the SAFE_AP
27050 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a  PEND property,.*
27060 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e  *     then the n
27070 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65  Rec field of the
27080 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77   most recently w
27090 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68  ritten journal h
270a0 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20  eader.**     is 
270b0 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61  updated to conta
270c0 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  in the number of
270d0 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73   journal records
270e0 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20   that have.**   
270f0 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66    been written f
27100 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20  ollowing it. If 
27110 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 70 65  the pager is ope
27120 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73  rating in full-s
27130 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c  ync.**     mode,
27140 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
27150 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  l file is synced
27160 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 69 65   before this fie
27170 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a  ld is updated..*
27180 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
27190 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20  device does not 
271a0 73 75 70 70 6f 72 74 20 74 68 65 20 53 45 51 55  support the SEQU
271b0 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c  ENTIAL property,
271c0 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f   then .**     jo
271d0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79  urnal file is sy
271e0 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  nced..**.** Or, 
271f0 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a  in pseudo-code:.
27200 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20  **.**   if( NOT 
27210 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e  <in-memory journ
27220 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66  al> ){.**     if
27230 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e  ( NOT SAFE_APPEN
27240 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66  D ){.**       if
27250 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  ( <full-sync mod
27260 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72  e> ) xSync(<jour
27270 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20  nal file>);.**  
27280 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65       <update nRe
27290 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20  c field>.**     
272a0 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f  } .**     if( NO
272b0 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78  T SEQUENTIAL ) x
272c0 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
272d0 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a  le>);.**   }.**.
272e0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
272f0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
27300 6c 65 61 72 73 20 74 68 65 20 50 47 48 44 52 5f  lears the PGHDR_
27310 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f  NEED_SYNC flag o
27320 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61 67 65  f every .** page
27330 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
27340 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65  in memory before
27350 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54   returning SQLIT
27360 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a  E_OK. If an IO.*
27370 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  * error is encou
27380 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74 68 65  ntered, then the
27390 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
273a0 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
273b0 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61  e caller..*/.sta
273c0 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72  tic int syncJour
273d0 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
273e0 72 2c 20 69 6e 74 20 6e 65 77 48 64 72 29 7b 0a  r, int newHdr){.
273f0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
27400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27410 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
27420 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
27430 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
27440 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
27450 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  EMOD.       || p
27460 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
27470 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f  AGER_WRITER_DBMO
27480 44 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  D.  );.  assert(
27490 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
274a0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
274b0 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
274c0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
274d0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
274e0 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f  PagerExclusiveLo
274f0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ck(pPager);.  if
27500 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
27510 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
27520 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
27530 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ync ){.    asser
27540 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
27550 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20  File );.    if( 
27560 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
27570 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  fd) && pPager->j
27580 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
27590 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
275a0 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 63 6f  MORY ){.      co
275b0 6e 73 74 20 69 6e 74 20 69 44 63 20 3d 20 73 71  nst int iDc = sq
275c0 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
275d0 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
275e0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
275f0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
27600 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a  Pager->jfd) );..
27610 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44        if( 0==(iD
27620 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
27630 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20  AFE_APPEND) ){. 
27640 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
27650 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20  lock deals with 
27660 61 6e 20 6f 62 73 63 75 72 65 20 70 72 6f 62 6c  an obscure probl
27670 65 6d 2e 20 49 66 20 74 68 65 20 6c 61 73 74 20  em. If the last 
27680 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20  connection.     
27690 20 20 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65     ** that wrote
276a0 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
276b0 65 20 77 61 73 20 6f 70 65 72 61 74 69 6e 67 20  e was operating 
276c0 69 6e 20 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f  in persistent-jo
276d0 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  urnal.        **
276e0 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
276f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79  journal file may
27700 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 61   at this point a
27710 63 74 75 61 6c 6c 79 20 62 65 20 6c 61 72 67 65  ctually be large
27720 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  r.        ** tha
27730 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  n Pager.journalO
27740 66 66 20 62 79 74 65 73 2e 20 49 66 20 74 68 65  ff bytes. If the
27750 20 6e 65 78 74 20 74 68 69 6e 67 20 69 6e 20 74   next thing in t
27760 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
27770 20 20 20 2a 2a 20 66 69 6c 65 20 68 61 70 70 65     ** file happe
27780 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e  ns to be a journ
27790 61 6c 2d 68 65 61 64 65 72 20 28 77 72 69 74 74  al-header (writt
277a0 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  en as part of th
277b0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  e.        ** pre
277c0 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e  vious connection
277d0 27 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  's transaction),
277e0 20 61 6e 64 20 61 20 63 72 61 73 68 20 6f 72 20   and a crash or 
277f0 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 0a 20  power-failure . 
27800 20 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 73         ** occurs
27810 20 61 66 74 65 72 20 6e 52 65 63 20 69 73 20 75   after nRec is u
27820 70 64 61 74 65 64 20 62 75 74 20 62 65 66 6f 72  pdated but befor
27830 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  e this connectio
27840 6e 20 77 72 69 74 65 73 20 0a 20 20 20 20 20 20  n writes .      
27850 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c    ** anything el
27860 73 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  se to the journa
27870 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69  l file (or commi
27880 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74  ts/rolls back it
27890 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  s .        ** tr
278a0 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e  ansaction), then
278b0 20 53 51 4c 69 74 65 20 6d 61 79 20 62 65 63 6f   SQLite may beco
278c0 6d 65 20 63 6f 6e 66 75 73 65 64 20 77 68 65 6e  me confused when
278d0 20 64 6f 69 6e 67 20 74 68 65 20 0a 20 20 20 20   doing the .    
278e0 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e      ** hot-journ
278f0 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c  al rollback foll
27900 6f 77 69 6e 67 20 72 65 63 6f 76 65 72 79 2e 20  owing recovery. 
27910 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b  It may roll back
27920 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20   all.        ** 
27930 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  of this connecti
27940 6f 6e 73 20 64 61 74 61 2c 20 74 68 65 6e 20 70  ons data, then p
27950 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e  roceed to rollin
27960 67 20 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a  g back the old,.
27970 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f          ** out-o
27980 66 2d 64 61 74 65 20 64 61 74 61 20 74 68 61 74  f-date data that
27990 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74   follows it. Dat
279a0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
279b0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
279c0 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20       ** To work 
279d0 61 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20  around this, if 
279e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
279f0 20 64 6f 65 73 20 61 70 70 65 61 72 20 74 6f 20   does appear to 
27a00 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 20 20  contain.        
27a10 2a 2a 20 61 20 76 61 6c 69 64 20 68 65 61 64 65  ** a valid heade
27a20 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65  r following Page
27a30 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68  r.journalOff, th
27a40 65 6e 20 77 72 69 74 65 20 61 20 30 78 30 30 0a  en write a 0x00.
27a50 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20          ** byte 
27a60 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
27a70 69 74 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74  it to prevent it
27a80 20 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f   from being reco
27a90 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20 20 20  gnized..        
27aa0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 56 61  **.        ** Va
27ab0 72 69 61 62 6c 65 20 69 4e 65 78 74 48 64 72 4f  riable iNextHdrO
27ac0 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f 20  ffset is set to 
27ad0 74 68 65 20 6f 66 66 73 65 74 20 61 74 20 77 68  the offset at wh
27ae0 69 63 68 20 74 68 69 73 0a 20 20 20 20 20 20 20  ich this.       
27af0 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63 20   ** problematic 
27b00 68 65 61 64 65 72 20 77 69 6c 6c 20 6f 63 63 75  header will occu
27b10 72 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2e  r, if it exists.
27b20 20 61 4d 61 67 69 63 20 69 73 20 75 73 65 64 20   aMagic is used 
27b30 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 61  .        ** as a
27b40 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65   temporary buffe
27b50 72 20 74 6f 20 69 6e 73 70 65 63 74 20 74 68 65  r to inspect the
27b60 20 66 69 72 73 74 20 63 6f 75 70 6c 65 20 6f 66   first couple of
27b70 20 62 79 74 65 73 20 6f 66 0a 20 20 20 20 20 20   bytes of.      
27b80 20 20 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74 69    ** the potenti
27b90 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  al journal heade
27ba0 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  r..        */.  
27bb0 20 20 20 20 20 20 69 36 34 20 69 4e 65 78 74 48        i64 iNextH
27bc0 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  drOffset;.      
27bd0 20 20 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a    u8 aMagic[8];.
27be0 20 20 20 20 20 20 20 20 75 38 20 7a 48 65 61 64          u8 zHead
27bf0 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
27c00 61 6c 4d 61 67 69 63 29 2b 34 5d 3b 0a 0a 20 20  alMagic)+4];..  
27c10 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65        memcpy(zHe
27c20 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  ader, aJournalMa
27c30 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
27c40 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20  rnalMagic));.   
27c50 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26       put32bits(&
27c60 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
27c70 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
27c80 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a  pPager->nRec);..
27c90 20 20 20 20 20 20 20 20 69 4e 65 78 74 48 64 72          iNextHdr
27ca0 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c  Offset = journal
27cb0 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72  HdrOffset(pPager
27cc0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
27cd0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
27ce0 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
27cf0 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72 4f 66  c, 8, iNextHdrOf
27d00 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69  fset);.        i
27d10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27d20 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d   && 0==memcmp(aM
27d30 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
27d40 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20  gic, 8) ){.     
27d50 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
27d60 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20  t u8 zerobyte = 
27d70 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
27d80 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
27d90 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a  (pPager->jfd, &z
27da0 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65 78  erobyte, 1, iNex
27db0 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20  tHdrOffset);.   
27dc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
27dd0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27de0 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49   && rc!=SQLITE_I
27df0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
27e00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
27e10 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
27e20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72  }..        /* Wr
27e30 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  ite the nRec val
27e40 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ue into the jour
27e50 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e  nal file header.
27e60 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a   If in.        *
27e70 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f  * full-synchrono
27e80 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68  us mode, sync th
27e90 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e  e journal first.
27ea0 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
27eb0 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  at.        ** al
27ec0 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c  l data has reall
27ed0 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62  y hit the disk b
27ee0 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70  efore nRec is up
27ef0 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20  dated to mark.  
27f00 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61        ** it as a
27f10 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72   candidate for r
27f20 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ollback..       
27f30 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
27f40 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
27f50 72 65 64 20 69 66 20 74 68 65 20 70 65 72 73 69  red if the persi
27f60 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70  stent media supp
27f70 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20 20 20  orts the.       
27f80 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20   ** SAFE_APPEND 
27f90 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73  property. Becaus
27fa0 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69  e in this case i
27fb0 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
27fc0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  e .        ** fo
27fd0 72 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  r garbage data t
27fe0 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f  o be appended to
27ff0 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e   the file, the n
28000 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20  Rec field.      
28010 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65    ** is populate
28020 64 20 77 69 74 68 20 30 78 46 46 46 46 46 46 46  d with 0xFFFFFFF
28030 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  F when the journ
28040 61 6c 20 68 65 61 64 65 72 20 69 73 20 77 72 69  al header is wri
28050 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tten.        ** 
28060 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20  and never needs 
28070 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20  to be updated.. 
28080 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
28090 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
280a0 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44  llSync && 0==(iD
280b0 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
280c0 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
280d0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
280e0 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
280f0 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
28100 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
28110 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45           IOTRACE
28120 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20  (("JSYNC %p\n", 
28130 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20  pPager)).       
28140 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
28150 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
28160 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46  d, pPager->syncF
28170 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20  lags);.         
28180 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28190 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
281a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
281b0 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
281c0 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61   %p %lld\n", pPa
281d0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
281e0 72 6e 61 6c 48 64 72 29 29 3b 0a 20 20 20 20 20  rnalHdr));.     
281f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
28200 73 57 72 69 74 65 28 0a 20 20 20 20 20 20 20 20  sWrite(.        
28210 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c      pPager->jfd,
28220 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66   zHeader, sizeof
28230 28 7a 48 65 61 64 65 72 29 2c 20 70 50 61 67 65  (zHeader), pPage
28240 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20 20  r->journalHdr.  
28250 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
28260 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28270 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
28280 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
28290 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
282a0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
282b0 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41  L) ){.        PA
282c0 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20  GERTRACE(("SYNC 
282d0 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
282e0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
282f0 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54  )));.        IOT
28300 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
28310 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
28320 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
28330 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
28340 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
28350 63 46 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20  cFlags| .       
28360 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63     (pPager->sync
28370 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59  Flags==SQLITE_SY
28380 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53  NC_FULL?SQLITE_S
28390 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a  YNC_DATAONLY:0).
283a0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
283b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
283c0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
283d0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
283e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
283f0 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Hdr = pPager->jo
28400 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20  urnalOff;.      
28410 69 66 28 20 6e 65 77 48 64 72 20 26 26 20 30 3d  if( newHdr && 0=
28420 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
28430 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
28440 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
28450 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
28460 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
28470 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
28480 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
28490 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
284a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
284b0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
284c0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
284d0 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
284e0 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
284f0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 65  }.  }..  /* Unle
28500 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ss the pager is 
28510 69 6e 20 6e 6f 53 79 6e 63 20 6d 6f 64 65 2c 20  in noSync mode, 
28520 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
28530 20 77 61 73 20 6a 75 73 74 20 0a 20 20 2a 2a 20   was just .  ** 
28540 73 75 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e  successfully syn
28550 63 65 64 2e 20 45 69 74 68 65 72 20 77 61 79 2c  ced. Either way,
28560 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44 52   clear the PGHDR
28570 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
28580 6f 6e 20 0a 20 20 2a 2a 20 61 6c 6c 20 70 61 67  on .  ** all pag
28590 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  es..  */.  sqlit
285a0 65 33 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e  e3PcacheClearSyn
285b0 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70  cFlags(pPager->p
285c0 50 43 61 63 68 65 29 3b 0a 20 20 70 50 61 67 65  PCache);.  pPage
285d0 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45  r->eState = PAGE
285e0 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 3b 0a  R_WRITER_DBMOD;.
285f0 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
28600 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
28610 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ger) );.  return
28620 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
28630 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
28640 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69  t is the first i
28650 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  n a linked list 
28660 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20 63  of dirty pages c
28670 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79 20 74  onnected.** by t
28680 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20  he PgHdr.pDirty 
28690 70 6f 69 6e 74 65 72 2e 20 54 68 69 73 20 66 75  pointer. This fu
286a0 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20 65 61  nction writes ea
286b0 63 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a  ch one of the.**
286c0 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
286d0 20 69 6e 20 74 68 65 20 6c 69 73 74 20 74 6f 20   in the list to 
286e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
286f0 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  e. The argument 
28700 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20  may.** be NULL, 
28710 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20  representing an 
28720 65 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e 20 74  empty list. In t
28730 68 69 73 20 63 61 73 65 20 74 68 69 73 20 66 75  his case this fu
28740 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e  nction is.** a n
28750 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
28760 70 61 67 65 72 20 6d 75 73 74 20 68 6f 6c 64 20  pager must hold 
28770 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52  at least a RESER
28780 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68  VED lock when th
28790 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
287a0 73 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65  s called. Before
287b0 20 77 72 69 74 69 6e 67 20 61 6e 79 74 68 69 6e   writing anythin
287c0 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
287d0 65 20 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63  e file, this loc
287e0 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61 64 65 64  k.** is upgraded
287f0 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45   to an EXCLUSIVE
28800 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f   lock. If the lo
28810 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74  ck cannot be obt
28820 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  ained,.** SQLITE
28830 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
28840 64 20 61 6e 64 20 6e 6f 20 64 61 74 61 20 69 73  d and no data is
28850 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
28860 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
28870 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  * .** If the pag
28880 65 72 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c  er is a temp-fil
28890 65 20 70 61 67 65 72 20 61 6e 64 20 74 68 65 20  e pager and the 
288a0 61 63 74 75 61 6c 20 66 69 6c 65 2d 73 79 73 74  actual file-syst
288b0 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f  em file.** is no
288c0 74 20 79 65 74 20 6f 70 65 6e 2c 20 69 74 20 69  t yet open, it i
288d0 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6f 70  s created and op
288e0 65 6e 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  ened before any 
288f0 64 61 74 61 20 69 73 20 0a 2a 2a 20 77 72 69 74  data is .** writ
28900 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f  ten out..**.** O
28910 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73  nce the lock has
28920 20 62 65 65 6e 20 75 70 67 72 61 64 65 64 20 61   been upgraded a
28930 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
28940 2c 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  , the file opene
28950 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 73 20  d,.** the pages 
28960 61 72 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20  are written out 
28970 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
28980 66 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f 72 64  file in list ord
28990 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61  er. Writing.** a
289a0 20 70 61 67 65 20 69 73 20 73 6b 69 70 70 65 64   page is skipped
289b0 20 69 66 20 69 74 20 6d 65 65 74 73 20 65 69 74   if it meets eit
289c0 68 65 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  her of the follo
289d0 77 69 6e 67 20 63 72 69 74 65 72 69 61 3a 0a 2a  wing criteria:.*
289e0 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67  *.**   * The pag
289f0 65 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61  e number is grea
28a00 74 65 72 20 74 68 61 6e 20 50 61 67 65 72 2e 64  ter than Pager.d
28a10 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a  bSize, or.**   *
28a20 20 54 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f   The PGHDR_DONT_
28a30 57 52 49 54 45 20 66 6c 61 67 20 69 73 20 73 65  WRITE flag is se
28a40 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  t on the page..*
28a50 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e 67 20  *.** If writing 
28a60 6f 75 74 20 61 20 70 61 67 65 20 63 61 75 73 65  out a page cause
28a70 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
28a80 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50 61 67  ile to grow, Pag
28a90 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a  er.dbFileSize.**
28aa0 20 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f   is updated acco
28ab0 72 64 69 6e 67 6c 79 2e 20 49 66 20 70 61 67 65  rdingly. If page
28ac0 20 31 20 69 73 20 77 72 69 74 74 65 6e 20 6f 75   1 is written ou
28ad0 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  t, then the valu
28ae0 65 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50  e cached.** in P
28af0 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b  ager.dbFileVers[
28b00 5d 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  ] is updated to 
28b10 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 76 61  match the new va
28b20 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  lue stored in.**
28b30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
28b40 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  le..**.** If eve
28b50 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
28b60 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
28b70 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
28b80 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a   an IO error .**
28b90 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65   occurs, an IO e
28ba0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
28bb0 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68  urned. Or, if th
28bc0 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  e EXCLUSIVE lock
28bd0 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62   cannot.** be ob
28be0 74 61 69 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42  tained, SQLITE_B
28bf0 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e  USY is returned.
28c00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
28c10 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
28c20 69 73 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  ist(Pager *pPage
28c30 72 2c 20 50 67 48 64 72 20 2a 70 4c 69 73 74 29  r, PgHdr *pList)
28c40 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
28c50 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
28c60 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
28c70 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
28c80 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
28c90 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f  s only called fo
28ca0 72 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 72  r rollback pager
28cb0 73 20 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f  s in WRITER_DBMO
28cc0 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 61 73  D state. */.  as
28cd0 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
28ce0 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
28cf0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
28d00 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
28d10 49 54 45 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20  ITER_DBMOD );.  
28d20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
28d30 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
28d40 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49  _LOCK );..  /* I
28d50 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 61 20  f the file is a 
28d60 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f  temp-file has no
28d70 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65  t yet been opene
28d80 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20  d, open it now. 
28d90 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70  It.  ** is not p
28da0 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74  ossible for rc t
28db0 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20  o be other than 
28dc0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69  SQLITE_OK if thi
28dd0 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73  s branch.  ** is
28de0 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72   taken, as pager
28df0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20  _wait_on_lock() 
28e00 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74  is a no-op for t
28e10 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a  emp-files..  */.
28e20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
28e30 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
28e40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
28e50 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d  >tempFile && rc=
28e60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
28e70 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
28e80 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61  temp(pPager, pPa
28e90 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
28ea0 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a  >vfsFlags);.  }.
28eb0 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 68 65  .  /* Before the
28ec0 20 66 69 72 73 74 20 77 72 69 74 65 2c 20 67 69   first write, gi
28ed0 76 65 20 74 68 65 20 56 46 53 20 61 20 68 69 6e  ve the VFS a hin
28ee0 74 20 6f 66 20 77 68 61 74 20 74 68 65 20 66 69  t of what the fi
28ef0 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69  nal.  ** file si
28f00 7a 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f  ze will be..  */
28f10 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
28f20 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
28f30 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
28f40 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
28f50 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 28 70 4c  TE_OK .   && (pL
28f60 69 73 74 2d 3e 70 44 69 72 74 79 20 3f 20 70 50  ist->pDirty ? pP
28f70 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3a 20 70  ager->dbSize : p
28f80 4c 69 73 74 2d 3e 70 67 6e 6f 2b 31 29 3e 70 50  List->pgno+1)>pP
28f90 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
28fa0 20 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   .  ){.    sqlit
28fb0 65 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20  e3_int64 szFile 
28fc0 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
28fd0 7a 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e  ze * (sqlite3_in
28fe0 74 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69  t64)pPager->dbSi
28ff0 7a 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  ze;.    sqlite3O
29000 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
29010 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
29020 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48  ITE_FCNTL_SIZE_H
29030 49 4e 54 2c 20 26 73 7a 46 69 6c 65 29 3b 0a 20  INT, &szFile);. 
29040 20 20 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e     pPager->dbHin
29050 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  tSize = pPager->
29060 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 77  dbSize;.  }..  w
29070 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
29080 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a  _OK && pList ){.
29090 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20      Pgno pgno = 
290a0 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20  pList->pgno;..  
290b0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
290c0 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e  e dirty pages in
290d0 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
290e0 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
290f0 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a  s greater.    **
29100 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69   than Pager.dbSi
29110 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73  ze, this means s
29120 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
29130 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20 63  ateImage() was c
29140 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  alled to.    ** 
29150 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d  make the file sm
29160 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c  aller (presumabl
29170 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  y by auto-vacuum
29180 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77   code). Do not w
29190 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20  rite.    ** any 
291a0 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68  such pages to th
291b0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
291c0 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e     ** Also, do n
291d0 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79  ot write out any
291e0 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 74   page that has t
291f0 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  he PGHDR_DONT_WR
29200 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20  ITE flag.    ** 
29210 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c 69  set (set by sqli
29220 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
29230 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  e())..    */.   
29240 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65   if( pgno<=pPage
29250 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d  r->dbSize && 0==
29260 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47  (pList->flags&PG
29270 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20  HDR_DONT_WRITE) 
29280 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  ){.      i64 off
29290 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
292a0 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
292b0 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66 73 65  Size;   /* Offse
292c0 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  t to write */.  
292d0 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 3b      char *pData;
292e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29300 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72     /* Data to wr
29310 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20 20 20  ite */    ..    
29320 20 20 61 73 73 65 72 74 28 20 28 70 4c 69 73 74    assert( (pList
29330 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
29340 45 44 5f 53 59 4e 43 29 3d 3d 30 20 29 3b 0a 20  ED_SYNC)==0 );. 
29350 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e       if( pList->
29360 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65 72 5f  pgno==1 ) pager_
29370 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e  write_changecoun
29380 74 65 72 28 70 4c 69 73 74 29 3b 0a 0a 20 20 20  ter(pList);..   
29390 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68 65     /* Encode the
293a0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
293b0 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
293c0 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20  , pList->pData, 
293d0 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e 20  pgno, 6, return 
293e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44  SQLITE_NOMEM, pD
293f0 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ata);..      /* 
29400 57 72 69 74 65 20 6f 75 74 20 74 68 65 20 70 61  Write out the pa
29410 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20  ge data. */.    
29420 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
29430 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
29440 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
29450 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
29460 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  t);..      /* If
29470 20 70 61 67 65 20 31 20 77 61 73 20 6a 75 73 74   page 1 was just
29480 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65   written, update
29490 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
294a0 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20  s to match.     
294b0 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f   ** the value no
294c0 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  w stored in the 
294d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
294e0 66 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a  f writing this .
294f0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61        ** page ca
29500 75 73 65 64 20 74 68 65 20 64 61 74 61 62 61 73  used the databas
29510 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20  e file to grow, 
29520 75 70 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a  update dbFileSiz
29530 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  e. .      */.   
29540 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29     if( pgno==1 )
29550 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
29560 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
29570 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d  Vers, &pData[24]
29580 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
29590 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
295a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
295b0 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62   pgno>pPager->db
295c0 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  FileSize ){.    
295d0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
295e0 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
295f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
29600 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52  ger->aStat[PAGER
29610 5f 53 54 41 54 5f 57 52 49 54 45 5d 2b 2b 3b 0a  _STAT_WRITE]++;.
29620 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  .      /* Update
29630 20 61 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65   any backup obje
29640 63 74 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20  cts copying the 
29650 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73  contents of this
29660 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20   pager. */.     
29670 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
29680 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
29690 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a  ckup, pgno, (u8*
296a0 29 70 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a  )pList->pData);.
296b0 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
296c0 45 28 28 22 53 54 4f 52 45 20 25 64 20 70 61 67  E(("STORE %d pag
296d0 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  e %d hash(%08x)\
296e0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
296f0 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
29700 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61  Pager), pgno, pa
29710 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69  ger_pagehash(pLi
29720 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54  st)));.      IOT
29730 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20  RACE(("PGOUT %p 
29740 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
29750 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47  gno));.      PAG
29760 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
29770 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f  pager_writedb_co
29780 75 6e 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  unt);.    }else{
29790 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
297a0 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70  E(("NOSTORE %d p
297b0 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
297c0 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
297d0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  ));.    }.    pa
297e0 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
297f0 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 4c 69  (pList);.    pLi
29800 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  st = pList->pDir
29810 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ty;.  }..  retur
29820 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
29830 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73  nsure that the s
29840 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
29850 69 73 20 6f 70 65 6e 2e 20 49 66 20 69 74 20 69  is open. If it i
29860 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  s already open, 
29870 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
29880 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
29890 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
298a0 20 72 65 74 75 72 6e 65 64 20 69 66 20 65 76 65   returned if eve
298b0 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63  rything goes acc
298c0 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20  ording to plan. 
298d0 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f  An .** SQLITE_IO
298e0 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f  ERR_XXX error co
298f0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  de is returned i
29900 66 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  f a call to sqli
29910 74 65 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a 20  te3OsOpen() .** 
29920 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
29930 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72   int openSubJour
29940 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
29950 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
29960 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
29970 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
29980 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28  sjfd) ){.    if(
29990 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
299a0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
299b0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c  NALMODE_MEMORY |
299c0 7c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e  | pPager->subjIn
299d0 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20  Memory ){.      
299e0 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
299f0 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  lOpen(pPager->sj
29a00 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  fd);.    }else{.
29a10 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
29a20 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c  Opentemp(pPager,
29a30 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53   pPager->sjfd, S
29a40 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
29a50 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  URNAL);.    }.  
29a60 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
29a70 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
29a80 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63   record of the c
29a90 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
29aa0 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20  page pPg to the 
29ab0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a  sub-journal. .**
29ac0 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65   It is the calle
29ad0 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  rs responsibilit
29ae0 79 20 74 6f 20 75 73 65 20 73 75 62 6a 52 65 71  y to use subjReq
29af0 75 69 72 65 73 50 61 67 65 28 29 20 74 6f 20 63  uiresPage() to c
29b00 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69 74  heck .** that it
29b10 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71 75 69   is really requi
29b20 72 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  red before calli
29b30 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
29b40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
29b50 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62  ssful, set the b
29b60 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
29b70 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e   to pPg->pgno in
29b80 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20   the bitvecs.** 
29b90 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76  for all open sav
29ba0 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72  epoints before r
29bb0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
29bc0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
29bd0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20  turns SQLITE_OK 
29be0 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
29bf0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20   successful, an 
29c00 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  IO.** error code
29c10 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   if the attempt 
29c20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
29c30 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c  sub-journal fail
29c40 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45  s, or .** SQLITE
29c50 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c  _NOMEM if a mall
29c60 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73  oc fails while s
29c70 65 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20  etting a bit in 
29c80 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62  a savepoint.** b
29c90 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  itvec..*/.static
29ca0 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50   int subjournalP
29cb0 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
29cc0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
29cd0 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
29ce0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
29cf0 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67  ager;.  if( pPag
29d00 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
29d10 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
29d20 44 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f  DE_OFF ){..    /
29d30 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a  * Open the sub-j
29d40 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 68 61  ournal, if it ha
29d50 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  s not already be
29d60 65 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20  en opened */.   
29d70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
29d80 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
29d90 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65     assert( isOpe
29da0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
29db0 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  | pagerUseWal(pP
29dc0 61 67 65 72 29 20 29 3b 0a 20 20 20 20 61 73 73  ager) );.    ass
29dd0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
29de0 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61  er->sjfd) || pPa
29df0 67 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20  ger->nSubRec==0 
29e00 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
29e10 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
29e20 72 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  r) .         || 
29e30 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
29e40 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  g) .         || 
29e50 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
29e60 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a 20 20  ->dbOrigSize .  
29e70 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 70    );.    rc = op
29e80 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61  enSubJournal(pPa
29e90 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ger);..    /* If
29ea0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
29eb0 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75 63 63   was opened succ
29ec0 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77 61 73  essfully (or was
29ed0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 0a   already open),.
29ee0 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74 68 65      ** write the
29ef0 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
29f00 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20  into the file.  
29f10 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
29f20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29f30 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20    void *pData = 
29f40 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20  pPg->pData;.    
29f50 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28    i64 offset = (
29f60 69 36 34 29 70 50 61 67 65 72 2d 3e 6e 53 75 62  i64)pPager->nSub
29f70 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70  Rec*(4+pPager->p
29f80 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
29f90 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20  char *pData2;.  
29fa0 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50  .      CODEC2(pP
29fb0 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
29fc0 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72  ->pgno, 7, retur
29fd0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  n SQLITE_NOMEM, 
29fe0 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 50  pData2);.      P
29ff0 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4d 54  AGERTRACE(("STMT
2a000 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  -JOURNAL %d page
2a010 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
2a020 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
2a030 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  no));.      rc =
2a040 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
2a050 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65  ger->sjfd, offse
2a060 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  t, pPg->pgno);. 
2a070 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2a080 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2a090 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2a0a0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 6a  Write(pPager->sj
2a0b0 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67  fd, pData2, pPag
2a0c0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
2a0d0 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d  fset+4);.      }
2a0e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2a0f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2a100 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53  {.    pPager->nS
2a110 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73  ubRec++;.    ass
2a120 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61  ert( pPager->nSa
2a130 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20  vepoint>0 );.   
2a140 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70   rc = addToSavep
2a150 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
2a160 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  er, pPg->pgno);.
2a170 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2a180 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2a190 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2a1a0 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65 20  d by the pcache 
2a1b0 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68 61  layer when it ha
2a1c0 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a  s reached some.*
2a1d0 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69  * soft memory li
2a1e0 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74 20 61  mit. The first a
2a1f0 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
2a200 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20  nter to a Pager 
2a210 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20  object.** (cast 
2a220 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65  as a void*). The
2a230 20 70 61 67 65 72 20 69 73 20 61 6c 77 61 79 73   pager is always
2a240 20 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f   'purgeable' (no
2a250 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  t an in-memory.*
2a260 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54 68 65  * database). The
2a270 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
2a280 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20   is a reference 
2a290 74 6f 20 61 20 70 61 67 65 20 74 68 61 74 20 69  to a page that i
2a2a0 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  s .** currently 
2a2b0 64 69 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f  dirty but has no
2a2c0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
2a2d0 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67  erences. The pag
2a2e0 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61  e.** is always a
2a2f0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
2a300 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
2a310 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
2a320 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  rst .** argument
2a330 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20  ..**.** The job 
2a340 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
2a350 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20   is to make pPg 
2a360 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67  clean by writing
2a370 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   its contents.**
2a380 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
2a390 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f  base file, if po
2a3a0 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79  ssible. This may
2a3b0 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67   involve syncing
2a3c0 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
2a3d0 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
2a3e0 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69  successful, sqli
2a3f0 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
2a400 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  an() is called o
2a410 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a  n the page and.*
2a420 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
2a430 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
2a440 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
2a450 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65  e trying to make
2a460 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65   the.** page cle
2a470 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  an, the IO error
2a480 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2a490 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 63  d. If the page c
2a4a0 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65  annot be.** made
2a4b0 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20   clean for some 
2a4c0 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75  other reason, bu
2a4d0 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
2a4e0 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  s, then SQLITE_O
2a4f0 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
2a500 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68   by sqlite3Pcach
2a510 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20  eMakeClean() is 
2a520 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73  not called..*/.s
2a530 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
2a540 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50  tress(void *p, P
2a550 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
2a560 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50  ger *pPager = (P
2a570 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20  ager *)p;.  int 
2a580 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2a590 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
2a5a0 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29  pPager==pPager )
2a5b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
2a5c0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
2a5d0 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  TY );..  /* The 
2a5e0 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 66  doNotSyncSpill f
2a5f0 6c 61 67 20 69 73 20 73 65 74 20 64 75 72 69 6e  lag is set durin
2a600 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64 6f 69  g times when doi
2a610 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20 20 2a  ng a sync of.  *
2a620 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61  * journal (and a
2a630 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65 61 64  dding a new head
2a640 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  er) is not allow
2a650 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75 72 73  ed.  This occurs
2a660 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63 61 6c  .  ** during cal
2a670 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ls to sqlite3Pag
2a680 65 72 57 72 69 74 65 28 29 20 77 68 69 6c 65 20  erWrite() while 
2a690 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72 6e 61  trying to journa
2a6a0 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a 2a 20  l multiple.  ** 
2a6b0 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e 67 20  pages belonging 
2a6c0 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65 63 74  to the same sect
2a6d0 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  or..  **.  ** Th
2a6e0 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 66 6c 61  e doNotSpill fla
2a6f0 67 20 69 6e 68 69 62 69 74 73 20 61 6c 6c 20 63  g inhibits all c
2a700 61 63 68 65 20 73 70 69 6c 6c 69 6e 67 20 72 65  ache spilling re
2a710 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
2a720 68 65 72 0a 20 20 2a 2a 20 6f 72 20 6e 6f 74 20  her.  ** or not 
2a730 61 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72  a sync is requir
2a740 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 65 74  ed.  This is set
2a750 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
2a760 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70  ck..  **.  ** Sp
2a770 69 6c 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20 70  illing is also p
2a780 72 6f 68 69 62 69 74 65 64 20 77 68 65 6e 20 69  rohibited when i
2a790 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
2a7a0 20 73 69 6e 63 65 20 74 68 61 74 20 63 6f 75 6c   since that coul
2a7b0 64 0a 20 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64  d.  ** lead to d
2a7c0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
2a7d0 6f 6e 2e 20 20 20 49 6e 20 74 68 65 20 63 75 72  on.   In the cur
2a7e0 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
2a7f0 6f 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73 20 69  on it .  ** is i
2a800 6d 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 73 71  mpossible for sq
2a810 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
2a820 28 29 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  () to be called 
2a830 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d  with createFlag=
2a840 3d 31 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e  =1.  ** while in
2a850 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2a860 2c 20 68 65 6e 63 65 20 69 74 20 69 73 20 69 6d  , hence it is im
2a870 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69  possible for thi
2a880 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a  s routine to.  *
2a890 2a 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20 74  * be called in t
2a8a0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20  he error state. 
2a8b0 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 77   Nevertheless, w
2a8c0 65 20 69 6e 63 6c 75 64 65 20 61 20 4e 45 56 45  e include a NEVE
2a8d0 52 28 29 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f  R().  ** test fo
2a8e0 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
2a8f0 65 20 61 73 20 61 20 73 61 66 65 67 75 61 72 64  e as a safeguard
2a900 20 61 67 61 69 6e 73 74 20 66 75 74 75 72 65 20   against future 
2a910 63 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20  changes..  */.  
2a920 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72  if( NEVER(pPager
2a930 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74  ->errCode) ) ret
2a940 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2a950 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e   if( pPager->doN
2a960 6f 74 53 70 69 6c 6c 20 29 20 72 65 74 75 72 6e  otSpill ) return
2a970 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
2a980 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
2a990 79 6e 63 53 70 69 6c 6c 20 26 26 20 28 70 50 67  yncSpill && (pPg
2a9a0 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f  ->flags & PGHDR_
2a9b0 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 20 29 7b  NEED_SYNC)!=0 ){
2a9c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2a9d0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 50  TE_OK;.  }..  pP
2a9e0 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  g->pDirty = 0;. 
2a9f0 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
2aa00 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
2aa10 2f 2a 20 57 72 69 74 65 20 61 20 73 69 6e 67 6c  /* Write a singl
2aa20 65 20 66 72 61 6d 65 20 66 6f 72 20 74 68 69 73  e frame for this
2aa30 20 70 61 67 65 20 74 6f 20 74 68 65 20 6c 6f 67   page to the log
2aa40 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75 62  . */.    if( sub
2aa50 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
2aa60 67 29 20 29 7b 20 0a 20 20 20 20 20 20 72 63 20  g) ){ .      rc 
2aa70 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  = subjournalPage
2aa80 28 70 50 67 29 3b 20 0a 20 20 20 20 7d 0a 20 20  (pPg); .    }.  
2aa90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2aaa0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
2aab0 3d 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73  = pagerWalFrames
2aac0 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20 30 2c  (pPager, pPg, 0,
2aad0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   0);.    }.  }el
2aae0 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 53 79  se{.  .    /* Sy
2aaf0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
2ab00 69 6c 65 20 69 66 20 72 65 71 75 69 72 65 64 2e  ile if required.
2ab10 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 2d   */.    if( pPg-
2ab20 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
2ab30 44 5f 53 59 4e 43 20 0a 20 20 20 20 20 7c 7c 20  D_SYNC .     || 
2ab40 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
2ab50 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
2ab60 48 45 4d 4f 44 0a 20 20 20 20 29 7b 0a 20 20 20  HEMOD.    ){.   
2ab70 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72     rc = syncJour
2ab80 6e 61 6c 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  nal(pPager, 1);.
2ab90 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
2aba0 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  If the page numb
2abb0 65 72 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  er of this page 
2abc0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
2abd0 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
2abe0 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  of.    ** the da
2abf0 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 74  tabase image, it
2ac00 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20   may need to be 
2ac10 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73  written to the s
2ac20 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  ub-journal..    
2ac30 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61 75  ** This is becau
2ac40 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 70  se the call to p
2ac50 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
2ac60 69 73 74 28 29 20 62 65 6c 6f 77 20 77 69 6c 6c  ist() below will
2ac70 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 63 74 75   not.    ** actu
2ac80 61 6c 6c 79 20 77 72 69 74 65 20 64 61 74 61 20  ally write data 
2ac90 74 6f 20 74 68 65 20 66 69 6c 65 20 69 6e 20 74  to the file in t
2aca0 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 2a 2a  his case..    **
2acb0 0a 20 20 20 20 2a 2a 20 43 6f 6e 73 69 64 65 72  .    ** Consider
2acc0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2acd0 65 71 75 65 6e 63 65 20 6f 66 20 65 76 65 6e 74  equence of event
2ace0 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
2acf0 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 2a 2a     BEGIN;.    **
2ad00 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61       <journal pa
2ad10 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20 20 20 20  ge X>.    **    
2ad20 20 3c 6d 6f 64 69 66 79 20 70 61 67 65 20 58 3e   <modify page X>
2ad30 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 41 56 45  .    **     SAVE
2ad40 50 4f 49 4e 54 20 73 70 3b 0a 20 20 20 20 2a 2a  POINT sp;.    **
2ad50 20 20 20 20 20 20 20 3c 73 68 72 69 6e 6b 20 64         <shrink d
2ad60 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
2ad70 59 20 70 61 67 65 73 3e 0a 20 20 20 20 2a 2a 20  Y pages>.    ** 
2ad80 20 20 20 20 20 20 70 61 67 65 72 53 74 72 65 73        pagerStres
2ad90 73 28 70 61 67 65 20 58 29 0a 20 20 20 20 2a 2a  s(page X).    **
2ada0 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f       ROLLBACK TO
2adb0 20 73 70 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20   sp;.    **.    
2adc0 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68 65  ** If (X>Y), the
2add0 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74 72 65  n when pagerStre
2ade0 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61 67  ss is called pag
2adf0 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  e X will not be 
2ae00 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 6f  written.    ** o
2ae10 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
2ae20 73 65 20 66 69 6c 65 2c 20 62 75 74 20 77 69 6c  se file, but wil
2ae30 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f  l be dropped fro
2ae40 6d 20 74 68 65 20 63 61 63 68 65 2e 20 54 68 65  m the cache. The
2ae50 6e 2c 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77  n,.    ** follow
2ae60 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c 42 41 43  ing the "ROLLBAC
2ae70 4b 20 54 4f 20 73 70 22 20 73 74 61 74 65 6d 65  K TO sp" stateme
2ae80 6e 74 2c 20 72 65 61 64 69 6e 67 20 70 61 67 65  nt, reading page
2ae90 20 58 20 77 69 6c 6c 20 72 65 61 64 0a 20 20 20   X will read.   
2aea0 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68   ** data from th
2aeb0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2aec0 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68   This will be th
2aed0 65 20 63 6f 70 79 20 6f 66 20 70 61 67 65 20 58  e copy of page X
2aee0 20 61 73 20 69 74 0a 20 20 20 20 2a 2a 20 77 61   as it.    ** wa
2aef0 73 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  s when the trans
2af00 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20  action started, 
2af10 6e 6f 74 20 61 73 20 69 74 20 77 61 73 20 77 68  not as it was wh
2af20 65 6e 20 22 53 41 56 45 50 4f 49 4e 54 20 73 70  en "SAVEPOINT sp
2af30 22 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 78 65  ".    ** was exe
2af40 63 75 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  cuted..    **.  
2af50 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f    ** The solutio
2af60 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20 74 68  n is to write th
2af70 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 20 66  e current data f
2af80 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f 20 74  or page X into t
2af90 68 65 20 0a 20 20 20 20 2a 2a 20 73 75 62 2d 6a  he .    ** sub-j
2afa0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20  ournal file now 
2afb0 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
2afc0 72 65 61 64 79 20 74 68 65 72 65 29 2c 20 73 6f  ready there), so
2afd0 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20 20   that it will.  
2afe0 20 20 2a 2a 20 62 65 20 72 65 73 74 6f 72 65 64    ** be restored
2aff0 20 74 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20   to its current 
2b000 76 61 6c 75 65 20 77 68 65 6e 20 74 68 65 20 22  value when the "
2b010 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20  ROLLBACK TO sp" 
2b020 69 73 20 0a 20 20 20 20 2a 2a 20 65 78 65 63 75  is .    ** execu
2b030 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
2b040 69 66 28 20 4e 45 56 45 52 28 0a 20 20 20 20 20  if( NEVER(.     
2b050 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
2b060 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50   && pPg->pgno>pP
2b070 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20  ager->dbSize && 
2b080 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
2b090 28 70 50 67 29 0a 20 20 20 20 29 20 29 7b 0a 20  (pPg).    ) ){. 
2b0a0 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75       rc = subjou
2b0b0 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20  rnalPage(pPg);. 
2b0c0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57     }.  .    /* W
2b0d0 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  rite the content
2b0e0 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75  s of the page ou
2b0f0 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
2b100 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  e file. */.    i
2b110 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2b120 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2b130 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  ( (pPg->flags&PG
2b140 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d  HDR_NEED_SYNC)==
2b150 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
2b160 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
2b170 6c 69 73 74 28 70 50 61 67 65 72 2c 20 70 50 67  list(pPager, pPg
2b180 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
2b190 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  /* Mark the page
2b1a0 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20   as clean. */.  
2b1b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b1c0 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52  K ){.    PAGERTR
2b1d0 41 43 45 28 28 22 53 54 52 45 53 53 20 25 64 20  ACE(("STRESS %d 
2b1e0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
2b1f0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
2b200 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71  ->pgno));.    sq
2b210 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
2b220 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a  lean(pPg);.  }..
2b230 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
2b240 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
2b250 3b 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  ; .}.../*.** All
2b260 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
2b270 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72  lize a new Pager
2b280 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20   object and put 
2b290 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a  a pointer to it.
2b2a0 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20  ** in *ppPager. 
2b2b0 54 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  The pager should
2b2c0 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66   eventually be f
2b2d0 72 65 65 64 20 62 79 20 70 61 73 73 69 6e 67 20  reed by passing 
2b2e0 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  it.** to sqlite3
2b2f0 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a  PagerClose()..**
2b300 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d  .** The zFilenam
2b310 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
2b320 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 64 61  e path to the da
2b330 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
2b340 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  pen..** If zFile
2b350 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65  name is NULL the
2b360 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d  n a randomly-nam
2b370 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ed temporary fil
2b380 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
2b390 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20  and used as the 
2b3a0 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65  file to be cache
2b3b0 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c  d. Temporary fil
2b3c0 65 73 20 61 72 65 20 62 65 20 64 65 6c 65 74 65  es are be delete
2b3d0 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  d.** automatical
2b3e0 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  ly when they are
2b3f0 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c   closed. If zFil
2b400 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72  ename is ":memor
2b410 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c  y:" then .** all
2b420 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
2b430 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49  held in cache. I
2b440 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
2b450 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20  en to disk. .** 
2b460 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
2b470 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e   to implement an
2b480 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
2b490 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ase..**.** The n
2b4a0 45 78 74 72 61 20 70 61 72 61 6d 65 74 65 72 20  Extra parameter 
2b4b0 73 70 65 63 69 66 69 65 73 20 74 68 65 20 6e 75  specifies the nu
2b4c0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
2b4d0 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
2b4e0 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65  .** along with e
2b4f0 61 63 68 20 70 61 67 65 20 72 65 66 65 72 65 6e  ach page referen
2b500 63 65 2e 20 54 68 69 73 20 73 70 61 63 65 20 69  ce. This space i
2b510 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  s available to t
2b520 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74  he user.** via t
2b530 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  he sqlite3PagerG
2b540 65 74 45 78 74 72 61 28 29 20 41 50 49 2e 0a 2a  etExtra() API..*
2b550 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61  *.** The flags a
2b560 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20  rgument is used 
2b570 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70 65  to specify prope
2b580 72 74 69 65 73 20 74 68 61 74 20 61 66 66 65 63  rties that affec
2b590 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69  t the.** operati
2b5a0 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e  on of the pager.
2b5b0 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61   It should be pa
2b5c0 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73  ssed some bitwis
2b5d0 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a  e combination.**
2b5e0 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 2a 20   of the PAGER_* 
2b5f0 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  flags..**.** The
2b600 20 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65   vfsFlags parame
2b610 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b  ter is a bitmask
2b620 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20   to pass to the 
2b630 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a  flags parameter.
2b640 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28  ** of the xOpen(
2b650 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20  ) method of the 
2b660 73 75 70 70 6c 69 65 64 20 56 46 53 20 77 68 65  supplied VFS whe
2b670 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e  n opening files.
2b680 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
2b690 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61  ager object is a
2b6a0 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
2b6b0 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20   specified file 
2b6c0 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65  opened .** succe
2b6d0 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f  ssfully, SQLITE_
2b6e0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  OK is returned a
2b6f0 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65 74 20  nd *ppPager set 
2b700 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74  to point to.** t
2b710 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a  he new pager obj
2b720 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ect. If an error
2b730 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65   occurs, *ppPage
2b740 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  r is set to NULL
2b750 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f  .** and error co
2b760 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  de returned. Thi
2b770 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72  s function may r
2b780 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2b790 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61  EM.** (sqlite3Ma
2b7a0 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20 74  lloc() is used t
2b7b0 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
2b7c0 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  y), SQLITE_CANTO
2b7d0 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f  PEN or .** vario
2b7e0 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58  us SQLITE_IO_XXX
2b7f0 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20   errors..*/.int 
2b800 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
2b810 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
2b820 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20  *pVfs,       /* 
2b830 54 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65  The virtual file
2b840 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a   system to use *
2b850 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61  /.  Pager **ppPa
2b860 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ger,         /* 
2b870 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20  OUT: Return the 
2b880 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
2b890 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
2b8a0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
2b8b0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2b8c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2b8d0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
2b8e0 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
2b8f0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62        /* Extra b
2b900 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65  ytes append to e
2b910 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
2b920 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ge */.  int flag
2b930 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
2b940 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f   /* flags contro
2b950 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20  lling this file 
2b960 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
2b970 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s,            /*
2b980 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   flags passed th
2b990 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
2b9a0 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
2b9b0 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74    void (*xReinit
2b9c0 29 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46 75  )(DbPage*) /* Fu
2b9d0 6e 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74  nction to reinit
2b9e0 69 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a  ialize pages */.
2b9f0 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20  ){.  u8 *pPtr;. 
2ba00 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
2ba10 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67   0;       /* Pag
2ba20 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c  er object to all
2ba30 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  ocate and return
2ba40 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
2ba50 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f  QLITE_OK;      /
2ba60 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2ba70 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20  .  int tempFile 
2ba80 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
2ba90 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c  rue for temp fil
2baa0 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d  es (incl. in-mem
2bab0 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20  ory files) */.  
2bac0 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20  int memDb = 0;  
2bad0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2bae0 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   if this is an i
2baf0 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  n-memory file */
2bb00 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20  .  int readOnly 
2bb10 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  = 0;        /* T
2bb20 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2bb30 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20   read-only file 
2bb40 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c  */.  int journal
2bb50 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a  FileSize;     /*
2bb60 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61   Bytes to alloca
2bb70 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72  te for each jour
2bb80 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61 72  nal fd */.  char
2bb90 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b   *zPathname = 0;
2bba0 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74       /* Full pat
2bbb0 68 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69  h to database fi
2bbc0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74  le */.  int nPat
2bbd0 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  hname = 0;      
2bbe0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
2bbf0 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65  tes in zPathname
2bc00 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75   */.  int useJou
2bc10 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20  rnal = (flags & 
2bc20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  PAGER_OMIT_JOURN
2bc30 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65  AL)==0; /* False
2bc40 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c   to omit journal
2bc50 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65   */.  int pcache
2bc60 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63  Size = sqlite3Pc
2bc70 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20  acheSize();     
2bc80 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
2bc90 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63 68  locate for PCach
2bca0 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 50 61 67  e */.  u32 szPag
2bcb0 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44  eDflt = SQLITE_D
2bcc0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
2bcd0 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61  ;  /* Default pa
2bce0 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 63 6f 6e  ge size */.  con
2bcf0 73 74 20 63 68 61 72 20 2a 7a 55 72 69 20 3d 20  st char *zUri = 
2bd00 30 3b 20 20 20 20 2f 2a 20 55 52 49 20 61 72 67  0;    /* URI arg
2bd10 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69  s to copy */.  i
2bd20 6e 74 20 6e 55 72 69 20 3d 20 30 3b 20 20 20 20  nt nUri = 0;    
2bd30 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2bd40 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 55 52  r of bytes of UR
2bd50 49 20 61 72 67 73 20 61 74 20 2a 7a 55 72 69 20  I args at *zUri 
2bd60 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
2bd70 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61  out how much spa
2bd80 63 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66  ce is required f
2bd90 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  or each journal 
2bda0 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a  file-handle.  **
2bdb0 20 28 74 68 65 72 65 20 61 72 65 20 74 77 6f 20   (there are two 
2bdc0 6f 66 20 74 68 65 6d 2c 20 74 68 65 20 6d 61 69  of them, the mai
2bdd0 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  n journal and th
2bde0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20  e sub-journal). 
2bdf0 54 68 69 73 0a 20 20 2a 2a 20 69 73 20 74 68 65  This.  ** is the
2be00 20 6d 61 78 69 6d 75 6d 20 73 70 61 63 65 20 72   maximum space r
2be10 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 69  equired for an i
2be20 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
2be30 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20   file handle .  
2be40 2a 2a 20 61 6e 64 20 61 20 72 65 67 75 6c 61 72  ** and a regular
2be50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61   journal file-ha
2be60 6e 64 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74 20  ndle. Note that 
2be70 61 20 22 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e  a "regular journ
2be80 61 6c 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20  al-handle".  ** 
2be90 6d 61 79 20 62 65 20 61 20 77 72 61 70 70 65 72  may be a wrapper
2bea0 20 63 61 70 61 62 6c 65 20 6f 66 20 63 61 63 68   capable of cach
2beb0 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 6f  ing the first po
2bec0 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75  rtion of the jou
2bed0 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69  rnal.  ** file i
2bee0 6e 20 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c  n memory to impl
2bef0 65 6d 65 6e 74 20 74 68 65 20 61 74 6f 6d 69 63  ement the atomic
2bf00 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
2bf10 69 6f 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20 73  ion (see .  ** s
2bf20 6f 75 72 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e  ource file journ
2bf30 61 6c 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  al.c)..  */.  if
2bf40 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  ( sqlite3Journal
2bf50 53 69 7a 65 28 70 56 66 73 29 3e 73 71 6c 69 74  Size(pVfs)>sqlit
2bf60 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65  e3MemJournalSize
2bf70 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61  () ){.    journa
2bf80 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55 4e  lFileSize = ROUN
2bf90 44 38 28 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  D8(sqlite3Journa
2bfa0 6c 53 69 7a 65 28 70 56 66 73 29 29 3b 0a 20 20  lSize(pVfs));.  
2bfb0 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e  }else{.    journ
2bfc0 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 52 4f 55  alFileSize = ROU
2bfd0 4e 44 38 28 73 71 6c 69 74 65 33 4d 65 6d 4a 6f  ND8(sqlite3MemJo
2bfe0 75 72 6e 61 6c 53 69 7a 65 28 29 29 3b 0a 20 20  urnalSize());.  
2bff0 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
2c000 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20  output variable 
2c010 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20  to NULL in case 
2c020 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
2c030 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d   */.  *ppPager =
2c040 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   0;..#ifndef SQL
2c050 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
2c060 42 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  B.  if( flags & 
2c070 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20 29 7b 0a  PAGER_MEMORY ){.
2c080 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20      memDb = 1;. 
2c090 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65     if( zFilename
2c0a0 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
2c0b0 20 29 7b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e   ){.      zPathn
2c0c0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
2c0d0 74 72 44 75 70 28 30 2c 20 7a 46 69 6c 65 6e 61  trDup(0, zFilena
2c0e0 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  me);.      if( z
2c0f0 50 61 74 68 6e 61 6d 65 3d 3d 30 20 20 29 20 72  Pathname==0  ) r
2c100 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2c110 45 4d 3b 0a 20 20 20 20 20 20 6e 50 61 74 68 6e  EM;.      nPathn
2c120 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
2c130 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29  len30(zPathname)
2c140 3b 0a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d  ;.      zFilenam
2c150 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 0;.    }.  }
2c160 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f  .#endif..  /* Co
2c170 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65 20  mpute and store 
2c180 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
2c190 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65  e in an allocate
2c1a0 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  d buffer pointed
2c1b0 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74  .  ** to by zPat
2c1c0 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50  hname, length nP
2c1d0 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20  athname. Or, if 
2c1e0 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72  this is a tempor
2c1f0 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c  ary file,.  ** l
2c200 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68 6e  eave both nPathn
2c210 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d  ame and zPathnam
2c220 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f  e set to 0..  */
2c230 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
2c240 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
2c250 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
2c260 61 72 20 2a 7a 3b 0a 20 20 20 20 6e 50 61 74 68  ar *z;.    nPath
2c270 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
2c280 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a  athname+1;.    z
2c290 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
2c2a0 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c  e3DbMallocRaw(0,
2c2b0 20 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20   nPathname*2);. 
2c2c0 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65     if( zPathname
2c2d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
2c2e0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2c2f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50 61 74  ;.    }.    zPat
2c300 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a  hname[0] = 0; /*
2c310 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74 69   Make sure initi
2c320 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20 46  alized even if F
2c330 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66 61  ullPathname() fa
2c340 69 6c 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ils */.    rc = 
2c350 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
2c360 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c  hname(pVfs, zFil
2c370 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  ename, nPathname
2c380 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
2c390 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    nPathname = sq
2c3a0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50  lite3Strlen30(zP
2c3b0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 20  athname);.    z 
2c3c0 3d 20 7a 55 72 69 20 3d 20 26 7a 46 69 6c 65 6e  = zUri = &zFilen
2c3d0 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ame[sqlite3Strle
2c3e0 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31  n30(zFilename)+1
2c3f0 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a  ];.    while( *z
2c400 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73   ){.      z += s
2c410 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2c420 29 2b 31 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20  )+1;.      z += 
2c430 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2c440 7a 29 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  z)+1;.    }.    
2c450 6e 55 72 69 20 3d 20 28 69 6e 74 29 28 26 7a 5b  nUri = (int)(&z[
2c460 31 5d 20 2d 20 7a 55 72 69 29 3b 0a 20 20 20 20  1] - zUri);.    
2c470 61 73 73 65 72 74 28 20 6e 55 72 69 3e 3d 30 20  assert( nUri>=0 
2c480 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2c490 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74  QLITE_OK && nPat
2c4a0 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78  hname+8>pVfs->mx
2c4b0 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
2c4c0 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
2c4d0 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 74   is taken when t
2c4e0 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20  he journal path 
2c4f0 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20  required by.    
2c500 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
2c510 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 77  e being opened w
2c520 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61 6e  ill be more than
2c530 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
2c540 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73  e.      ** bytes
2c550 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69 73   in length. This
2c560 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
2c570 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  ase cannot be op
2c580 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61  ened,.      ** a
2c590 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s it will not be
2c5a0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65   possible to ope
2c5b0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
2c5c0 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20 20  le or even.     
2c5d0 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61 20   ** check for a 
2c5e0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  hot-journal befo
2c5f0 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20 20  re reading..    
2c600 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
2c610 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
2c620 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
2c630 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2c640 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
2c650 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74  e3DbFree(0, zPat
2c660 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  hname);.      re
2c670 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2c680 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
2c690 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65  e memory for the
2c6a0 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
2c6b0 2c 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c  , PCache object,
2c6c0 20 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65 20   the.  ** three 
2c6d0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
2c6e0 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
2c6f0 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ile name and the
2c700 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66   journal .  ** f
2c710 69 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61  ile name. The la
2c720 79 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69  yout in memory i
2c730 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  s as follows:.  
2c740 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67 65  **.  **     Page
2c750 72 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20  r object        
2c760 20 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a              (siz
2c770 65 6f 66 28 50 61 67 65 72 29 20 62 79 74 65 73  eof(Pager) bytes
2c780 29 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63 68  ).  **     PCach
2c790 65 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20  e object        
2c7a0 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69             (sqli
2c7b0 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 20  te3PcacheSize() 
2c7c0 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2c7d0 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  Database file ha
2c7e0 6e 64 6c 65 20 20 20 20 20 20 20 20 20 20 20 20  ndle            
2c7f0 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20  (pVfs->szOsFile 
2c800 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2c810 53 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  Sub-journal file
2c820 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20   handle         
2c830 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
2c840 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2c850 20 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   Main journal fi
2c860 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20  le handle       
2c870 20 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a   (journalFileSiz
2c880 65 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  e bytes).  **   
2c890 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20    Database file 
2c8a0 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  name            
2c8b0 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62    (nPathname+1 b
2c8c0 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a  ytes).  **     J
2c8d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
2c8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2c8f0 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79  nPathname+8+1 by
2c900 74 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72  tes).  */.  pPtr
2c910 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   = (u8 *)sqlite3
2c920 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20  MallocZero(.    
2c930 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70  ROUND8(sizeof(*p
2c940 50 61 67 65 72 29 29 20 2b 20 20 20 20 20 20 2f  Pager)) +      /
2c950 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  * Pager structur
2c960 65 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28  e */.    ROUND8(
2c970 70 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20 20  pcacheSize) +   
2c980 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68          /* PCach
2c990 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20  e object */.    
2c9a0 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f  ROUND8(pVfs->szO
2c9b0 73 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20 2f  sFile) +       /
2c9c0 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69  * The main db fi
2c9d0 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61  le */.    journa
2c9e0 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20  lFileSize * 2 + 
2c9f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2ca00 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  two journal file
2ca10 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e  s */ .    nPathn
2ca20 61 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 20 2b  ame + 1 + nUri +
2ca30 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
2ca40 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61  ename */.    nPa
2ca50 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 32 20 20  thname + 8 + 2  
2ca60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
2ca70 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64  Journal */.#ifnd
2ca80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
2ca90 41 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68 6e 61  AL.    + nPathna
2caa0 6d 65 20 2b 20 34 20 2b 20 32 20 20 20 20 20 20  me + 4 + 2      
2cab0 20 20 20 20 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f        /* zWal */
2cac0 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 61  .#endif.  );.  a
2cad0 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
2cae0 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49  E_ALIGNMENT(SQLI
2caf0 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f  TE_INT_TO_PTR(jo
2cb00 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29 20  urnalFileSize)) 
2cb10 29 3b 0a 20 20 69 66 28 20 21 70 50 74 72 20 29  );.  if( !pPtr )
2cb20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
2cb30 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65  ree(0, zPathname
2cb40 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
2cb50 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
2cb60 20 20 70 50 61 67 65 72 20 3d 20 20 20 20 20 20    pPager =      
2cb70 20 20 20 20 20 20 20 20 28 50 61 67 65 72 2a 29          (Pager*)
2cb80 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72  (pPtr);.  pPager
2cb90 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20 20 28  ->pPCache =    (
2cba0 50 43 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d  PCache*)(pPtr +=
2cbb0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a   ROUND8(sizeof(*
2cbc0 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61  pPager)));.  pPa
2cbd0 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c  ger->fd =   (sql
2cbe0 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72  ite3_file*)(pPtr
2cbf0 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68   += ROUND8(pcach
2cc00 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65  eSize));.  pPage
2cc10 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74  r->sjfd = (sqlit
2cc20 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b  e3_file*)(pPtr +
2cc30 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73  = ROUND8(pVfs->s
2cc40 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61  zOsFile));.  pPa
2cc50 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c  ger->jfd =  (sql
2cc60 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72  ite3_file*)(pPtr
2cc70 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53   += journalFileS
2cc80 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ize);.  pPager->
2cc90 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28  zFilename =    (
2cca0 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a  char*)(pPtr += j
2ccb0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b  ournalFileSize);
2ccc0 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
2ccd0 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
2cce0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
2ccf0 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
2cd00 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d  e Pager.zFilenam
2cd10 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75  e and Pager.zJou
2cd20 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66  rnal buffers, if
2cd30 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
2cd40 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b  if( zPathname ){
2cd50 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 50 61  .    assert( nPa
2cd60 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20 20 20  thname>0 );.    
2cd70 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2cd80 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50 74   =   (char*)(pPt
2cd90 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b  r += nPathname +
2cda0 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20 20 20 20   1 + nUri);.    
2cdb0 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
2cdc0 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e  Filename, zPathn
2cdd0 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b  ame, nPathname);
2cde0 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20 29 20  .    if( nUri ) 
2cdf0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
2ce00 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e  zFilename[nPathn
2ce10 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20 6e 55  ame+1], zUri, nU
2ce20 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ri);.    memcpy(
2ce30 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2ce40 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
2ce50 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
2ce60 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  cpy(&pPager->zJo
2ce70 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d  urnal[nPathname]
2ce80 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30 30 22  , "-journal\000"
2ce90 2c 20 38 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69  , 8+2);.    sqli
2cea0 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70  te3FileSuffix3(p
2ceb0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2cec0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
2ced0 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  al);.#ifndef SQL
2cee0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
2cef0 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20 3d 20   pPager->zWal = 
2cf00 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
2cf10 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b 31 5d  l[nPathname+8+1]
2cf20 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  ;.    memcpy(pPa
2cf30 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61 74 68  ger->zWal, zPath
2cf40 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
2cf50 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50  ;.    memcpy(&pP
2cf60 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61 74 68  ager->zWal[nPath
2cf70 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30 30 30  name], "-wal\000
2cf80 22 2c 20 34 2b 31 29 3b 0a 20 20 20 20 73 71 6c  ", 4+1);.    sql
2cf90 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
2cfa0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2cfb0 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 29  e, pPager->zWal)
2cfc0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
2cfd0 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 7a 50  ite3DbFree(0, zP
2cfe0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  athname);.  }.  
2cff0 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70  pPager->pVfs = p
2d000 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76  Vfs;.  pPager->v
2d010 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61  fsFlags = vfsFla
2d020 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74  gs;..  /* Open t
2d030 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20  he pager file.. 
2d040 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
2d050 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
2d060 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  [0] ){.    int f
2d070 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  out = 0;        
2d080 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
2d090 46 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65  FS flags returne
2d0a0 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a  d by xOpen() */.
2d0b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2d0c0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
2d0d0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
2d0e0 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73 46  pPager->fd, vfsF
2d0f0 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20  lags, &fout);.  
2d100 20 20 61 73 73 65 72 74 28 20 21 6d 65 6d 44 62    assert( !memDb
2d110 20 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79   );.    readOnly
2d120 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f   = (fout&SQLITE_
2d130 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
2d140 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
2d150 69 6c 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ile was successf
2d160 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20  ully opened for 
2d170 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
2d180 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65  s,.    ** choose
2d190 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65 20   a default page 
2d1a0 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20  size in case we 
2d1b0 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20 74  have to create t
2d1c0 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
2d1d0 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66  se file. The def
2d1e0 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
2d1f0 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66  s the maximum of
2d200 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
2d210 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41     + SQLITE_DEFA
2d220 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20  ULT_PAGE_SIZE,. 
2d230 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76     **    + The v
2d240 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
2d250 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
2d260 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20 20  Size().    **   
2d270 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20 70   + The largest p
2d280 61 67 65 20 73 69 7a 65 20 74 68 61 74 20 63 61  age size that ca
2d290 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f  n be written ato
2d2a0 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a  mically..    */.
2d2b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2d2c0 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e  TE_OK && !readOn
2d2d0 6c 79 20 29 7b 0a 20 20 20 20 20 20 73 65 74 53  ly ){.      setS
2d2e0 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
2d2f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2d300 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
2d310 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45  AGE_SIZE<=SQLITE
2d320 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2d330 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 69  E_SIZE);.      i
2d340 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50  f( szPageDflt<pP
2d350 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
2d360 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
2d370 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
2d380 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  ze>SQLITE_MAX_DE
2d390 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20  FAULT_PAGE_SIZE 
2d3a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50  ){.          szP
2d3b0 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45  ageDflt = SQLITE
2d3c0 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
2d3d0 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20  E_SIZE;.        
2d3e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2d3f0 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75   szPageDflt = (u
2d400 33 32 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  32)pPager->secto
2d410 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d  rSize;.        }
2d420 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20  .      }.#ifdef 
2d430 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
2d440 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20  OMIC_WRITE.     
2d450 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69   {.        int i
2d460 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
2d470 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
2d480 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
2d490 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b  .        int ii;
2d4a0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2d4b0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
2d4c0 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
2d4d0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2d4e0 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
2d4f0 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36  TOMIC64K==(65536
2d500 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61  >>8));.        a
2d510 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58  ssert(SQLITE_MAX
2d520 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
2d530 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20  ZE<=65536);.    
2d540 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67      for(ii=szPag
2d550 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54  eDflt; ii<=SQLIT
2d560 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2d570 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32  GE_SIZE; ii=ii*2
2d580 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2d590 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43   iDc&(SQLITE_IOC
2d5a0 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38  AP_ATOMIC|(ii>>8
2d5b0 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )) ){.          
2d5c0 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69    szPageDflt = i
2d5d0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  i;.          }. 
2d5e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2d5f0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
2d600 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
2d610 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
2d620 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  e is requested, 
2d630 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64  it is not opened
2d640 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
2d650 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
2d660 65 20 77 65 20 61 63 63 65 70 74 20 74 68 65 20  e we accept the 
2d670 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
2d680 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75  e and delay actu
2d690 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  ally.    ** open
2d6a0 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74  ing the file unt
2d6b0 69 6c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  il the first cal
2d6c0 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a  l to OsWrite()..
2d6d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
2d6e0 69 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73  is branch is als
2d6f0 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d  o run for an in-
2d700 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
2d710 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20   An in-memory.  
2d720 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
2d730 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20 74   the same as a t
2d740 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73  emp-file that is
2d750 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f   never written o
2d760 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73  ut to.    ** dis
2d770 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e  k and uses an in
2d780 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b  -memory rollback
2d790 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f   journal..    */
2d7a0 20 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d   .    tempFile =
2d7b0 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
2d7c0 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  eState = PAGER_R
2d7d0 45 41 44 45 52 3b 0a 20 20 20 20 70 50 61 67 65  EADER;.    pPage
2d7e0 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55  r->eLock = EXCLU
2d7f0 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72  SIVE_LOCK;.    r
2d800 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73 46 6c  eadOnly = (vfsFl
2d810 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
2d820 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 0a  READONLY);.  }..
2d830 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
2d840 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72  ng call to Pager
2d850 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 73 65  SetPagesize() se
2d860 72 76 65 73 20 74 6f 20 73 65 74 20 74 68 65 20  rves to set the 
2d870 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50  value of .  ** P
2d880 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e  ager.pageSize an
2d890 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  d to allocate th
2d8a0 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  e Pager.pTmpSpac
2d8b0 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20  e buffer..  */. 
2d8c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2d8d0 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
2d8e0 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d  ( pPager->memDb=
2d8f0 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  =0 );.    rc = s
2d900 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
2d910 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26  gesize(pPager, &
2d920 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31 29 3b  szPageDflt, -1);
2d930 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
2d940 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
2d950 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20    }..  /* If an 
2d960 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69  error occurred i
2d970 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  n either of the 
2d980 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66 72  blocks above, fr
2d990 65 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  ee the .  ** Pag
2d9a0 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
2d9b0 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e   close the file.
2d9c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d  .  */.  if( rc!=
2d9d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d9e0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
2d9f0 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 3b 0a 20  ->pTmpSpace );. 
2da00 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
2da10 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
2da20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2da30 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
2da40 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
2da50 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
2da60 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20   PCache object. 
2da70 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78  */.  assert( nEx
2da80 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 6e 45  tra<1000 );.  nE
2da90 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45  xtra = ROUND8(nE
2daa0 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  xtra);.  sqlite3
2dab0 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67  PcacheOpen(szPag
2dac0 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21  eDflt, nExtra, !
2dad0 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20  memDb,.         
2dae0 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44             !memD
2daf0 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c  b?pagerStress:0,
2db00 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c   (void *)pPager,
2db10 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
2db20 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45  );..  PAGERTRACE
2db30 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22  (("OPEN %d %s\n"
2db40 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70  , FILEHANDLEID(p
2db50 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67  Pager->fd), pPag
2db60 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b  er->zFilename));
2db70 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45  .  IOTRACE(("OPE
2db80 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67  N %p %s\n", pPag
2db90 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  er, pPager->zFil
2dba0 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65  ename))..  pPage
2dbb0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  r->useJournal = 
2dbc0 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a  (u8)useJournal;.
2dbd0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
2dbe0 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20  tOpen = 0; */.  
2dbf0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  /* pPager->stmtI
2dc00 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nUse = 0; */.  /
2dc10 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d  * pPager->nRef =
2dc20 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2dc30 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30  er->stmtSize = 0
2dc40 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2dc50 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b  ->stmtJSize = 0;
2dc60 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2dc70 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20  >nPage = 0; */. 
2dc80 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
2dc90 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  = SQLITE_MAX_PAG
2dca0 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50  E_COUNT;.  /* pP
2dcb0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
2dcc0 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 23  GER_UNLOCK; */.#
2dcd0 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
2dce0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20  Pager->state == 
2dcf0 28 74 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45  (tempFile ? PAGE
2dd00 52 5f 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41  R_EXCLUSIVE : PA
2dd10 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 23  GER_UNLOCK) );.#
2dd20 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61 67 65  endif.  /* pPage
2dd30 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20  r->errMask = 0; 
2dd40 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d  */.  pPager->tem
2dd50 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70  pFile = (u8)temp
2dd60 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20  File;.  assert( 
2dd70 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
2dd80 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
2dd90 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  AL .          ||
2dda0 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
2ddb0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
2ddc0 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
2ddd0 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
2dde0 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d  GMODE_EXCLUSIVE=
2ddf0 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  =1 );.  pPager->
2de00 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
2de10 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20  (u8)tempFile; . 
2de20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
2de30 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
2de40 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70  r->tempFile;.  p
2de50 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28  Pager->memDb = (
2de60 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67  u8)memDb;.  pPag
2de70 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28  er->readOnly = (
2de80 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 61  u8)readOnly;.  a
2de90 73 73 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61  ssert( useJourna
2dea0 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  l || pPager->tem
2deb0 70 46 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65  pFile );.  pPage
2dec0 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67  r->noSync = pPag
2ded0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
2dee0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
2def0 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nc ){.    assert
2df00 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
2df10 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  nc==0 );.    ass
2df20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 79 6e  ert( pPager->syn
2df30 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20  cFlags==0 );.   
2df40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2df50 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d 30  >walSyncFlags==0
2df60 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2df70 70 50 61 67 65 72 2d 3e 63 6b 70 74 53 79 6e 63  pPager->ckptSync
2df80 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 7d 65  Flags==0 );.  }e
2df90 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
2dfa0 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 31 3b 0a 20  >fullSync = 1;. 
2dfb0 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
2dfc0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59  lags = SQLITE_SY
2dfd0 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 70  NC_NORMAL;.    p
2dfe0 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
2dff0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e  ags = SQLITE_SYN
2e000 43 5f 4e 4f 52 4d 41 4c 20 7c 20 57 41 4c 5f 53  C_NORMAL | WAL_S
2e010 59 4e 43 5f 54 52 41 4e 53 41 43 54 49 4f 4e 53  YNC_TRANSACTIONS
2e020 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 6b  ;.    pPager->ck
2e030 70 74 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ptSyncFlags = SQ
2e040 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
2e050 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65  ;.  }.  /* pPage
2e060 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a  r->pFirst = 0; *
2e070 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
2e080 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b  FirstSynced = 0;
2e090 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2e0a0 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20  >pLast = 0; */. 
2e0b0 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20   pPager->nExtra 
2e0c0 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a 20  = (u16)nExtra;. 
2e0d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2e0e0 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49  SizeLimit = SQLI
2e0f0 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e  TE_DEFAULT_JOURN
2e100 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20  AL_SIZE_LIMIT;. 
2e110 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
2e120 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74  pPager->fd) || t
2e130 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65 74  empFile );.  set
2e140 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
2e150 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65 4a 6f  r);.  if( !useJo
2e160 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50 61  urnal ){.    pPa
2e170 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2e180 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
2e190 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73  MODE_OFF;.  }els
2e1a0 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20  e if( memDb ){. 
2e1b0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
2e1c0 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
2e1d0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
2e1e0 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67  Y;.  }.  /* pPag
2e1f0 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
2e200 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2e210 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
2e220 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20  erArg = 0; */.  
2e230 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
2e240 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20 2f  r = xReinit;.  /
2e250 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d  * memset(pPager-
2e260 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f  >aHash, 0, sizeo
2e270 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  f(pPager->aHash)
2e280 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  ); */.  /* pPage
2e290 72 2d 3e 6d 78 4d 6d 61 70 20 3d 20 53 51 4c 49  r->mxMmap = SQLI
2e2a0 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50 5f  TE_DEFAULT_MMAP_
2e2b0 4c 49 4d 49 54 20 2f 2f 20 77 69 6c 6c 20 62 65  LIMIT // will be
2e2c0 20 73 65 74 20 62 79 20 62 74 72 65 65 2e 63 20   set by btree.c 
2e2d0 2a 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d  */..  *ppPager =
2e2e0 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72   pPager;.  retur
2e2f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2e300 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2e310 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
2e320 61 66 74 65 72 20 74 72 61 6e 73 69 74 69 6f 6e  after transition
2e330 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52 5f 55  ing from PAGER_U
2e340 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45  NLOCK to.** PAGE
2e350 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 2e 20  R_SHARED state. 
2e360 49 74 20 74 65 73 74 73 20 69 66 20 74 68 65 72  It tests if ther
2e370 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  e is a hot journ
2e380 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a  al present in.**
2e390 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
2e3a0 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
2e3b0 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72  ager. A hot jour
2e3c0 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20  nal is one that 
2e3d0 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20  .** needs to be 
2e3e0 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41 63 63  played back. Acc
2e3f0 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20 66  ording to this f
2e400 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a  unction, a hot-j
2e410 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65  ournal.** file e
2e420 78 69 73 74 73 20 69 66 20 74 68 65 20 66 6f 6c  xists if the fol
2e430 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 20  lowing criteria 
2e440 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20  are met:.**.**  
2e450 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66   * The journal f
2e460 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20 74 68  ile exists in th
2e470 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 61  e file system, a
2e480 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f  nd.**   * No pro
2e490 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53  cess holds a RES
2e4a0 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
2e4b0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
2e4c0 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a  abase file, and.
2e4d0 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61 62  **   * The datab
2e4e0 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20  ase file itself 
2e4f0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
2e500 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  0 bytes in size,
2e510 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
2e520 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
2e530 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
2e540 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74  xists and is not
2e550 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   0x00..**.** If 
2e560 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
2e570 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2e580 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20 61   file is 0 but a
2e590 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
2e5a0 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69 73   exists, that is
2e5b0 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64   probably an old
2e5c0 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76   journal left ov
2e5d0 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a  er from a prior.
2e5e0 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ** database with
2e5f0 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
2e600 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2e610 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2e620 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74 65 64  .** just deleted
2e630 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c   using OsDelete,
2e640 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74   *pExists is set
2e650 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
2e660 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
2e670 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
2e680 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20  outine does not 
2e690 63 68 65 63 6b 20 69 66 20 74 68 65 72 65 20 69  check if there i
2e6a0 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
2e6b0 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61  al filename.** a
2e6c0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2e6d0 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
2e6e0 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d 61 73  is, and that mas
2e6f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
2e700 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  .** does not exi
2e710 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  st, then the jou
2e720 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
2e730 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20   really hot. In 
2e740 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74 68 69  this.** case thi
2e750 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
2e760 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f  eturn a false-po
2e770 73 69 74 69 76 65 2e 20 54 68 65 20 70 61 67 65  sitive. The page
2e780 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20  r_playback().** 
2e790 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73  routine will dis
2e7a0 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 20 6a  cover that the j
2e7b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
2e7c0 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e  ot really hot an
2e7d0 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72  d .** will not r
2e7e0 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a  oll it back. .**
2e7f0 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75  .** If a hot-jou
2e800 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 6f 75  rnal file is fou
2e810 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a 70 45  nd to exist, *pE
2e820 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20  xists is set to 
2e830 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45  1 and .** SQLITE
2e840 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
2e850 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   no hot-journal 
2e860 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c  file is present,
2e870 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a 2a 20   *pExists is.** 
2e880 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
2e890 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
2e8a0 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
2e8b0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
2e8c0 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d  ing.** to determ
2e8d0 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
2e8e0 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ot a hot-journal
2e8f0 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74 68   file exists, th
2e900 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  e IO error.** co
2e910 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
2e920 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nd the value of 
2e930 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e 64 65  *pExists is unde
2e940 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
2e950 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e   int hasHotJourn
2e960 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
2e970 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b  , int *pExists){
2e980 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
2e990 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
2e9a0 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
2e9b0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2e9c0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
2e9d0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2e9e0 69 6e 74 20 65 78 69 73 74 73 20 3d 20 31 3b 20  int exists = 1; 
2e9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ea00 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75 72 6e   True if a journ
2ea10 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65  al file is prese
2ea20 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 72 6e 6c  nt */.  int jrnl
2ea30 4f 70 65 6e 20 3d 20 21 21 69 73 4f 70 65 6e 28  Open = !!isOpen(
2ea40 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 0a 20  pPager->jfd);.. 
2ea50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2ea60 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
2ea70 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
2ea80 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20  pPager->fd) );. 
2ea90 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2eaa0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
2eab0 50 45 4e 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  PEN );..  assert
2eac0 28 20 6a 72 6e 6c 4f 70 65 6e 3d 3d 30 20 7c 7c  ( jrnlOpen==0 ||
2ead0 20 28 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   ( sqlite3OsDevi
2eae0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
2eaf0 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  s(pPager->jfd) &
2eb00 0a 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41  .    SQLITE_IOCA
2eb10 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48  P_UNDELETABLE_WH
2eb20 45 4e 5f 4f 50 45 4e 0a 20 20 29 29 3b 0a 0a 20  EN_OPEN.  ));.. 
2eb30 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20   *pExists = 0;. 
2eb40 20 69 66 28 20 21 6a 72 6e 6c 4f 70 65 6e 20 29   if( !jrnlOpen )
2eb50 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
2eb60 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
2eb70 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
2eb80 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
2eb90 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73  _EXISTS, &exists
2eba0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
2ebb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78  =SQLITE_OK && ex
2ebc0 69 73 74 73 20 29 7b 0a 20 20 20 20 69 6e 74 20  ists ){.    int 
2ebd0 6c 6f 63 6b 65 64 20 3d 20 30 3b 20 20 20 20 20  locked = 0;     
2ebe0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2ebf0 69 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73 20  if some process 
2ec00 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44  holds a RESERVED
2ec10 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20 20 2f 2a   lock */..    /*
2ec20 20 52 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   Race condition 
2ec30 68 65 72 65 3a 20 20 41 6e 6f 74 68 65 72 20 70  here:  Another p
2ec40 72 6f 63 65 73 73 20 6d 69 67 68 74 20 68 61 76  rocess might hav
2ec50 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e 67 20 74  e been holding t
2ec60 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 52 45  he.    ** the RE
2ec70 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 6e 64 20  SERVED lock and 
2ec80 68 61 76 65 20 61 20 6a 6f 75 72 6e 61 6c 20 6f  have a journal o
2ec90 70 65 6e 20 61 74 20 74 68 65 20 73 71 6c 69 74  pen at the sqlit
2eca0 65 33 4f 73 41 63 63 65 73 73 28 29 20 0a 20 20  e3OsAccess() .  
2ecb0 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f 76 65 2c    ** call above,
2ecc0 20 62 75 74 20 74 68 65 6e 20 64 65 6c 65 74 65   but then delete
2ecd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
2ece0 20 64 72 6f 70 20 74 68 65 20 6c 6f 63 6b 20 62   drop the lock b
2ecf0 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 77 65 20  efore.    ** we 
2ed00 67 65 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  get to the follo
2ed10 77 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 43 68  wing sqlite3OsCh
2ed20 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
2ed30 29 20 63 61 6c 6c 2e 20 20 49 66 20 74 68 61 74  ) call.  If that
2ed40 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 63  .    ** is the c
2ed50 61 73 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ase, this routin
2ed60 65 20 6d 69 67 68 74 20 74 68 69 6e 6b 20 74 68  e might think th
2ed70 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75  ere is a hot jou
2ed80 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20 20 2a 2a  rnal when.    **
2ed90 20 69 6e 20 66 61 63 74 20 74 68 65 72 65 20 69   in fact there i
2eda0 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73 20 72 65  s none.  This re
2edb0 73 75 6c 74 73 20 69 6e 20 61 20 66 61 6c 73 65  sults in a false
2edc0 2d 70 6f 73 69 74 69 76 65 20 77 68 69 63 68 20  -positive which 
2edd0 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 64  will.    ** be d
2ede0 65 61 6c 74 20 77 69 74 68 20 62 79 20 74 68 65  ealt with by the
2edf0 20 70 6c 61 79 62 61 63 6b 20 72 6f 75 74 69 6e   playback routin
2ee00 65 2e 20 20 54 69 63 6b 65 74 20 23 33 38 38 33  e.  Ticket #3883
2ee10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
2ee20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  = sqlite3OsCheck
2ee30 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61  ReservedLock(pPa
2ee40 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64  ger->fd, &locked
2ee50 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2ee60 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f 63  QLITE_OK && !loc
2ee70 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  ked ){.      Pgn
2ee80 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  o nPage;        
2ee90 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2eea0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
2eeb0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2eec0 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
2eed0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
2eee0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
2eef0 66 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  f it consists of
2ef00 20 30 20 70 61 67 65 73 2c 0a 20 20 20 20 20 20   0 pages,.      
2ef10 2a 2a 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74  ** then delete t
2ef20 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
2ef30 20 53 65 65 20 74 68 65 20 68 65 61 64 65 72 20   See the header 
2ef40 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 66 6f  comment above fo
2ef50 72 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  r .      ** the 
2ef60 72 65 61 73 6f 6e 69 6e 67 20 68 65 72 65 2e 20  reasoning here. 
2ef70 20 44 65 6c 65 74 65 20 74 68 65 20 6f 62 73 6f   Delete the obso
2ef80 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  lete journal fil
2ef90 65 20 75 6e 64 65 72 0a 20 20 20 20 20 20 2a 2a  e under.      **
2efa0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
2efb0 20 74 6f 20 61 76 6f 69 64 20 72 61 63 65 20 63   to avoid race c
2efc0 6f 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20 74 6f  onditions and to
2efd0 20 61 76 6f 69 64 20 76 69 6f 6c 61 74 69 6e 67   avoid violating
2efe0 0a 20 20 20 20 20 20 2a 2a 20 5b 48 33 33 30 32  .      ** [H3302
2eff0 30 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  0]..      */.   
2f000 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
2f010 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
2f020 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  nPage);.      if
2f030 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2f040 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
2f050 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
2f060 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
2f070 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
2f080 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2f090 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
2f0a0 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  r, RESERVED_LOCK
2f0b0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
2f0c0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2f0d0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
2f0e0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
2f0f0 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  al, 0);.        
2f100 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
2f110 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
2f120 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70   pagerUnlockDb(p
2f130 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
2f140 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  CK);.          }
2f150 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2f160 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
2f170 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  c();.        }el
2f180 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
2f190 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
2f1a0 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20  e exists and no 
2f1b0 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2f1c0 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a   has a reserved.
2f1d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
2f1e0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
2f1f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2f200 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61  e. Now check tha
2f210 74 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20  t there is.     
2f220 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74       ** at least
2f230 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79   one non-zero by
2f240 74 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74  tes at the start
2f250 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2f260 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20  file..          
2f270 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20  ** If there is, 
2f280 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72  then we consider
2f290 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f   this journal to
2f2a0 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c   be hot. If not,
2f2b0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69   .          ** i
2f2c0 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  t can be ignored
2f2d0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
2f2e0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72           if( !jr
2f2f0 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  nlOpen ){.      
2f300 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51        int f = SQ
2f310 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
2f320 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
2f330 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20  AIN_JOURNAL;.   
2f340 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2f350 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
2f360 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
2f370 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
2f380 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20   f, &f);.       
2f390 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
2f3a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2f3b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f3c0 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20  u8 first = 0;.  
2f3d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2f3e0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
2f3f0 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20  ger->jfd, (void 
2f400 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29 3b  *)&first, 1, 0);
2f410 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2f420 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
2f430 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
2f440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
2f450 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2f460 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2f470 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e          if( !jrn
2f480 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  lOpen ){.       
2f490 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
2f4a0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
2f4b0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
2f4c0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  }.            *p
2f4d0 45 78 69 73 74 73 20 3d 20 28 66 69 72 73 74 21  Exists = (first!
2f4e0 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  =0);.          }
2f4f0 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
2f500 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a  ITE_CANTOPEN ){.
2f510 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2f520 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  f we cannot open
2f530 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
2f540 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72  urnal file in or
2f550 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a 20 20  der to see if.  
2f560 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 73            ** its
2f570 20 68 61 73 20 61 20 7a 65 72 6f 20 68 65 61 64   has a zero head
2f580 65 72 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62  er, that might b
2f590 65 20 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20  e due to an I/O 
2f5a0 65 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20  error, or.      
2f5b0 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68        ** it migh
2f5c0 74 20 62 65 20 64 75 65 20 74 6f 20 74 68 65 20  t be due to the 
2f5d0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64  race condition d
2f5e0 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 61  escribed above a
2f5f0 6e 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20  nd in.          
2f600 20 20 2a 2a 20 74 69 63 6b 65 74 20 23 33 38 38    ** ticket #388
2f610 33 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20  3.  Either way, 
2f620 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
2f630 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a  journal is hot..
2f640 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54              ** T
2f650 68 69 73 20 6d 69 67 68 74 20 62 65 20 61 20 66  his might be a f
2f660 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 20 20  alse positive.  
2f670 42 75 74 20 69 66 20 69 74 20 69 73 2c 20 74 68  But if it is, th
2f680 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  en the.         
2f690 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20     ** automatic 
2f6a0 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b  journal playback
2f6b0 20 61 6e 64 20 72 65 63 6f 76 65 72 79 20 6d 65   and recovery me
2f6c0 63 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61  chanism will dea
2f6d0 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  l.            **
2f6e0 20 77 69 74 68 20 69 74 20 75 6e 64 65 72 20 61   with it under a
2f6f0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
2f700 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74   where we do not
2f710 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20   need to.       
2f720 20 20 20 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f       ** worry so
2f730 20 6d 75 63 68 20 77 69 74 68 20 72 61 63 65 20   much with race 
2f740 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20  conditions..    
2f750 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2f760 20 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20         *pExists 
2f770 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
2f780 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2f790 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2f7a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2f7b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
2f7c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2f7d0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2f7e0 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
2f7f0 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  n a shared lock 
2f800 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2f810 66 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69  file..** It is i
2f820 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73  llegal to call s
2f830 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
2f840 72 65 28 29 20 75 6e 74 69 6c 20 61 66 74 65 72  re() until after
2f850 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
2f860 2a 20 68 61 73 20 62 65 65 6e 20 73 75 63 63 65  * has been succe
2f870 73 73 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20  ssfully called. 
2f880 49 66 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b  If a shared-lock
2f890 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
2f8a0 20 77 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75   when.** this fu
2f8b0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2f8c0 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
2f8d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
2f8e0 77 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20  wing operations 
2f8f0 61 72 65 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d  are also perform
2f900 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
2f910 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  ion..**.**   1) 
2f920 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
2f930 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41 47  currently in PAG
2f940 45 52 5f 4f 50 45 4e 20 73 74 61 74 65 20 28 6e  ER_OPEN state (n
2f950 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20  o lock held.**  
2f960 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62      on the datab
2f970 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e 20  ase file), then 
2f980 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  an attempt is ma
2f990 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a  de to obtain a.*
2f9a0 2a 20 20 20 20 20 20 53 48 41 52 45 44 20 6c 6f  *      SHARED lo
2f9b0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
2f9c0 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61  se file. Immedia
2f9d0 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69  tely after obtai
2f9e0 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  ning.**      the
2f9f0 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
2fa00 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73  e file-system is
2fa10 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20 68   checked for a h
2fa20 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20  ot-journal,.**  
2fa30 20 20 20 20 77 68 69 63 68 20 69 73 20 70 6c 61      which is pla
2fa40 79 65 64 20 62 61 63 6b 20 69 66 20 70 72 65 73  yed back if pres
2fa50 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61  ent. Following a
2fa60 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a  ny hot-journal .
2fa70 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b  **      rollback
2fa80 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
2fa90 66 20 74 68 65 20 63 61 63 68 65 20 61 72 65 20  f the cache are 
2faa0 76 61 6c 69 64 61 74 65 64 20 62 79 20 63 68 65  validated by che
2fab0 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  cking.**      th
2fac0 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  e 'change-counte
2fad0 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  r' field of the 
2fae0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65  database file he
2faf0 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ader and.**     
2fb00 20 64 69 73 63 61 72 64 65 64 20 69 66 20 74 68   discarded if th
2fb10 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f 20  ey are found to 
2fb20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a  be invalid..**.*
2fb30 2a 20 20 20 32 29 20 49 66 20 74 68 65 20 70 61  *   2) If the pa
2fb40 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
2fb50 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65  n exclusive-mode
2fb60 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
2fb70 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20  currently.**    
2fb80 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67    no outstanding
2fb90 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
2fba0 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69 73  ny pages, and is
2fbb0 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
2fbc0 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65  ate,.**      the
2fbd0 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  n an attempt is 
2fbe0 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74 68  made to clear th
2fbf0 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 62 79  e error state by
2fc00 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20   discarding.**  
2fc10 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73      the contents
2fc20 20 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63   of the page cac
2fc30 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62  he and rolling b
2fc40 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75  ack any open jou
2fc50 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c  rnal.**      fil
2fc60 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72  e..**.** If ever
2fc70 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
2fc80 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
2fc90 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
2fca0 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  an IO error .** 
2fcb0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6c 6f 63  occurs while loc
2fcc0 6b 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  king the databas
2fcd0 65 2c 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  e, checking for 
2fce0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
2fcf0 6c 65 20 6f 72 20 0a 2a 2a 20 72 6f 6c 6c 69 6e  le or .** rollin
2fd00 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  g back a journal
2fd10 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20 65 72   file, the IO er
2fd20 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
2fd30 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
2fd40 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c  ite3PagerSharedL
2fd50 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
2fd60 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
2fd70 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2fd80 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2fd90 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a  rn code */..  /*
2fda0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2fdb0 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f   only called fro
2fdc0 6d 20 62 2d 74 72 65 65 20 61 6e 64 20 6f 6e 6c  m b-tree and onl
2fdd0 79 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65  y when there are
2fde0 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74 61 6e   no.  ** outstan
2fdf0 64 69 6e 67 20 70 61 67 65 73 2e 20 54 68 69 73  ding pages. This
2fe00 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74 68   implies that th
2fe10 65 20 70 61 67 65 72 20 73 74 61 74 65 20 73 68  e pager state sh
2fe20 6f 75 6c 64 20 65 69 74 68 65 72 0a 20 20 2a 2a  ould either.  **
2fe30 20 62 65 20 4f 50 45 4e 20 6f 72 20 52 45 41 44   be OPEN or READ
2fe40 45 52 2e 20 52 45 41 44 45 52 20 69 73 20 6f 6e  ER. READER is on
2fe50 6c 79 20 70 6f 73 73 69 62 6c 65 20 69 66 20 74  ly possible if t
2fe60 68 65 20 70 61 67 65 72 20 69 73 20 6f 72 20 77  he pager is or w
2fe70 61 73 20 69 6e 20 0a 20 20 2a 2a 20 65 78 63 6c  as in .  ** excl
2fe80 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64  usive access mod
2fe90 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
2fea0 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
2feb0 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
2fec0 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20  pPCache)==0 );. 
2fed0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
2fee0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
2fef0 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
2ff00 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
2ff10 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70  =PAGER_OPEN || p
2ff20 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
2ff30 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20  AGER_READER );. 
2ff40 20 69 66 28 20 4e 45 56 45 52 28 4d 45 4d 44 42   if( NEVER(MEMDB
2ff50 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
2ff60 6f 64 65 29 20 29 7b 20 72 65 74 75 72 6e 20 70  ode) ){ return p
2ff70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 20  Pager->errCode; 
2ff80 7d 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72 55  }..  if( !pagerU
2ff90 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26  seWal(pPager) &&
2ffa0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
2ffb0 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20  =PAGER_OPEN ){. 
2ffc0 20 20 20 69 6e 74 20 62 48 6f 74 4a 6f 75 72 6e     int bHotJourn
2ffd0 61 6c 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  al = 1;         
2ffe0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 72   /* True if ther
2fff0 65 20 65 78 69 73 74 73 20 61 20 68 6f 74 20 6a  e exists a hot j
30000 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a  ournal-file */..
30010 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
30020 44 42 20 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20  DB );..    rc = 
30030 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
30040 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  ck(pPager, SHARE
30050 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
30060 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30070 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
30080 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e  pPager->eLock==N
30090 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72  O_LOCK || pPager
300a0 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e  ->eLock==UNKNOWN
300b0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 67  _LOCK );.      g
300c0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
300d0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a  }..    /* If a j
300e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
300f0 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73  ts, and there is
30100 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63   no RESERVED loc
30110 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
30120 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
30130 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65  hen it either ne
30140 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
30150 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64   back or deleted
30160 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
30170 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d   pPager->eLock<=
30180 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
30190 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74       rc = hasHot
301a0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
301b0 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20  &bHotJournal);. 
301c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
301d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
301e0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
301f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62  .    }.    if( b
30200 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  HotJournal ){.  
30210 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
30220 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
30230 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
30240 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43  READONLY_ROLLBAC
30250 4b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  K;.        goto 
30260 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
30270 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e  .      /* Get an
30280 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
30290 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
302a0 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f  file. At this po
302b0 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20  int it is.      
302c0 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  ** important tha
302d0 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
302e0 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65  k is not obtaine
302f0 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20  d on the way to 
30300 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43  the.      ** EXC
30310 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
30320 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72  it were, another
30330 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f   process might o
30340 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  pen the.      **
30350 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
30360 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52  detect the RESER
30370 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f  VED lock, and co
30380 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a  nclude that the.
30390 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
303a0 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61  e is safe to rea
303b0 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f  d while this pro
303c0 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f  cess is still ro
303d0 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20  lling the .     
303e0 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   ** hot-journal 
303f0 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a  back..      ** .
30400 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65        ** Because
30410 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
30420 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
30430 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64  is not requested
30440 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f  , any.      ** o
30450 74 68 65 72 20 70 72 6f 63 65 73 73 20 61 74 74  ther process att
30460 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73  empting to acces
30470 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
30480 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20  ile will get to 
30490 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70  .      ** this p
304a0 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
304b0 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74   and fail to obt
304c0 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c  ain its own EXCL
304d0 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20  USIVE lock .    
304e0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61    ** on the data
304f0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
30500 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c   **.      ** Unl
30510 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
30520 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
30530 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c  =exclusive mode,
30540 20 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20 20 20   the lock is.   
30550 20 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64     ** downgraded
30560 20 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20   to SHARED_LOCK 
30570 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
30580 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20  tion returns..  
30590 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
305a0 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
305b0 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
305c0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
305d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
305e0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  {.        goto f
305f0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ailed;.      }. 
30600 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 74 20  .      /* If it 
30610 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
30620 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 6c 65  pen and the file
30630 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c   exists on disk,
30640 20 6f 70 65 6e 20 74 68 65 20 0a 20 20 20 20 20   open the .     
30650 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20   ** journal for 
30660 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
30670 73 2e 20 57 72 69 74 65 20 61 63 63 65 73 73 20  s. Write access 
30680 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63 61  is required beca
30690 75 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e  use .      ** in
306a0 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
306b0 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20  s mode the file 
306c0 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20  descriptor will 
306d0 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a 20 20  be kept open .  
306e0 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73 73 69      ** and possi
306f0 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20 74  bly used for a t
30700 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72  ransaction later
30710 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69 74 65   on. Also, write
30720 2d 61 63 63 65 73 73 20 0a 20 20 20 20 20 20 2a  -access .      *
30730 2a 20 69 73 20 75 73 75 61 6c 6c 79 20 72 65 71  * is usually req
30740 75 69 72 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a  uired to finaliz
30750 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 6e  e the journal in
30760 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65   journal_mode=pe
30770 72 73 69 73 74 20 0a 20 20 20 20 20 20 2a 2a 20  rsist .      ** 
30780 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f 20 66  mode (and also f
30790 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
307a0 74 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f 6d 65  truncate on some
307b0 20 73 79 73 74 65 6d 73 29 2e 0a 20 20 20 20 20   systems)..     
307c0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
307d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  the journal does
307e0 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74 20 75   not exist, it u
307f0 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61  sually means tha
30800 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20 2a 2a  t some .      **
30810 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
30820 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74  n managed to get
30830 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20   in and roll it 
30840 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20  back before .   
30850 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65     ** this conne
30860 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74  ction obtained t
30870 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
30880 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20  k above. Or, it 
30890 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65  .      ** may me
308a0 61 6e 20 74 68 61 74 20 74 68 65 20 70 61 67 65  an that the page
308b0 72 20 77 61 73 20 69 6e 20 74 68 65 20 65 72 72  r was in the err
308c0 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68  or-state when th
308d0 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  is.      ** func
308e0 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20  tion was called 
308f0 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
30900 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
30910 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ist..      */.  
30920 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
30930 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
30940 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
30950 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
30960 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
30970 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 45 78  .        int bEx
30980 69 73 74 73 3b 20 20 20 20 20 20 20 20 20 20 20  ists;           
30990 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f     /* True if jo
309a0 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
309b0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  s */.        rc 
309c0 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
309d0 73 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  s(.            p
309e0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
309f0 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
30a00 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 62 45  CESS_EXISTS, &bE
30a10 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20 20 20  xists);.        
30a20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30a30 4b 20 26 26 20 62 45 78 69 73 74 73 20 29 7b 0a  K && bExists ){.
30a40 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f            int fo
30a50 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ut = 0;.        
30a60 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45    int f = SQLITE
30a70 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
30a80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
30a90 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
30aa0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
30ab0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
30ac0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
30ad0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
30ae0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
30af0 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
30b00 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20  d, f, &fout);.  
30b10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
30b20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
30b30 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
30b40 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  jfd) );.        
30b50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30b60 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49  _OK && fout&SQLI
30b70 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
30b80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30b90 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
30ba0 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OPEN_BKPT;.     
30bb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
30bc0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
30bd0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  d);.          }.
30be0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30bf0 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61  }. .      /* Pla
30c00 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65  yback and delete
30c10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44   the journal.  D
30c20 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65  rop the database
30c30 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20   write.      ** 
30c40 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69  lock and reacqui
30c50 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  re the read lock
30c60 2e 20 50 75 72 67 65 20 74 68 65 20 63 61 63 68  . Purge the cach
30c70 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a  e before.      *
30c80 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  * playing back t
30c90 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73  he hot-journal s
30ca0 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20  o that we don't 
30cb0 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20 20  end up with.    
30cc0 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73    ** an inconsis
30cd0 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e  tent cache.  Syn
30ce0 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61  c the hot journa
30cf0 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67  l before playing
30d00 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63  .      ** it bac
30d10 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63  k since the proc
30d20 65 73 73 20 74 68 61 74 20 63 72 61 73 68 65 64  ess that crashed
30d30 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f   and left the ho
30d40 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  t journal.      
30d50 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20  ** probably did 
30d60 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20  not sync it and 
30d70 77 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20  we are required 
30d80 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20  to always sync. 
30d90 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72       ** the jour
30da0 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69  nal before playi
30db0 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20  ng it back..    
30dc0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69    */.      if( i
30dd0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
30de0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  d) ){.        as
30df0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
30e00 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72  _OK );.        r
30e10 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74  c = pagerSyncHot
30e20 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
30e30 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
30e40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30e50 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
30e60 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
30e70 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  er, 1);.        
30e80 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
30e90 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
30ea0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
30eb0 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72  else if( !pPager
30ec0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
30ed0 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
30ee0 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  UnlockDb(pPager,
30ef0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
30f00 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
30f10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30f20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
30f30 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
30f40 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  en if an error o
30f50 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
30f60 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20  ng to open.     
30f70 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61     ** or roll ba
30f80 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
30f90 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61   while holding a
30fa0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
30fb0 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  . The.        **
30fc0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
30fd0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20  routine will be 
30fe0 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72 65  called before re
30ff0 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63  turning to unloc
31000 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  k.        ** the
31010 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 75 6e   file. If the un
31020 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20 66 61 69  lock attempt fai
31030 6c 73 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 65  ls, then Pager.e
31040 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20 20 20  Lock must be.   
31050 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 55       ** set to U
31060 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65  NKNOWN_LOCK (see
31070 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
31080 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66  ve the #define f
31090 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 55  or .        ** U
310a0 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76  NKNOWN_LOCK abov
310b0 65 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  e for an explana
310c0 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20 20  tion). .        
310d0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e  **.        ** In
310e0 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 70 61   order to get pa
310f0 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20  ger_unlock() to 
31100 64 6f 20 74 68 69 73 2c 20 73 65 74 20 50 61 67  do this, set Pag
31110 65 72 2e 65 53 74 61 74 65 20 74 6f 0a 20 20 20  er.eState to.   
31120 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45 52       ** PAGER_ER
31130 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20 69 73  ROR now. This is
31140 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6f   not actually co
31150 75 6e 74 65 64 20 61 73 20 61 20 74 72 61 6e 73  unted as a trans
31160 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ition.        **
31170 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65 20   to ERROR state 
31180 69 6e 20 74 68 65 20 73 74 61 74 65 20 64 69 61  in the state dia
31190 67 72 61 6d 20 61 74 20 74 68 65 20 74 6f 70 20  gram at the top 
311a0 6f 66 20 74 68 69 73 20 66 69 6c 65 2c 0a 20 20  of this file,.  
311b0 20 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77        ** since w
311c0 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
311d0 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61 67  same call to pag
311e0 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c  er_unlock() will
311f0 20 76 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a   very.        **
31200 20 73 68 6f 72 74 6c 79 20 74 72 61 6e 73 69 74   shortly transit
31210 69 6f 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62  ion the pager ob
31220 6a 65 63 74 20 74 6f 20 74 68 65 20 4f 50 45 4e  ject to the OPEN
31230 20 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a   state. Calling.
31240 20 20 20 20 20 20 20 20 2a 2a 20 61 73 73 65 72          ** asser
31250 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20  t_pager_state() 
31260 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20  would fail now, 
31270 61 73 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74  as it should not
31280 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20 20   be possible.   
31290 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e       ** to be in
312a0 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65   ERROR state whe
312b0 6e 20 74 68 65 72 65 20 61 72 65 20 7a 65 72 6f  n there are zero
312c0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
312d0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  e .        ** re
312e0 66 65 72 65 6e 63 65 73 2e 0a 20 20 20 20 20 20  ferences..      
312f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67    */.        pag
31300 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
31310 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f   rc);.        go
31320 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
31330 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
31340 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
31350 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
31360 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
31370 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48  Pager->eLock==SH
31380 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  ARED_LOCK).     
31390 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
313a0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
313b0 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  && pPager->eLock
313c0 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20  >SHARED_LOCK).  
313d0 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
313e0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
313f0 65 6d 70 46 69 6c 65 20 26 26 20 28 0a 20 20 20  empFile && (.   
31400 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 61       pPager->pBa
31410 63 6b 75 70 20 0a 20 20 20 20 20 7c 7c 20 73 71  ckup .     || sq
31420 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63  lite3PcachePagec
31430 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
31440 61 63 68 65 29 3e 30 20 0a 20 20 20 20 20 7c 7c  ache)>0 .     ||
31450 20 70 50 61 67 65 72 2d 3e 62 55 73 65 46 65 74   pPager->bUseFet
31460 63 68 0a 20 20 20 20 29 29 7b 0a 20 20 20 20 20  ch.    )){.     
31470 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c   /* The shared-l
31480 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65  ock has just bee
31490 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68  n acquired on th
314a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
314b0 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65        ** and the
314c0 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 70  re are already p
314d0 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
314e0 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f  e (from a previo
314f0 75 73 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64  us.      ** read
31500 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
31510 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74  ction).  Check t
31520 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74  o see if the dat
31530 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 68  abase.      ** h
31540 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
31550 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
31560 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20  se has changed, 
31570 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20 20  flush the.      
31580 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20  ** cache..      
31590 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61  **.      ** Data
315a0 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73 20  base changes is 
315b0 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b  detected by look
315c0 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20  ing at 15 bytes 
315d0 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20  beginning.      
315e0 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34 20  ** at offset 24 
315f0 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20  into the file.  
31600 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20 74  The first 4 of t
31610 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61 72  hese 16 bytes ar
31620 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d  e.      ** a 32-
31630 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74  bit counter that
31640 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
31650 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65  with each change
31660 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  .  The.      ** 
31670 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e  other bytes chan
31680 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68  ge randomly with
31690 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67   each file chang
316a0 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  e when.      ** 
316b0 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73  a codec is in us
316c0 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  e..      ** .   
316d0 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61     ** There is a
316e0 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
316f0 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61  ll chance that a
31700 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74   change will not
31710 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65   be .      ** de
31720 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61  tected.  The cha
31730 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65  nce of an undete
31740 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73  cted change is s
31750 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20  o small that.   
31760 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20     ** it can be 
31770 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20  neglected..     
31780 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e   */.      Pgno n
31790 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
317a0 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
317b0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
317c0 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 0a 20 20  bFileVers)];..  
317d0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61      rc = pagerPa
317e0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
317f0 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  &nPage);.      i
31800 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 61 69  f( rc ) goto fai
31810 6c 65 64 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  led;..      if( 
31820 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 20  nPage>0 ){.     
31830 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56     IOTRACE(("CKV
31840 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  ERS %p %d\n", pP
31850 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46  ager, sizeof(dbF
31860 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20  ileVers)));.    
31870 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31880 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
31890 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20  d, &dbFileVers, 
318a0 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
318b0 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20  s), 24);.       
318c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
318d0 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
318e0 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
318f0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  D ){.          g
31900 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
31910 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
31920 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e{.        memse
31930 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c  t(dbFileVers, 0,
31940 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
31950 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  rs));.      }.. 
31960 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28       if( memcmp(
31970 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
31980 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
31990 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
319a0 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  s))!=0 ){.      
319b0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
319c0 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20  ager);..        
319d0 2f 2a 20 55 6e 6d 61 70 20 74 68 65 20 64 61 74  /* Unmap the dat
319e0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 74 20 69  abase file. It i
319f0 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20  s possible that 
31a00 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65 73 73  external process
31a10 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61  es.        ** ma
31a20 79 20 68 61 76 65 20 74 72 75 6e 63 61 74 65 64  y have truncated
31a30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31a40 6c 65 20 61 6e 64 20 74 68 65 6e 20 65 78 74 65  le and then exte
31a50 6e 64 65 64 20 69 74 20 62 61 63 6b 0a 20 20 20  nded it back.   
31a60 20 20 20 20 20 2a 2a 20 74 6f 20 69 74 73 20 6f       ** to its o
31a70 72 69 67 69 6e 61 6c 20 73 69 7a 65 20 77 68 69  riginal size whi
31a80 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  le this process 
31a90 77 61 73 20 6e 6f 74 20 68 6f 6c 64 69 6e 67 20  was not holding 
31aa0 61 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20  a lock..        
31ab0 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
31ac0 74 68 65 72 65 20 6d 61 79 20 65 78 69 73 74 20  there may exist 
31ad0 61 20 50 61 67 65 72 2e 70 4d 61 70 20 6d 61 70  a Pager.pMap map
31ae0 70 69 6e 67 20 74 68 61 74 20 61 70 70 65 61 72  ping that appear
31af0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  s.        ** to 
31b00 62 65 20 74 68 65 20 72 69 67 68 74 20 73 69 7a  be the right siz
31b10 65 20 62 75 74 20 69 73 20 6e 6f 74 20 61 63 74  e but is not act
31b20 75 61 6c 6c 79 20 76 61 6c 69 64 2e 20 41 76 6f  ually valid. Avo
31b30 69 64 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  id this.        
31b40 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 79 20 62  ** possibility b
31b50 79 20 75 6e 6d 61 70 70 69 6e 67 20 74 68 65 20  y unmapping the 
31b60 64 62 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20  db here. */.    
31b70 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
31b80 62 55 73 65 46 65 74 63 68 20 29 7b 0a 20 20 20  bUseFetch ){.   
31b90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
31ba0 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
31bb0 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  fd, 0, 0);.     
31bc0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
31bd0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
31be0 65 72 65 20 69 73 20 61 20 57 41 4c 20 66 69 6c  ere is a WAL fil
31bf0 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  e in the file-sy
31c00 73 74 65 6d 2c 20 6f 70 65 6e 20 74 68 69 73 20  stem, open this 
31c10 64 61 74 61 62 61 73 65 20 69 6e 20 57 41 4c 0a  database in WAL.
31c20 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20 4f 74 68      ** mode. Oth
31c30 65 72 77 69 73 65 2c 20 74 68 65 20 66 6f 6c 6c  erwise, the foll
31c40 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63  owing function c
31c50 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
31c60 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
31c70 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72  pagerOpenWalIfPr
31c80 65 73 65 6e 74 28 70 50 61 67 65 72 29 3b 0a 23  esent(pPager);.#
31c90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
31ca0 49 54 5f 57 41 4c 0a 20 20 20 20 61 73 73 65 72  IT_WAL.    asser
31cb0 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c 3d  t( pPager->pWal=
31cc0 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
31cd0 5f 4f 4b 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  _OK );.#endif.  
31ce0 7d 0a 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  }..  if( pagerUs
31cf0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
31d00 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
31d10 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
31d20 20 72 63 20 3d 20 70 61 67 65 72 42 65 67 69 6e   rc = pagerBegin
31d30 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  ReadTransaction(
31d40 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
31d50 69 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  if( pPager->eSta
31d60 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26  te==PAGER_OPEN &
31d70 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
31d80 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
31d90 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
31da0 72 2c 20 26 70 50 61 67 65 72 2d 3e 64 62 53 69  r, &pPager->dbSi
31db0 7a 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65  ze);.  }.. faile
31dc0 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  d:.  if( rc!=SQL
31dd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
31de0 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
31df0 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
31e00 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73  (pPager);.    as
31e10 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
31e20 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
31e30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
31e40 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
31e50 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a  = PAGER_READER;.
31e60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
31e70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
31e80 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
31e90 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 72   has reached zer
31ea0 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  o, rollback any 
31eb0 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  active.** transa
31ec0 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b  ction and unlock
31ed0 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a   the pager..**.*
31ee0 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63  * Except, in loc
31ef0 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53  king_mode=EXCLUS
31f00 49 56 45 20 77 68 65 6e 20 74 68 65 72 65 20 69  IVE when there i
31f10 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a  s nothing to in.
31f20 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
31f30 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c  journal, the unl
31f40 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f  ock is not perfo
31f50 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20 69  rmed and there i
31f60 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20  s.** nothing to 
31f70 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69  rollback, so thi
31f80 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
31f90 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  o-op..*/ .static
31fa0 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
31fb0 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65 72 20  kIfUnused(Pager 
31fc0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
31fd0 70 50 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74  pPager->nMmapOut
31fe0 3d 3d 30 20 26 26 20 28 73 71 6c 69 74 65 33 50  ==0 && (sqlite3P
31ff0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
32000 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
32010 30 29 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55  0) ){.    pagerU
32020 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
32030 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a  (pPager);.  }.}.
32040 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
32050 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
32060 67 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69  ge number pgno i
32070 6e 20 70 61 67 65 72 20 70 50 61 67 65 72 20 28  n pager pPager (
32080 61 20 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65  a page.** refere
32090 6e 63 65 20 68 61 73 20 74 79 70 65 20 44 62 50  nce has type DbP
320a0 61 67 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65  age*). If the re
320b0 71 75 65 73 74 65 64 20 72 65 66 65 72 65 6e 63  quested referenc
320c0 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73  e is .** success
320d0 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20  fully obtained, 
320e0 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20  it is copied to 
320f0 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49  *ppPage and SQLI
32100 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
32110 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71  **.** If the req
32120 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 61  uested page is a
32130 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61  lready in the ca
32140 63 68 65 2c 20 69 74 20 69 73 20 72 65 74 75 72  che, it is retur
32150 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  ned. .** Otherwi
32160 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20 6f  se, a new page o
32170 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61 74  bject is allocat
32180 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64  ed and populated
32190 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72 65   with data.** re
321a0 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ad from the data
321b0 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73 6f  base file. In so
321c0 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 70 63  me cases, the pc
321d0 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79 0a  ache module may.
321e0 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74 6f  ** choose not to
321f0 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
32200 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64 20  page object and 
32210 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65 78 69  may reuse an exi
32220 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74 20  sting.** object 
32230 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e 64  with no outstand
32240 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 0a  ing references..
32250 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61 20  **.** The extra 
32260 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f  data appended to
32270 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79   a page is alway
32280 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
32290 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20 66   zeros the .** f
322a0 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
322b0 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
322c0 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20 70  memory. If the p
322d0 61 67 65 20 72 65 71 75 65 73 74 65 64 20 69 73  age requested is
322e0 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20   .** already in 
322f0 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 74  the cache when t
32300 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
32310 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  called, then the
32320 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20 69   extra.** data i
32330 73 20 6c 65 66 74 20 61 73 20 69 74 20 77 61 73  s left as it was
32340 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 6f   when the page o
32350 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20 75  bject was last u
32360 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
32370 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
32380 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
32390 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
323a0 61 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a 20  age or if a .** 
323b0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69  non-zero value i
323c0 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
323d0 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d 65  noContent parame
323e0 74 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ter and the .** 
323f0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
32400 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74  s not already st
32410 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61 63 68  ored in the cach
32420 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61  e, then no .** a
32430 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20  ctual disk read 
32440 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20  occurs. In this 
32450 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  case the memory 
32460 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a  image of the .**
32470 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
32480 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f  ized to all zero
32490 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43  s. .**.** If noC
324a0 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20  ontent is true, 
324b0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
324c0 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
324d0 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  ut the contents.
324e0 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  ** of the page. 
324f0 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20 74  This occurs in t
32500 77 6f 20 73 65 70 65 72 61 74 65 20 73 63 65 6e  wo seperate scen
32510 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  arios:.**.**   a
32520 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61  ) When reading a
32530 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
32540 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61  page from the da
32550 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a  tabase, and.**.*
32560 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20 73 61  *   b) When a sa
32570 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67  vepoint is being
32580 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64   rolled back and
32590 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64   we need to load
325a0 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70  .**      a new p
325b0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63  age into the cac
325c0 68 65 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20  he to be filled 
325d0 77 69 74 68 20 74 68 65 20 64 61 74 61 20 72 65  with the data re
325e0 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ad.**      from 
325f0 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f  the savepoint jo
32600 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
32610 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
32620 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  e, then the data
32630 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72   returned is zer
32640 6f 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  oed instead of.*
32650 2a 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f  * being read fro
32660 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
32670 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68  Additionally, th
32680 65 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e  e bits correspon
32690 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20  ding.** to pgno 
326a0 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  in Pager.pInJour
326b0 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70  nal (bitvec of p
326c0 61 67 65 73 20 61 6c 72 65 61 64 79 20 77 72 69  ages already wri
326d0 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a  tten to the.** j
326e0 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64  ournal file) and
326f0 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
32700 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
32710 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20   bitvecs of any 
32720 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  open.** savepoin
32730 74 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73  ts are set. This
32740 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70 61   means if the pa
32750 67 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61  ge is made writa
32760 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f  ble at any.** po
32770 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
32780 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20  e, using a call 
32790 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
327a0 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74  rite(), its cont
327b0 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ents.** will not
327c0 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54   be journaled. T
327d0 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a  his saves IO..**
327e0 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74  .** The acquisit
327f0 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66  ion might fail f
32800 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f  or several reaso
32810 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65  ns.  In all case
32820 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72  s,.** an appropr
32830 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
32840 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
32850 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
32860 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  o NULL..**.** Se
32870 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
32880 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f  gerLookup().  Bo
32890 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  th this routine 
328a0 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74  and Lookup() att
328b0 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
328c0 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
328d0 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
328e0 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
328f0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
32900 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
32910 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
32920 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
32930 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c   it in whereas L
32940 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
32950 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
32960 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
32970 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
32980 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
32990 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
329a0 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
329b0 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
329c0 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
329d0 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
329e0 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76  nce Lookup() nev
329f0 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c  er goes to disk,
32a00 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f   it never has to
32a10 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73   deal with locks
32a20 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  .** or journal f
32a30 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iles..*/.int sql
32a40 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
32a50 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
32a60 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  r,      /* The p
32a70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ager open on the
32a80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
32a90 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
32aa0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
32ab0 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20  number to fetch 
32ac0 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70  */.  DbPage **pp
32ad0 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74  Page,    /* Writ
32ae0 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
32af0 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  he page here */.
32b00 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
32b10 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 41        /* PAGER_A
32b20 43 51 55 49 52 45 5f 58 58 58 20 66 6c 61 67 73  CQUIRE_XXX flags
32b30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
32b40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
32b50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20  gHdr *pPg = 0;. 
32b60 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30 3b   u32 iFrame = 0;
32b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b80 20 2f 2a 20 46 72 61 6d 65 20 74 6f 20 72 65 61   /* Frame to rea
32b90 64 20 66 72 6f 6d 20 57 41 4c 20 66 69 6c 65 20  d from WAL file 
32ba0 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  */.  const int n
32bb0 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 66 6c 61 67  oContent = (flag
32bc0 73 20 26 20 50 41 47 45 52 5f 41 43 51 55 49 52  s & PAGER_ACQUIR
32bd0 45 5f 4e 4f 43 4f 4e 54 45 4e 54 29 3b 0a 0a 20  E_NOCONTENT);.. 
32be0 20 2f 2a 20 49 74 20 69 73 20 61 63 63 65 70 74   /* It is accept
32bf0 61 62 6c 65 20 74 6f 20 75 73 65 20 61 20 72 65  able to use a re
32c00 61 64 2d 6f 6e 6c 79 20 28 6d 6d 61 70 29 20 70  ad-only (mmap) p
32c10 61 67 65 20 66 6f 72 20 61 6e 79 20 70 61 67 65  age for any page
32c20 20 65 78 63 65 70 74 0a 20 20 2a 2a 20 70 61 67   except.  ** pag
32c30 65 20 31 20 69 66 20 74 68 65 72 65 20 69 73 20  e 1 if there is 
32c40 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
32c50 74 69 6f 6e 20 6f 70 65 6e 20 6f 72 20 74 68 65  tion open or the
32c60 20 41 43 51 55 49 52 45 5f 52 45 41 44 4f 4e 4c   ACQUIRE_READONL
32c70 59 0a 20 20 2a 2a 20 66 6c 61 67 20 77 61 73 20  Y.  ** flag was 
32c80 73 70 65 63 69 66 69 65 64 20 62 79 20 74 68 65  specified by the
32c90 20 63 61 6c 6c 65 72 2e 20 41 6e 64 20 73 6f 20   caller. And so 
32ca0 6c 6f 6e 67 20 61 73 20 74 68 65 20 64 62 20 69  long as the db i
32cb0 73 20 6e 6f 74 20 61 20 0a 20 20 2a 2a 20 74 65  s not a .  ** te
32cc0 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
32cd0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 20  mory database.  
32ce0 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 62  */.  const int b
32cf0 4d 6d 61 70 4f 6b 20 3d 20 28 70 67 6e 6f 21 3d  MmapOk = (pgno!=
32d00 31 20 26 26 20 70 50 61 67 65 72 2d 3e 62 55 73  1 && pPager->bUs
32d10 65 46 65 74 63 68 0a 20 20 20 26 26 20 28 70 50  eFetch.   && (pP
32d20 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
32d30 47 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 28 66  GER_READER || (f
32d40 6c 61 67 73 20 26 20 50 41 47 45 52 5f 41 43 51  lags & PAGER_ACQ
32d50 55 49 52 45 5f 52 45 41 44 4f 4e 4c 59 29 29 0a  UIRE_READONLY)).
32d60 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20    );..  assert( 
32d70 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
32d80 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a  PAGER_READER );.
32d90 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74    assert( assert
32da0 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61  _pager_state(pPa
32db0 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ger) );.  assert
32dc0 28 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 20 7c  ( noContent==0 |
32dd0 7c 20 62 4d 6d 61 70 4f 6b 3d 3d 30 20 29 3b 0a  | bMmapOk==0 );.
32de0 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29  .  if( pgno==0 )
32df0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
32e00 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
32e10 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
32e20 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
32e30 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
32e40 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
32e50 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20 20  immediately. .  
32e60 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
32e70 71 75 65 73 74 20 74 68 65 20 70 61 67 65 20 66  quest the page f
32e80 72 6f 6d 20 74 68 65 20 50 43 61 63 68 65 20 6c  rom the PCache l
32e90 61 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70  ayer. */.  if( p
32ea0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
32eb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32ec0 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
32ed0 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rCode;.  }else{.
32ee0 0a 20 20 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b  .    if( bMmapOk
32ef0 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c 28   && pagerUseWal(
32f00 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
32f10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
32f20 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72  FindFrame(pPager
32f30 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69  ->pWal, pgno, &i
32f40 46 72 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  Frame);.      if
32f50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
32f60 29 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71  ) goto pager_acq
32f70 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  uire_err;.    }.
32f80 0a 20 20 20 20 69 66 28 20 69 46 72 61 6d 65 3d  .    if( iFrame=
32f90 3d 30 20 26 26 20 62 4d 6d 61 70 4f 6b 20 29 7b  =0 && bMmapOk ){
32fa0 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 44 61  .      void *pDa
32fb0 74 61 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 72  ta = 0;..      r
32fc0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 65 74  c = sqlite3OsFet
32fd0 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 0a  ch(pPager->fd, .
32fe0 20 20 20 20 20 20 20 20 20 20 28 69 36 34 29 28            (i64)(
32ff0 70 67 6e 6f 2d 31 29 20 2a 20 70 50 61 67 65 72  pgno-1) * pPager
33000 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 61 67  ->pageSize, pPag
33010 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 26 70  er->pageSize, &p
33020 44 61 74 61 0a 20 20 20 20 20 20 29 3b 0a 0a 20  Data.      );.. 
33030 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
33040 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61 20  ITE_OK && pData 
33050 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
33060 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41  Pager->eState>PA
33070 47 45 52 5f 52 45 41 44 45 52 20 29 7b 0a 20 20  GER_READER ){.  
33080 20 20 20 20 20 20 20 20 28 76 6f 69 64 29 73 71          (void)sq
33090 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
330a0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
330b0 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29  , pgno, 0, &pPg)
330c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
330d0 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29      if( pPg==0 )
330e0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
330f0 20 70 61 67 65 72 41 63 71 75 69 72 65 4d 61 70   pagerAcquireMap
33100 50 61 67 65 28 70 50 61 67 65 72 2c 20 70 67 6e  Page(pPager, pgn
33110 6f 2c 20 70 44 61 74 61 2c 20 26 70 50 67 29 3b  o, pData, &pPg);
33120 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
33130 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
33140 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61 67 65  3OsUnfetch(pPage
33150 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e  r->fd, (i64)(pgn
33160 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70 61 67  o-1)*pPager->pag
33170 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20  eSize, pData);. 
33180 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33190 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
331a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
331b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
331c0 20 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65           *ppPage
331d0 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20 20 20   = pPg;.        
331e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
331f0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OK;.        }.  
33200 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
33210 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
33220 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
33230 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
33240 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
33250 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33260 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67  PcacheFetch(pPag
33270 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
33280 6f 2c 20 31 2c 20 70 70 50 61 67 65 29 3b 0a 20  o, 1, ppPage);. 
33290 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51   }..  if( rc!=SQ
332a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
332b0 2a 20 45 69 74 68 65 72 20 74 68 65 20 63 61 6c  * Either the cal
332c0 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 63 61 63  l to sqlite3Pcac
332d0 68 65 46 65 74 63 68 28 29 20 72 65 74 75 72 6e  heFetch() return
332e0 65 64 20 61 6e 20 65 72 72 6f 72 20 6f 72 20 74  ed an error or t
332f0 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20  he.    ** pager 
33300 77 61 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74  was already in t
33310 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77  he error-state w
33320 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
33330 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20  n was called..  
33340 20 20 2a 2a 20 53 65 74 20 70 50 67 20 74 6f 20    ** Set pPg to 
33350 30 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68  0 and jump to th
33360 65 20 65 78 63 65 70 74 69 6f 6e 20 68 61 6e 64  e exception hand
33370 6c 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67  ler.  */.    pPg
33380 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70   = 0;.    goto p
33390 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
333a0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
333b0 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d  (*ppPage)->pgno=
333c0 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  =pgno );.  asser
333d0 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50  t( (*ppPage)->pP
333e0 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20  ager==pPager || 
333f0 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65  (*ppPage)->pPage
33400 72 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28  r==0 );..  if( (
33410 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72  *ppPage)->pPager
33420 20 26 26 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29   && !noContent )
33430 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73  {.    /* In this
33440 20 63 61 73 65 20 74 68 65 20 70 63 61 63 68 65   case the pcache
33450 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69 6e   already contain
33460 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64  s an initialized
33470 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a 20   copy of.    ** 
33480 74 68 65 20 70 61 67 65 2e 20 52 65 74 75 72 6e  the page. Return
33490 20 77 69 74 68 6f 75 74 20 66 75 72 74 68 65 72   without further
334a0 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61 73   ado.  */.    as
334b0 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47 45  sert( pgno<=PAGE
334c0 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70 67  R_MAX_PGNO && pg
334d0 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no!=PAGER_MJ_PGN
334e0 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  O(pPager) );.   
334f0 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50   pPager->aStat[P
33500 41 47 45 52 5f 53 54 41 54 5f 48 49 54 5d 2b 2b  AGER_STAT_HIT]++
33510 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
33520 49 54 45 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65  ITE_OK;..  }else
33530 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  {.    /* The pag
33540 65 72 20 63 61 63 68 65 20 68 61 73 20 63 72 65  er cache has cre
33550 61 74 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e  ated a new page.
33560 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65   Its content nee
33570 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65  ds to .    ** be
33580 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a   initialized.  *
33590 2f 0a 0a 20 20 20 20 70 50 67 20 3d 20 2a 70 70  /..    pPg = *pp
335a0 50 61 67 65 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Page;.    pPg->p
335b0 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
335c0 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69  .    /* The maxi
335d0 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20  mum page number 
335e0 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20  is 2^31. Return 
335f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
33600 66 20 61 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  f a page.    ** 
33610 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
33620 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 74 68 65  han this, or the
33630 20 75 6e 75 73 65 64 20 6c 6f 63 6b 69 6e 67 2d   unused locking-
33640 70 61 67 65 2c 20 69 73 20 72 65 71 75 65 73 74  page, is request
33650 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
33660 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47  gno>PAGER_MAX_PG
33670 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  NO || pgno==PAGE
33680 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
33690 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
336a0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
336b0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
336c0 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
336d0 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  r;.    }..    if
336e0 28 20 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67 65  ( MEMDB || pPage
336f0 72 2d 3e 64 62 53 69 7a 65 3c 70 67 6e 6f 20 7c  r->dbSize<pgno |
33700 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c 20 21  | noContent || !
33710 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
33720 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  d) ){.      if( 
33730 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50  pgno>pPager->mxP
33740 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72  gno ){.        r
33750 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
33760 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
33770 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
33780 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
33790 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a  f( noContent ){.
337a0 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75          /* Failu
337b0 72 65 20 74 6f 20 73 65 74 20 74 68 65 20 62 69  re to set the bi
337c0 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72  ts in the InJour
337d0 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20  nal bit-vectors 
337e0 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20  is benign..     
337f0 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20     ** It merely 
33800 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69  means that we mi
33810 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72  ght do some extr
33820 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61  a work to journa
33830 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  l a .        ** 
33840 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
33850 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f  ot need to be jo
33860 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74  urnaled.  Nevert
33870 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20  heless, be sure 
33880 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  .        ** to t
33890 65 73 74 20 74 68 65 20 63 61 73 65 20 77 68 65  est the case whe
338a0 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  re a malloc erro
338b0 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
338c0 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20  rying to set .  
338d0 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69        ** a bit i
338e0 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a  n a bit vector..
338f0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
33900 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
33910 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
33920 20 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c         if( pgno<
33930 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
33940 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
33950 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20   TESTONLY( rc = 
33960 29 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  ) sqlite3BitvecS
33970 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  et(pPager->pInJo
33980 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20  urnal, pgno);.  
33990 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
339a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
339b0 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  EM );.        }.
339c0 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59          TESTONLY
339d0 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61  ( rc = ) addToSa
339e0 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
339f0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
33a00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
33a10 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
33a20 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
33a30 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
33a40 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  oc();.      }.  
33a50 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e      memset(pPg->
33a60 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72  pData, 0, pPager
33a70 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
33a80 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52     IOTRACE(("ZER
33a90 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  O %p %d\n", pPag
33aa0 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  er, pgno));.    
33ab0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
33ac0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
33ad0 67 65 72 29 20 26 26 20 62 4d 6d 61 70 4f 6b 3d  ger) && bMmapOk=
33ae0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
33af0 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46 69 6e   = sqlite3WalFin
33b00 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70  dFrame(pPager->p
33b10 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46 72 61  Wal, pgno, &iFra
33b20 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  me);.        if(
33b30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
33b40 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75   goto pager_acqu
33b50 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  ire_err;.      }
33b60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
33b70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
33b80 65 72 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67  er );.      pPag
33b90 65 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f  er->aStat[PAGER_
33ba0 53 54 41 54 5f 4d 49 53 53 5d 2b 2b 3b 0a 20 20  STAT_MISS]++;.  
33bb0 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50      rc = readDbP
33bc0 61 67 65 28 70 50 67 2c 20 69 46 72 61 6d 65 29  age(pPg, iFrame)
33bd0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
33be0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33bf0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
33c00 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
33c10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
33c20 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
33c30 68 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72  h(pPg);.  }..  r
33c40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
33c50 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  ..pager_acquire_
33c60 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28 20 72  err:.  assert( r
33c70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
33c80 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
33c90 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
33ca0 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  op(pPg);.  }.  p
33cb0 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
33cc0 65 64 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2a  ed(pPager);..  *
33cd0 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65  ppPage = 0;.  re
33ce0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
33cf0 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
33d00 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
33d10 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  y in the in-memo
33d20 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a  ry cache.  Do.**
33d30 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61   not read the pa
33d40 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52  ge from disk.  R
33d50 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
33d60 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20  to the page,.** 
33d70 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65  or 0 if the page
33d80 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
33d90 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  . .**.** See als
33da0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
33db0 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72  t().  The differ
33dc0 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
33dd0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64  s routine.** and
33de0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
33df0 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28  () is that _get(
33e00 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65  ) will go to the
33e10 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a   disk and read.*
33e20 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66  * in the page if
33e30 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
33e40 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68   already in cach
33e50 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
33e60 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  .** returns NULL
33e70 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
33e80 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
33e90 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72  if a disk I/O er
33ea0 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72  ror .** has ever
33eb0 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62   happened..*/.Db
33ec0 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67  Page *sqlite3Pag
33ed0 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  erLookup(Pager *
33ee0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
33ef0 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
33f00 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
33f10 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
33f20 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
33f30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
33f40 65 72 2d 3e 70 50 43 61 63 68 65 21 3d 30 20 29  er->pPCache!=0 )
33f50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
33f60 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
33f70 52 5f 52 45 41 44 45 52 20 26 26 20 70 50 61 67  R_READER && pPag
33f80 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
33f90 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 73 71 6c  R_ERROR );.  sql
33fa0 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
33fb0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
33fc0 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b   pgno, 0, &pPg);
33fd0 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d  .  return pPg;.}
33fe0 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
33ff0 61 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  a page reference
34000 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
34010 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
34020 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
34030 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68  drop to zero, th
34040 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69  en the.** page i
34050 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c  s added to the L
34060 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61  RU list.  When a
34070 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ll references to
34080 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72   all pages.** ar
34090 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f  e released, a ro
340a0 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e  llback occurs an
340b0 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
340c0 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a  e database is.**
340d0 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69   removed..*/.voi
340e0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  d sqlite3PagerUn
340f0 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  ref(DbPage *pPg)
34100 7b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  {.  if( pPg ){. 
34110 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
34120 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
34130 20 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61      if( pPg->fla
34140 67 73 20 26 20 50 47 48 44 52 5f 4d 4d 41 50 20  gs & PGHDR_MMAP 
34150 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 52 65  ){.      pagerRe
34160 6c 65 61 73 65 4d 61 70 50 61 67 65 28 70 50 67  leaseMapPage(pPg
34170 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
34180 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
34190 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20  eRelease(pPg);. 
341a0 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e     }.    pagerUn
341b0 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61  lockIfUnused(pPa
341c0 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ger);.  }.}../*.
341d0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
341e0 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68   is called at th
341f0 65 20 73 74 61 72 74 20 6f 66 20 65 76 65 72 79  e start of every
34200 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
34210 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  on..** There mus
34220 74 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52  t already be a R
34230 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
34240 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
34250 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
34260 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
34270 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
34280 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a  **.** Open the j
34290 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
342a0 70 61 67 65 72 20 70 50 61 67 65 72 20 61 6e 64  pager pPager and
342b0 20 77 72 69 74 65 20 61 20 6a 6f 75 72 6e 61 6c   write a journal
342c0 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f 20 74 68   header.** to th
342d0 65 20 73 74 61 72 74 20 6f 66 20 69 74 2e 20 49  e start of it. I
342e0 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
342f0 76 65 20 73 61 76 65 70 6f 69 6e 74 73 2c 20 6f  ve savepoints, o
34300 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  pen the sub-jour
34310 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c 6c 2e 20  nal.** as well. 
34320 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
34330 20 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20   only used when 
34340 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
34350 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a 20 6f 70   is being .** op
34360 65 6e 65 64 20 74 6f 20 77 72 69 74 65 20 61 20  ened to write a 
34370 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20 66 6f 72  rollback log for
34380 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
34390 49 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 0a  It is not used .
343a0 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  ** when opening 
343b0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 66 69  a hot journal fi
343c0 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61  le to roll it ba
343d0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
343e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
343f0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 28 61   already open (a
34400 73 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20 65  s it may be in e
34410 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 29 2c 0a  xclusive mode),.
34420 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  ** then this fun
34430 63 74 69 6f 6e 20 6a 75 73 74 20 77 72 69 74 65  ction just write
34440 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  s a journal head
34450 65 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  er to the start 
34460 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72 65 61 64  of the.** alread
34470 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20 0a 2a 2a  y open file. .**
34480 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e  .** Whether or n
34490 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ot the journal f
344a0 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 62 79  ile is opened by
344b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
344c0 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e  the.** Pager.pIn
344d0 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65 63 20 73  Journal bitvec s
344e0 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f  tructure is allo
344f0 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  cated..**.** Ret
34500 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
34510 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
34520 75 63 63 65 73 73 66 75 6c 2e 20 4f 74 68 65 72  uccessful. Other
34530 77 69 73 65 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  wise, return .**
34540 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66   SQLITE_NOMEM if
34550 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
34560 61 6c 6c 6f 63 61 74 65 20 50 61 67 65 72 2e 70  allocate Pager.p
34570 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69 6c 73 2c  InJournal fails,
34580 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f 20 65 72   or .** an IO er
34590 72 6f 72 20 63 6f 64 65 20 69 66 20 6f 70 65 6e  ror code if open
345a0 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
345b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
345c0 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  fails..*/.static
345d0 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f   int pager_open_
345e0 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  journal(Pager *p
345f0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
34600 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
34610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34620 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
34630 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
34640 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66  _vfs * const pVf
34650 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
34660 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63  ;   /* Local cac
34670 68 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65  he of vfs pointe
34680 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
34690 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
346a0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
346b0 4b 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  KED );.  assert(
346c0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
346d0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
346e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
346f0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
34700 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 6c 72  ;.  .  /* If alr
34710 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f  eady in the erro
34720 72 20 73 74 61 74 65 2c 20 74 68 69 73 20 66 75  r state, this fu
34730 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
34740 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20 2a 2a 20  p.  But on.  ** 
34750 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
34760 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
34770 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69 66 20  never called if 
34780 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69  we are already i
34790 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20  n.  ** an error 
347a0 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20  state. */.  if( 
347b0 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72  NEVER(pPager->er
347c0 72 43 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20  rCode) ) return 
347d0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
347e0 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72 55 73  ..  if( !pagerUs
347f0 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20  eWal(pPager) && 
34800 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
34810 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
34820 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20  ALMODE_OFF ){.  
34830 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
34840 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  rnal = sqlite3Bi
34850 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65  tvecCreate(pPage
34860 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20  r->dbSize);.    
34870 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  if( pPager->pInJ
34880 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ournal==0 ){.   
34890 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
348a0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
348b0 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  .    /* Open the
348c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
348d0 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
348e0 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 20 20  dy open. */.    
348f0 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
34900 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
34910 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
34920 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
34930 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
34940 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ORY ){.        s
34950 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
34960 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
34970 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
34980 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e          const in
34990 74 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20  t flags =       
349a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
349b0 46 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e  FS flags to open
349c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
349d0 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
349e0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
349f0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
34a00 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 28  ATE|.          (
34a10 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
34a20 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   ? .            
34a30 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c  (SQLITE_OPEN_DEL
34a40 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54  ETEONCLOSE|SQLIT
34a50 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
34a60 4e 41 4c 29 3a 0a 20 20 20 20 20 20 20 20 20 20  NAL):.          
34a70 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d    (SQLITE_OPEN_M
34a80 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20  AIN_JOURNAL).   
34a90 20 20 20 20 20 20 20 29 3b 0a 20 20 23 69 66 64         );.  #ifd
34aa0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
34ab0 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
34ac0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
34ad0 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20  e3JournalOpen(. 
34ae0 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c             pVfs,
34af0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
34b00 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
34b10 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65  flags, jrnlBuffe
34b20 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20  rSize(pPager).  
34b30 20 20 20 20 20 20 29 3b 0a 20 20 23 65 6c 73 65        );.  #else
34b40 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
34b50 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
34b60 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
34b70 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
34b80 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 23 65   flags, 0);.  #e
34b90 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20  ndif.      }.   
34ba0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
34bb0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
34bc0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
34bd0 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20  );.    }.  .  . 
34be0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
34bf0 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
34c00 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72  ader to the jour
34c10 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65  nal file and ope
34c20 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75  n .    ** the su
34c30 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  b-journal if nec
34c40 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20  essary..    */. 
34c50 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
34c60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
34c70 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20   TODO: Check if 
34c80 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65  all of these are
34c90 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64   really required
34ca0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65  . */.      pPage
34cb0 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
34cc0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
34cd0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
34ce0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
34cf0 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  er = 0;.      pP
34d00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
34d10 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
34d20 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
34d30 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
34d40 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53    }..  if( rc!=S
34d50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34d60 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
34d70 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
34d80 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50  Journal);.    pP
34d90 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
34da0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
34db0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
34dc0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
34dd0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
34de0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
34df0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49  tate = PAGER_WRI
34e00 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20  TER_CACHEMOD;.  
34e10 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
34e20 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
34e30 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
34e40 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  on on the specif
34e50 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74  ied pager object
34e60 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65  . If a .** write
34e70 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73  -transaction has
34e80 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70   already been op
34e90 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ened, this funct
34ea0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
34eb0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46  **.** If the exF
34ec0 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20  lag argument is 
34ed0 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75  false, then acqu
34ee0 69 72 65 20 61 74 20 6c 65 61 73 74 20 61 20 52  ire at least a R
34ef0 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20  ESERVED.** lock 
34f00 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
34f10 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20  file. If exFlag 
34f20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63  is true, then ac
34f30 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a  quire at least.*
34f40 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  * an EXCLUSIVE l
34f50 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ock. If such a l
34f60 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
34f70 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20  eld, no locking 
34f80 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65  .** functions ne
34f90 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ed be called..**
34fa0 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49  .** If the subjI
34fb0 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74  nMemory argument
34fc0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
34fd0 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e  en any sub-journ
34fe0 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74  al opened.** wit
34ff0 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hin this transac
35000 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65  tion will be ope
35010 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d  ned as an in-mem
35020 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a  ory file. This.*
35030 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20  * has no effect 
35040 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  if the sub-journ
35050 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  al is already op
35060 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79 20  ened (as it may 
35070 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69  be when.** runni
35080 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
35090 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65 20  mode) or if the 
350a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73  transaction does
350b0 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a   not require a.*
350c0 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49  * sub-journal. I
350d0 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f  f the subjInMemo
350e0 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a  ry argument is z
350f0 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65  ero, then any re
35100 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f  quired.** sub-jo
35110 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65  urnal is impleme
35120 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69  nted in-memory i
35130 66 20 70 50 61 67 65 72 20 69 73 20 61 6e 20 69  f pPager is an i
35140 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
35150 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20  e, .** or using 
35160 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
35170 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69   otherwise..*/.i
35180 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42  nt sqlite3PagerB
35190 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  egin(Pager *pPag
351a0 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20  er, int exFlag, 
351b0 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  int subjInMemory
351c0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
351d0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
351e0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
351f0 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
35200 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 73 73 65  >errCode;.  asse
35210 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
35220 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
35230 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
35240 74 65 3c 50 41 47 45 52 5f 45 52 52 4f 52 20 29  te<PAGER_ERROR )
35250 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a  ;.  pPager->subj
35260 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73  InMemory = (u8)s
35270 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20  ubjInMemory;..  
35280 69 66 28 20 41 4c 57 41 59 53 28 70 50 61 67 65  if( ALWAYS(pPage
35290 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
352a0 5f 52 45 41 44 45 52 29 20 29 7b 0a 20 20 20 20  _READER) ){.    
352b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
352c0 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
352d0 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55  ..    if( pagerU
352e0 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
352f0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
35300 20 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69 67   pager is config
35310 75 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b  ured to use lock
35320 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
35330 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20 20  ve, and an.     
35340 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   ** exclusive lo
35350 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
35360 73 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  se is not alread
35370 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69  y held, obtain i
35380 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a  t now..      */.
35390 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
353a0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
353b0 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63  && sqlite3WalExc
353c0 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65  lusiveMode(pPage
353d0 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a  r->pWal, -1) ){.
353e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
353f0 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
35400 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
35410 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
35420 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
35430 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
35440 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
35450 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
35460 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50  ExclusiveMode(pP
35470 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a  ager->pWal, 1);.
35480 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
35490 2a 20 47 72 61 62 20 74 68 65 20 77 72 69 74 65  * Grab the write
354a0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67   lock on the log
354b0 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73   file. If succes
354c0 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f  sful, upgrade to
354d0 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f  .      ** PAGER_
354e0 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20  RESERVED state. 
354f0 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
35500 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
35510 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  to the caller.. 
35520 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79       ** The busy
35530 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20  -handler is not 
35540 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68  invoked if anoth
35550 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c  er connection al
35560 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68  ready.      ** h
35570 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c  olds the write-l
35580 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ock. If possible
35590 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  , the upper laye
355a0 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a  r will call it..
355b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
355c0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65  c = sqlite3WalBe
355d0 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74  ginWriteTransact
355e0 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
355f0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
35600 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20      /* Obtain a 
35610 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
35620 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
35630 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61  le. If the exFla
35640 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20  g parameter.    
35650 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68    ** is true, th
35660 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75  en immediately u
35670 70 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61  pgrade this to a
35680 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
35690 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 62  . The.      ** b
356a0 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
356b0 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64  back can be used
356c0 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
356d0 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  to the EXCLUSIVE
356e0 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20  .      ** lock, 
356f0 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74  but not when obt
35700 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52  aining the RESER
35710 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  VED lock..      
35720 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
35730 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72  gerLockDb(pPager
35740 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
35750 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
35760 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 46  SQLITE_OK && exF
35770 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72  lag ){.        r
35780 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
35790 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
357a0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
357b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
357c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
357d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
357e0 20 43 68 61 6e 67 65 20 74 6f 20 57 52 49 54 45   Change to WRITE
357f0 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 2e 0a  R_LOCKED state..
35800 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
35810 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74 73 20  * WAL mode sets 
35820 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 20  Pager.eState to 
35830 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
35840 4b 45 44 20 6f 72 20 43 41 43 48 45 4d 4f 44 0a  KED or CACHEMOD.
35850 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 69 74        ** when it
35860 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 74 72 61   has an open tra
35870 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20 6e 65  nsaction, but ne
35880 76 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f 72 20  ver to DBMOD or 
35890 46 49 4e 49 53 48 45 44 2e 0a 20 20 20 20 20 20  FINISHED..      
358a0 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63 61 75  ** This is becau
358b0 73 65 20 69 6e 20 74 68 6f 73 65 20 73 74 61 74  se in those stat
358c0 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72  es the code to r
358d0 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65 70 6f 69  oll back savepoi
358e0 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61  nt .      ** tra
358f0 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79 20 63 6f  nsactions may co
35900 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  py data from the
35910 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 6e 74   sub-journal int
35920 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  o the database .
35930 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73        ** file as
35940 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20 74 68   well as into th
35950 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 57 68  e page cache. Wh
35960 69 63 68 20 77 6f 75 6c 64 20 62 65 20 69 6e 63  ich would be inc
35970 6f 72 72 65 63 74 20 69 6e 20 0a 20 20 20 20 20  orrect in .     
35980 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a 20 20   ** WAL mode..  
35990 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61      */.      pPa
359a0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
359b0 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
359c0 44 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  D;.      pPager-
359d0 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50  >dbHintSize = pP
359e0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
359f0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
35a00 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  leSize = pPager-
35a10 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  >dbSize;.      p
35a20 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
35a30 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
35a40 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ze;.      pPager
35a50 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
35a60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
35a70 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
35a80 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OK || pPager->eS
35a90 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
35aa0 45 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ER );.    assert
35ab0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
35ac0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
35ad0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
35ae0 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 61 73  LOCKED );.    as
35af0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
35b00 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
35b10 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52   );.  }..  PAGER
35b20 54 52 41 43 45 28 28 22 54 52 41 4e 53 41 43 54  TRACE(("TRANSACT
35b30 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ION %d\n", PAGER
35b40 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
35b50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
35b60 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c  .** Mark a singl
35b70 65 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  e data page as w
35b80 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61  riteable. The pa
35b90 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
35ba0 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20  to the .** main 
35bb0 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a  journal or sub-j
35bc0 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72  ournal as requir
35bd0 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ed. If the page 
35be0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  is written into.
35bf0 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  ** one of the jo
35c00 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72  urnals, the corr
35c10 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
35c20 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20   set in the .** 
35c30 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
35c40 20 62 69 74 76 65 63 20 61 6e 64 20 74 68 65 20   bitvec and the 
35c50 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
35c60 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76  InSavepoint bitv
35c70 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70  ecs.** of any op
35c80 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73  en savepoints as
35c90 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f   appropriate..*/
35ca0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
35cb0 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70  r_write(PgHdr *p
35cc0 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61  Pg){.  void *pDa
35cd0 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
35ce0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
35cf0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
35d00 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
35d10 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  E_OK;..  /* This
35d20 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20   routine is not 
35d30 63 61 6c 6c 65 64 20 75 6e 6c 65 73 73 20 61 20  called unless a 
35d40 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
35d50 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 0a 20  n has already . 
35d60 20 2a 2a 20 62 65 65 6e 20 73 74 61 72 74 65 64   ** been started
35d70 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
35d80 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  le may or may no
35d90 74 20 62 65 20 6f 70 65 6e 20 61 74 20 74 68 69  t be open at thi
35da0 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 49 74  s point..  ** It
35db0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
35dc0 20 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74   in the ERROR st
35dd0 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ate..  */.  asse
35de0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
35df0 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
35e00 5f 4c 4f 43 4b 45 44 0a 20 20 20 20 20 20 20 7c  _LOCKED.       |
35e10 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
35e20 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  ==PAGER_WRITER_C
35e30 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20 20 7c  ACHEMOD.       |
35e40 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
35e50 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44  ==PAGER_WRITER_D
35e60 42 4d 4f 44 0a 20 20 29 3b 0a 20 20 61 73 73 65  BMOD.  );.  asse
35e70 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
35e80 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
35e90 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
35ea0 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 65  ror has been pre
35eb0 76 69 6f 75 73 6c 79 20 64 65 74 65 63 74 65 64  viously detected
35ec0 2c 20 72 65 70 6f 72 74 20 74 68 65 20 73 61 6d  , report the sam
35ed0 65 20 65 72 72 6f 72 0a 20 20 2a 2a 20 61 67 61  e error.  ** aga
35ee0 69 6e 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20  in. This should 
35ef0 6e 6f 74 20 68 61 70 70 65 6e 2c 20 62 75 74 20  not happen, but 
35f00 74 68 65 20 63 68 65 63 6b 20 70 72 6f 76 69 64  the check provid
35f10 65 73 20 72 6f 62 75 73 74 6e 65 73 73 2e 20 2a  es robustness. *
35f20 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  /.  if( NEVER(pP
35f30 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29  ager->errCode) )
35f40 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
35f50 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20  >errCode;..  /* 
35f60 48 69 67 68 65 72 2d 6c 65 76 65 6c 20 72 6f 75  Higher-level rou
35f70 74 69 6e 65 73 20 6e 65 76 65 72 20 63 61 6c 6c  tines never call
35f80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
35f90 66 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  f database is no
35fa0 74 0a 20 20 2a 2a 20 77 72 69 74 61 62 6c 65 2e  t.  ** writable.
35fb0 20 20 42 75 74 20 63 68 65 63 6b 20 61 6e 79 77    But check anyw
35fc0 61 79 2c 20 6a 75 73 74 20 66 6f 72 20 72 6f 62  ay, just for rob
35fd0 75 73 74 6e 65 73 73 2e 20 2a 2f 0a 20 20 69 66  ustness. */.  if
35fe0 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
35ff0 72 65 61 64 4f 6e 6c 79 29 20 29 20 72 65 74 75  readOnly) ) retu
36000 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
36010 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50  .  CHECK_PAGE(pP
36020 67 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f  g);..  /* The jo
36030 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73  urnal file needs
36040 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 2e 20 48   to be opened. H
36050 69 67 68 65 72 20 6c 65 76 65 6c 20 72 6f 75 74  igher level rout
36060 69 6e 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ines have alread
36070 79 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64 20  y.  ** obtained 
36080 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 6c 6f  the necessary lo
36090 63 6b 73 20 74 6f 20 62 65 67 69 6e 20 74 68 65  cks to begin the
360a0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
360b0 6f 6e 2c 20 62 75 74 20 74 68 65 0a 20 20 2a 2a  on, but the.  **
360c0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
360d0 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79 65 74 20  l might not yet 
360e0 62 65 20 6f 70 65 6e 2e 20 4f 70 65 6e 20 69 74  be open. Open it
360f0 20 6e 6f 77 20 69 66 20 74 68 69 73 20 69 73 20   now if this is 
36100 74 68 65 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20  the case..  **. 
36110 20 2a 2a 20 54 68 69 73 20 69 73 20 64 6f 6e 65   ** This is done
36120 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
36130 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
36140 65 44 69 72 74 79 28 29 20 6f 6e 20 74 68 65 20  eDirty() on the 
36150 70 61 67 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65  page. .  ** Othe
36160 72 77 69 73 65 2c 20 69 66 20 69 74 20 77 65 72  rwise, if it wer
36170 65 20 64 6f 6e 65 20 61 66 74 65 72 20 63 61 6c  e done after cal
36180 6c 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63  ling sqlite3Pcac
36190 68 65 4d 61 6b 65 44 69 72 74 79 28 29 2c 20 74  heMakeDirty(), t
361a0 68 65 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f  hen.  ** an erro
361b0 72 20 6d 69 67 68 74 20 6f 63 63 75 72 20 61 6e  r might occur an
361c0 64 20 74 68 65 20 70 61 67 65 72 20 77 6f 75 6c  d the pager woul
361d0 64 20 65 6e 64 20 75 70 20 69 6e 20 57 52 49 54  d end up in WRIT
361e0 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65 0a  ER_LOCKED state.
361f0 20 20 2a 2a 20 77 69 74 68 20 70 61 67 65 73 20    ** with pages 
36200 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 20  marked as dirty 
36210 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 20 20  in the cache..  
36220 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
36230 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
36240 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 7b 0a  RITER_LOCKED ){.
36250 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f      rc = pager_o
36260 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67  pen_journal(pPag
36270 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
36280 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
36290 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
362a0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
362b0 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54  tate>=PAGER_WRIT
362c0 45 52 5f 43 41 43 48 45 4d 4f 44 20 29 3b 0a 20  ER_CACHEMOD );. 
362d0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
362e0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
362f0 65 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72  er) );..  /* Mar
36300 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69  k the page as di
36310 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67  rty.  If the pag
36320 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
36330 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  en written.  ** 
36340 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  to the journal t
36350 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72  hen we can retur
36360 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  n right away..  
36370 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  */.  sqlite3Pcac
36380 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29  heMakeDirty(pPg)
36390 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e 4a 6f  ;.  if( pageInJo
363a0 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20 21 73  urnal(pPg) && !s
363b0 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
363c0 70 50 67 29 20 29 7b 0a 20 20 20 20 61 73 73 65  pPg) ){.    asse
363d0 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
363e0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 7d 65  (pPager) );.  }e
363f0 6c 73 65 7b 0a 20 20 0a 20 20 20 20 2f 2a 20 54  lse{.  .    /* T
36400 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
36410 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74  ournal now exist
36420 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20  s and we have a 
36430 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20  RESERVED or an. 
36440 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
36450 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e  lock on the main
36460 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
36470 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65   Write the curre
36480 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a  nt page to.    *
36490 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
364a0 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20  n journal if it 
364b0 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  is not there alr
364c0 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eady..    */.   
364d0 20 69 66 28 20 21 70 61 67 65 49 6e 4a 6f 75 72   if( !pageInJour
364e0 6e 61 6c 28 70 50 67 29 20 26 26 20 21 70 61 67  nal(pPg) && !pag
364f0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
36500 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
36510 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
36520 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ager)==0 );.    
36530 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c    if( pPg->pgno<
36540 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
36550 69 7a 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50  ize && isOpen(pP
36560 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
36570 20 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b        u32 cksum;
36580 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
36590 44 61 74 61 32 3b 0a 20 20 20 20 20 20 20 20 69  Data2;.        i
365a0 36 34 20 69 4f 66 66 20 3d 20 70 50 61 67 65 72  64 iOff = pPager
365b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
365c0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f         /* We sho
365d0 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20  uld never write 
365e0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
365f0 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61  ile the page tha
36600 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e  t.        ** con
36610 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61  tains the databa
36620 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66  se locks.  The f
36630 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
36640 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20  verifies.       
36650 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
36660 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ot. */.        a
36670 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f  ssert( pPg->pgno
36680 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
36690 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20  pPager) );..    
366a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
366b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3c 3d  er->journalHdr<=
366c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
366d0 66 66 20 29 3b 0a 20 20 20 20 20 20 20 20 43 4f  ff );.        CO
366e0 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
366f0 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
36700 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
36710 4e 4f 4d 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a  NOMEM, pData2);.
36720 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20          cksum = 
36730 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
36740 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29  er, (u8*)pData2)
36750 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76  ;..        /* Ev
36760 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20 64  en if an IO or d
36770 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63  iskfull error oc
36780 63 75 72 73 20 77 68 69 6c 65 20 6a 6f 75 72 6e  curs while journ
36790 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20  alling the.     
367a0 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
367b0 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73  e block above, s
367c0 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e 63  et the need-sync
367d0 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70 61   flag for the pa
367e0 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  ge..        ** O
367f0 74 68 65 72 77 69 73 65 2c 20 77 68 65 6e 20 74  therwise, when t
36800 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
36810 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74  s rolled back, t
36820 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20  he logic in.    
36830 20 20 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f      ** playback_
36840 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20  one_page() will 
36850 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70  think that the p
36860 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  age needs to be 
36870 72 65 73 74 6f 72 65 64 0a 20 20 20 20 20 20 20  restored.       
36880 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62   ** in the datab
36890 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69 66  ase file. And if
368a0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
368b0 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20  urs while doing 
368c0 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  so,.        ** t
368d0 68 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d  hen corruption m
368e0 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20  ay follow..     
368f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 50     */.        pP
36900 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
36910 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 0a 20 20  R_NEED_SYNC;..  
36920 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
36930 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
36940 66 64 2c 20 69 4f 66 66 2c 20 70 50 67 2d 3e 70  fd, iOff, pPg->p
36950 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  gno);.        if
36960 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
36970 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
36980 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
36990 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
369a0 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50  >jfd, pData2, pP
369b0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
369c0 69 4f 66 66 2b 34 29 3b 0a 20 20 20 20 20 20 20  iOff+4);.       
369d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
369e0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
369f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
36a00 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
36a10 3e 6a 66 64 2c 20 69 4f 66 66 2b 70 50 61 67 65  >jfd, iOff+pPage
36a20 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 63  r->pageSize+4, c
36a30 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 69  ksum);.        i
36a40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
36a50 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
36a60 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
36a70 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64  "JOUT %p %d %lld
36a80 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
36a90 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  pPg->pgno, .    
36aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
36ab0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
36ac0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
36ad0 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  e));.        PAG
36ae0 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
36af0 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75  pager_writej_cou
36b00 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  nt);.        PAG
36b10 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e 41  ERTRACE(("JOURNA
36b20 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  L %d page %d nee
36b30 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30  dSync=%d hash(%0
36b40 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
36b50 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
36b60 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
36b70 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28   .             (
36b80 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
36b90 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
36ba0 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ), pager_pagehas
36bb0 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20 20 20  h(pPg)));..     
36bc0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
36bd0 61 6c 4f 66 66 20 2b 3d 20 38 20 2b 20 70 50 61  alOff += 8 + pPa
36be0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
36bf0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
36c00 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61  Rec++;.        a
36c10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
36c20 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
36c30 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
36c40 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
36c50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
36c60 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
36c70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
36c80 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
36c90 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
36ca0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
36cb0 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
36cc0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
36cd0 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65   rc |= addToSave
36ce0 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
36cf0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
36d00 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
36d10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
36d20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
36d30 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
36d40 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   );.          re
36d50 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
36d60 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
36d70 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
36d80 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
36d90 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 29  R_WRITER_DBMOD )
36da0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d  {.          pPg-
36db0 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
36dc0 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20  NEED_SYNC;.     
36dd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47     }.        PAG
36de0 45 52 54 52 41 43 45 28 28 22 41 50 50 45 4e 44  ERTRACE(("APPEND
36df0 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
36e00 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Sync=%d\n",.    
36e10 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
36e20 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
36e30 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20  ->pgno,.        
36e40 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c         ((pPg->fl
36e50 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
36e60 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20  YNC)?1:0)));.   
36e70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
36e80 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74    /* If the stat
36e90 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73  ement journal is
36ea0 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61   open and the pa
36eb0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c  ge is not in it,
36ec0 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69  .    ** then wri
36ed0 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
36ee0 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65  age to the state
36ef0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e  ment journal.  N
36f00 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ote that.    ** 
36f10 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
36f20 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66  urnal format dif
36f30 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74  fers from the st
36f40 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66  andard journal f
36f50 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20  ormat.    ** in 
36f60 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68  that it omits th
36f70 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20  e checksums and 
36f80 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20  the header..    
36f90 2a 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52  */.    if( subjR
36fa0 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
36fb0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
36fc0 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50  ubjournalPage(pP
36fd0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  g);.    }.  }.. 
36fe0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64   /* Update the d
36ff0 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64  atabase size and
37000 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20   return..  */.  
37010 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
37020 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a  ze<pPg->pgno ){.
37030 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
37040 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  ze = pPg->pgno;.
37050 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
37060 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
37070 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
37080 69 74 65 61 62 6c 65 2e 20 54 68 69 73 20 72 6f  iteable. This ro
37090 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61  utine must be ca
370a0 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20  lled before .** 
370b0 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20 74  making changes t
370c0 6f 20 61 20 70 61 67 65 2e 20 54 68 65 20 63 61  o a page. The ca
370d0 6c 6c 65 72 20 6d 75 73 74 20 63 68 65 63 6b 20  ller must check 
370e0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
370f0 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66 75 6e   .** of this fun
37100 63 74 69 6f 6e 20 61 6e 64 20 62 65 20 63 61 72  ction and be car
37110 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61 6e  eful not to chan
37120 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61  ge any page data
37130 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69 73   unless .** this
37140 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
37150 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
37160 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
37170 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75   between this fu
37180 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72  nction and pager
37190 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74  _write() is that
371a0 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
371b0 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74  n also deals wit
371c0 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61  h the special ca
371d0 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f  se where 2 or mo
371e0 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20  re pages.** fit 
371f0 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b  on a single disk
37200 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73   sector. In this
37210 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73   case all co-res
37220 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d  ident pages.** m
37230 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72  ust have been wr
37240 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
37250 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
37260 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
37270 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
37280 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  curs, SQLITE_NOM
37290 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f  EM or an IO erro
372a0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
372b0 65 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70 72  ed.** as appropr
372c0 69 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  iate. Otherwise,
372d0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
372e0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  nt sqlite3PagerW
372f0 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62  rite(DbPage *pDb
37300 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Page){.  int rc 
37310 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
37320 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62  PgHdr *pPg = pDb
37330 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70  Page;.  Pager *p
37340 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
37350 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67  ger;.  Pgno nPag
37360 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50  ePerSector = (pP
37370 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
37380 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
37390 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  e);..  assert( (
373a0 70 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48  pPg->flags & PGH
373b0 44 52 5f 4d 4d 41 50 29 3d 3d 30 20 29 3b 0a 20  DR_MMAP)==0 );. 
373c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
373d0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
373e0 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
373f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
37400 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f  ->eState!=PAGER_
37410 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72  ERROR );.  asser
37420 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
37430 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
37440 0a 0a 20 20 69 66 28 20 6e 50 61 67 65 50 65 72  ..  if( nPagePer
37450 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20  Sector>1 ){.    
37460 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b  Pgno nPageCount;
37470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
37480 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
37490 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66  es in database f
374a0 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  ile */.    Pgno 
374b0 70 67 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  pg1;            
374c0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
374d0 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
374e0 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
374f0 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  on. */.    int n
37500 50 61 67 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Page = 0;       
37510 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
37520 66 20 70 61 67 65 73 20 73 74 61 72 74 69 6e 67  f pages starting
37530 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e   at pg1 to journ
37540 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  al */.    int ii
37550 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37560 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
37570 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
37580 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 20 20 20  eedSync = 0;    
37590 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
375a0 61 6e 79 20 70 61 67 65 20 68 61 73 20 50 47 48  any page has PGH
375b0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 2a 2f 0a  DR_NEED_SYNC */.
375c0 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
375d0 64 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 20 66  doNotSyncSpill f
375e0 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69  lag to 1. This i
375f0 73 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e  s because we can
37600 6e 6f 74 20 61 6c 6c 6f 77 0a 20 20 20 20 2a 2a  not allow.    **
37610 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
37620 72 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  r to be written 
37630 62 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65  between the page
37640 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 0a 20  s journaled by. 
37650 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74     ** this funct
37660 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
37670 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
37680 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
37690 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 53  ager->doNotSyncS
376a0 70 69 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 70  pill==0 );.    p
376b0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
376c0 53 70 69 6c 6c 2b 2b 3b 0a 0a 20 20 20 20 2f 2a  Spill++;..    /*
376d0 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75   This trick assu
376e0 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68  mes that both th
376f0 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
37700 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a  sector-size are.
37710 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65      ** an intege
37720 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74  r power of 2. It
37730 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70   sets variable p
37740 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69  g1 to the identi
37750 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74  fier.    ** of t
37760 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
37770 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20   the sector pPg 
37780 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20  is located on.. 
37790 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20     */.    pg1 = 
377a0 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26  ((pPg->pgno-1) &
377b0 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f   ~(nPagePerSecto
377c0 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20  r-1)) + 1;..    
377d0 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20 70 50 61  nPageCount = pPa
377e0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
377f0 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e   if( pPg->pgno>n
37800 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
37810 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d     nPage = (pPg-
37820 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a  >pgno - pg1)+1;.
37830 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
37840 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f  g1+nPagePerSecto
37850 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20  r-1)>nPageCount 
37860 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
37870 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67   nPageCount+1-pg
37880 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
37890 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
378a0 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20  ePerSector;.    
378b0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50 61  }.    assert(nPa
378c0 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72  ge>0);.    asser
378d0 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f  t(pg1<=pPg->pgno
378e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28 70  );.    assert((p
378f0 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70  g1+nPage)>pPg->p
37900 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  gno);..    for(i
37910 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26  i=0; ii<nPage &&
37920 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
37930 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e  ii++){.      Pgn
37940 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20  o pg = pg1+ii;. 
37950 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
37960 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67 3d  e;.      if( pg=
37970 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73  =pPg->pgno || !s
37980 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
37990 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
379a0 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20 20  nal, pg) ){.    
379b0 20 20 20 20 69 66 28 20 70 67 21 3d 50 41 47 45      if( pg!=PAGE
379c0 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
379d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
379e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
379f0 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20  Get(pPager, pg, 
37a00 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  &pPage);.       
37a10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
37a20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
37a30 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
37a40 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20  rite(pPage);.   
37a50 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61           if( pPa
37a60 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  ge->flags&PGHDR_
37a70 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20  NEED_SYNC ){.   
37a80 20 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53             needS
37a90 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
37aa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
37ab0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
37ac0 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
37ad0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
37ae0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
37af0 66 28 20 28 70 50 61 67 65 20 3d 20 70 61 67 65  f( (pPage = page
37b00 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
37b10 20 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20   pg))!=0 ){.    
37b20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66      if( pPage->f
37b30 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
37b40 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20  SYNC ){.        
37b50 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
37b60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37b70 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
37b80 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
37b90 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
37ba0 2a 20 49 66 20 74 68 65 20 50 47 48 44 52 5f 4e  * If the PGHDR_N
37bb0 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73  EED_SYNC flag is
37bc0 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20   set for any of 
37bd0 74 68 65 20 6e 50 61 67 65 20 70 61 67 65 73 20  the nPage pages 
37be0 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67  .    ** starting
37bf0 20 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74   at pg1, then it
37c00 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65 74   needs to be set
37c10 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d   for all of them
37c20 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a  . Because.    **
37c30 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20   writing to any 
37c40 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65 20 70  of these nPage p
37c50 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20  ages may damage 
37c60 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a  the others, the.
37c70 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
37c80 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e  ile must contain
37c90 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73   sync()ed copies
37ca0 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a   of all of them.
37cb0 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e      ** before an
37cc0 79 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65  y of them can be
37cd0 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20   written out to 
37ce0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
37cf0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
37d00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
37d10 26 26 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  && needSync ){. 
37d20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45       assert( !ME
37d30 4d 44 42 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  MDB );.      for
37d40 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 3b  (ii=0; ii<nPage;
37d50 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
37d60 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70  PgHdr *pPage = p
37d70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
37d80 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20  er, pg1+ii);.   
37d90 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20 29       if( pPage )
37da0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  {.          pPag
37db0 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  e->flags |= PGHD
37dc0 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20  R_NEED_SYNC;.   
37dd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
37de0 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
37df0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37e00 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73   }.    }..    as
37e10 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
37e20 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 3d 3d 31 20  NotSyncSpill==1 
37e30 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
37e40 6f 4e 6f 74 53 79 6e 63 53 70 69 6c 6c 2d 2d 3b  oNotSyncSpill--;
37e50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
37e60 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70   = pager_write(p
37e70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  DbPage);.  }.  r
37e80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
37e90 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
37ea0 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  f the page given
37eb0 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
37ec0 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
37ed0 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c  passed.** to sql
37ee0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
37ef0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
37f00 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69  s, return TRUE i
37f10 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f  f it is ok.** to
37f20 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74   change the cont
37f30 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
37f40 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
37f50 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  UG.int sqlite3Pa
37f60 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 44  gerIswriteable(D
37f70 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
37f80 65 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73  eturn pPg->flags
37f90 26 50 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a  &PGHDR_DIRTY;.}.
37fa0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20  #endif../*.** A 
37fb0 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
37fc0 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70  tine tells the p
37fd0 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20  ager that it is 
37fe0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
37ff0 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e  .** write the in
38000 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67  formation on pag
38010 65 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68  e pPg back to th
38020 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f  e disk, even tho
38030 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65  ugh.** that page
38040 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64   might be marked
38050 20 61 73 20 64 69 72 74 79 2e 20 20 54 68 69 73   as dirty.  This
38060 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78   happens, for ex
38070 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74  ample, when.** t
38080 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  he page has been
38090 20 61 64 64 65 64 20 61 73 20 61 20 6c 65 61 66   added as a leaf
380a0 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
380b0 20 61 6e 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63   and so its.** c
380c0 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72  ontent no longer
380d0 20 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20   matters..**.** 
380e0 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f  The overlying so
380f0 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c  ftware layer cal
38100 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
38110 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  when all of the 
38120 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67  data.** on the g
38130 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75  iven page is unu
38140 73 65 64 2e 20 54 68 65 20 70 61 67 65 72 20 6d  sed. The pager m
38150 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73  arks the page as
38160 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61   clean so.** tha
38170 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65  t it does not ge
38180 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  t written to dis
38190 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73  k..**.** Tests s
381a0 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70  how that this op
381b0 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 71  timization can q
381c0 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65  uadruple the spe
381d0 65 64 20 6f 66 20 6c 61 72 67 65 20 0a 2a 2a 20  ed of large .** 
381e0 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e  DELETE operation
381f0 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
38200 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
38210 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
38220 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
38230 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
38240 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  f( (pPg->flags&P
38250 47 48 44 52 5f 44 49 52 54 59 29 20 26 26 20 70  GHDR_DIRTY) && p
38260 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
38270 74 3d 3d 30 20 29 7b 0a 20 20 20 20 50 41 47 45  t==0 ){.    PAGE
38280 52 54 52 41 43 45 28 28 22 44 4f 4e 54 5f 57 52  RTRACE(("DONT_WR
38290 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25  ITE page %d of %
382a0 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
382b0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
382c0 29 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  ));.    IOTRACE(
382d0 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22  ("CLEAN %p %d\n"
382e0 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
382f0 67 6e 6f 29 29 0a 20 20 20 20 70 50 67 2d 3e 66  gno)).    pPg->f
38300 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f  lags |= PGHDR_DO
38310 4e 54 5f 57 52 49 54 45 3b 0a 20 20 20 20 70 61  NT_WRITE;.    pa
38320 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68  ger_set_pagehash
38330 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  (pPg);.  }.}../*
38340 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
38350 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e   is called to in
38360 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
38370 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
38380 65 20 66 69 6c 65 20 0a 2a 2a 20 63 68 61 6e 67  e file .** chang
38390 65 2d 63 6f 75 6e 74 65 72 2c 20 73 74 6f 72 65  e-counter, store
383a0 64 20 61 73 20 61 20 34 2d 62 79 74 65 20 62 69  d as a 4-byte bi
383b0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
383c0 20 73 74 61 72 74 69 6e 67 20 61 74 20 0a 2a 2a   starting at .**
383d0 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34 20   byte offset 24 
383e0 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  of the pager fil
383f0 65 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 61 72  e.  The secondar
38400 79 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  y change counter
38410 20 61 74 0a 2a 2a 20 39 32 20 69 73 20 61 6c 73   at.** 92 is als
38420 6f 20 75 70 64 61 74 65 64 2c 20 61 73 20 69 73  o updated, as is
38430 20 74 68 65 20 53 51 4c 69 74 65 20 76 65 72 73   the SQLite vers
38440 69 6f 6e 20 6e 75 6d 62 65 72 20 61 74 20 6f 66  ion number at of
38450 66 73 65 74 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 42  fset 96..**.** B
38460 75 74 20 74 68 69 73 20 6f 6e 6c 79 20 68 61 70  ut this only hap
38470 70 65 6e 73 20 69 66 20 74 68 65 20 70 50 61 67  pens if the pPag
38480 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
38490 6f 6e 65 20 66 6c 61 67 20 69 73 20 66 61 6c 73  one flag is fals
384a0 65 2e 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 65  e..** To avoid e
384b0 78 63 65 73 73 20 63 68 75 72 6e 69 6e 67 20 6f  xcess churning o
384c0 66 20 70 61 67 65 20 31 2c 20 74 68 65 20 75 70  f page 1, the up
384d0 64 61 74 65 20 6f 6e 6c 79 20 68 61 70 70 65 6e  date only happen
384e0 73 20 6f 6e 63 65 2e 0a 2a 2a 20 53 65 65 20 61  s once..** See a
384f0 6c 73 6f 20 74 68 65 20 70 61 67 65 72 5f 77 72  lso the pager_wr
38500 69 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ite_changecounte
38510 72 28 29 20 72 6f 75 74 69 6e 65 20 74 68 61 74  r() routine that
38520 20 64 6f 65 73 20 61 6e 20 0a 2a 2a 20 75 6e 63   does an .** unc
38530 6f 6e 64 69 74 69 6f 6e 61 6c 20 75 70 64 61 74  onditional updat
38540 65 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 20  e of the change 
38550 63 6f 75 6e 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20  counters..**.** 
38560 49 66 20 74 68 65 20 69 73 44 69 72 65 63 74 4d  If the isDirectM
38570 6f 64 65 20 66 6c 61 67 20 69 73 20 7a 65 72 6f  ode flag is zero
38580 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 64  , then this is d
38590 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 0a  one by calling .
385a0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  ** sqlite3PagerW
385b0 72 69 74 65 28 29 20 6f 6e 20 70 61 67 65 20 31  rite() on page 1
385c0 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67  , then modifying
385d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
385e0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 64 61 74   the.** page dat
385f0 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  a. In this case 
38600 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  the file will be
38610 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 74 68   updated when th
38620 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61  e current.** tra
38630 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
38640 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  itted..**.** The
38650 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c   isDirectMode fl
38660 61 67 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 6e  ag may only be n
38670 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 6c  on-zero if the l
38680 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69  ibrary was compi
38690 6c 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  led.** with the 
386a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
386b0 4f 4d 49 43 5f 57 52 49 54 45 20 6d 61 63 72 6f  OMIC_WRITE macro
386c0 20 64 65 66 69 6e 65 64 2e 20 49 6e 20 74 68 69   defined. In thi
386d0 73 20 63 61 73 6