/ Hex Artifact Content
Login

Artifact 811c1a1eed536bf30e12e69b700fb8fef254b33e8753cd5b354371bb2cf1e74f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 53 51 4c 49  PAGERID(p) (SQLI
15a0: 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 2d  TE_PTR_TO_INT(p-
15b0: 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46 49  >fd)).#define FI
15c0: 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28  LEHANDLEID(fd) (
15d0: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
15e0: 54 28 66 64 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  T(fd))../*.** Th
15f0: 65 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 76  e Pager.eState v
1600: 61 72 69 61 62 6c 65 20 73 74 6f 72 65 73 20 74  ariable stores t
1610: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
1620: 65 27 20 6f 66 20 61 20 70 61 67 65 72 2e 20 41  e' of a pager. A
1630: 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79 20 62 65  .** pager may be
1640: 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f 66 20 74   in any one of t
1650: 68 65 20 73 65 76 65 6e 20 73 74 61 74 65 73 20  he seven states 
1660: 73 68 6f 77 6e 20 69 6e 20 74 68 65 20 66 6f 6c  shown in the fol
1670: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 20  lowing.** state 
1680: 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 20  diagram..**.**  
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a0: 20 20 20 20 20 20 20 20 20 20 4f 50 45 4e 20 3c            OPEN <
16b0: 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d 2b 0a 2a  ------+------+.*
16c0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
16e0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
16f0: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 20 20 56 20 20 20 20 20 20 20 20 20 7c 20 20 20    V         |   
1720: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
1730: 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d 2d 2d 2d        +---------
1740: 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d 2d 2d 2b  > READER-------+
1750: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1760: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1770: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1780: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1790: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
17a0: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17d0: 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 4c  <-------WRITER_L
17e0: 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20 45 52 52  OCKED------> ERR
17f0: 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  OR.**           
1800: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
1810: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1820: 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20 20 20 20      ^  .**      
1830: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1840: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1850: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1860: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
1870: 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41 43 48 45  ----WRITER_CACHE
1880: 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  MOD-------->|.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
18d0: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
18e0: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
18f0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1900: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
1910: 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d 2d 2d 2d  ITER_DBMOD------
1920: 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20  ---->|.**       
1930: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1940: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
1950: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
1960: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1970: 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20            V     
1980: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 3c                +<
19a0: 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 46 49 4e  ------WRITER_FIN
19b0: 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 2b 0a  ISHED-------->+.
19c0: 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74 20 6f 66  **.**.** List of
19d0: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
19e0: 6e 73 20 61 6e 64 20 74 68 65 20 43 20 5b 66 75  ns and the C [fu
19f0: 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20 70 65 72  nction] that per
1a00: 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a 2a 20 0a  forms each:.** .
1a10: 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20 20 20 20  **   OPEN       
1a20: 20 20 20 20 20 20 20 2d 3e 20 52 45 41 44 45 52         -> READER
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
1a40: 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
1a50: 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52 45 41 44  dLock].**   READ
1a60: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1a70: 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20 20   OPEN           
1a80: 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c 6f       [pager_unlo
1a90: 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52 45 41 44  ck].**.**   READ
1aa0: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1ab0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ac0: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1ad0: 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20 20 57 52  erBegin].**   WR
1ae0: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 20 20  ITER_LOCKED     
1af0: 2d 3e 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d  -> WRITER_CACHEM
1b00: 4f 44 20 20 20 20 20 5b 70 61 67 65 72 5f 6f 70  OD     [pager_op
1b10: 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20  en_journal].**  
1b20: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
1b30: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 44 42 4d     -> WRITER_DBM
1b40: 4f 44 20 20 20 20 20 20 20 20 5b 73 79 6e 63 4a  OD        [syncJ
1b50: 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20 57 52 49  ournal].**   WRI
1b60: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 2d  TER_DBMOD      -
1b70: 3e 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  > WRITER_FINISHE
1b80: 44 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61  D     [sqlite3Pa
1b90: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
1ba0: 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  e].**   WRITER_*
1bb0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41  **        -> REA
1bc0: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1bd0: 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e   [pager_end_tran
1be0: 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a 2a 20 20  saction].**.**  
1bf0: 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20   WRITER_***     
1c00: 20 20 20 2d 3e 20 45 52 52 4f 52 20 20 20 20 20     -> ERROR     
1c10: 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72            [pager
1c20: 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20 45 52 52  _error].**   ERR
1c30: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  OR             -
1c40: 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20  > OPEN          
1c50: 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c        [pager_unl
1c60: 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 20 20  ock].** .**.**  
1c70: 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  OPEN:.**.**    T
1c80: 68 65 20 70 61 67 65 72 20 73 74 61 72 74 73 20  he pager starts 
1c90: 75 70 20 69 6e 20 74 68 69 73 20 73 74 61 74 65  up in this state
1ca0: 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20 67 75 61  . Nothing is gua
1cb0: 72 61 6e 74 65 65 64 20 69 6e 20 74 68 69 73 0a  ranteed in this.
1cc0: 2a 2a 20 20 20 20 73 74 61 74 65 20 2d 20 74 68  **    state - th
1cd0: 65 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61  e file may or ma
1ce0: 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b 65 64 20  y not be locked 
1cf0: 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
1d00: 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20 20 20 75   size is.**    u
1d10: 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64 61 74 61  nknown. The data
1d20: 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  base may not be 
1d30: 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
1d40: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e 6f 20 72  .**.**    * No r
1d50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
1d60: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
1d70: 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 79 20  ve..**    * Any 
1d80: 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c 6f 63 6b  lock, or no lock
1d90: 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20 62 65 20   at all, may be 
1da0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1db0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
1dc0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
1dd0: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
1de0: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
1df0: 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72  es may not be tr
1e00: 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 52 45  usted..**.**  RE
1e10: 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 49  ADER:.**.**    I
1e20: 6e 20 74 68 69 73 20 73 74 61 74 65 20 61 6c 6c  n this state all
1e30: 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   the requirement
1e40: 73 20 66 6f 72 20 72 65 61 64 69 6e 67 20 74 68  s for reading th
1e50: 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 0a 2a  e database in .*
1e60: 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 28 6e  *    rollback (n
1e70: 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20 61 72 65  on-WAL) mode are
1e80: 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20 74 68 65   met. Unless the
1e90: 20 70 61 67 65 72 20 69 73 20 28 6f 72 20 72 65   pager is (or re
1ea0: 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 77 61 73  cently.**    was
1eb0: 29 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6c  ) in exclusive-l
1ec0: 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 61 20 75  ocking mode, a u
1ed0: 73 65 72 2d 6c 65 76 65 6c 20 72 65 61 64 20 74  ser-level read t
1ee0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a  ransaction is .*
1ef0: 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68 65 20 64  *    open. The d
1f00: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
1f10: 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73 20 73 74  known in this st
1f20: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
1f30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75 6e 6e 69  connection runni
1f40: 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f  ng with locking_
1f50: 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65 6e 74 65  mode=normal ente
1f60: 72 73 20 74 68 69 73 20 73 74 61 74 65 20 77 68  rs this state wh
1f70: 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f 70 65 6e  en.**    it open
1f80: 73 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  s a read-transac
1f90: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  tion on the data
1fa0: 62 61 73 65 20 61 6e 64 20 72 65 74 75 72 6e 73  base and returns
1fb0: 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20 20 20 20   to state.**    
1fc0: 4f 50 45 4e 20 61 66 74 65 72 20 74 68 65 20 72  OPEN after the r
1fd0: 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
1fe0: 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e 20 48 6f  is completed. Ho
1ff0: 77 65 76 65 72 20 61 20 63 6f 6e 6e 65 63 74 69  wever a connecti
2000: 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e 69 6e 67  on.**    running
2010: 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
2020: 3d 65 78 63 6c 75 73 69 76 65 20 28 69 6e 63 6c  =exclusive (incl
2030: 75 64 69 6e 67 20 74 65 6d 70 20 64 61 74 61 62  uding temp datab
2040: 61 73 65 73 29 20 72 65 6d 61 69 6e 73 20 69 6e  ases) remains in
2050: 0a 2a 2a 20 20 20 20 74 68 69 73 20 73 74 61 74  .**    this stat
2060: 65 20 65 76 65 6e 20 61 66 74 65 72 20 74 68 65  e even after the
2070: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
2080: 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20 54 68 65  n is closed. The
2090: 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20 20 20 20   only way.**    
20a0: 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  a locking_mode=e
20b0: 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e 65 63 74  xclusive connect
20c0: 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73 69 74 69  ion can transiti
20d0: 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45 52 20 74  on from READER t
20e0: 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20 69 73 20  o OPEN.**    is 
20f0: 76 69 61 20 74 68 65 20 45 52 52 4f 52 20 73 74  via the ERROR st
2100: 61 74 65 20 28 73 65 65 20 62 65 6c 6f 77 29 2e  ate (see below).
2110: 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20 41 20 72  .** .**    * A r
2120: 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead transaction 
2130: 6d 61 79 20 62 65 20 61 63 74 69 76 65 20 28 62  may be active (b
2140: 75 74 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ut a write-trans
2150: 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 29 2e 0a  action cannot)..
2160: 2a 2a 20 20 20 20 2a 20 41 20 53 48 41 52 45 44  **    * A SHARED
2170: 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
2180: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2190: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
21a0: 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a  *    * The dbSiz
21b0: 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62  e variable may b
21c0: 65 20 74 72 75 73 74 65 64 20 28 65 76 65 6e 20  e trusted (even 
21d0: 69 66 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  if a user-level 
21e0: 72 65 61 64 20 0a 2a 2a 20 20 20 20 20 20 74 72  read .**      tr
21f0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74  ansaction is not
2200: 20 61 63 74 69 76 65 29 2e 20 54 68 65 20 64 62   active). The db
2210: 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46  OrigSize and dbF
2220: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
2230: 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79 20 6e 6f  s.**      may no
2240: 74 20 62 65 20 74 72 75 73 74 65 64 20 61 74 20  t be trusted at 
2250: 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2a 20 20  this point..**  
2260: 20 20 2a 20 49 66 20 74 68 65 20 64 61 74 61 62    * If the datab
2270: 61 73 65 20 69 73 20 61 20 57 41 4c 20 64 61 74  ase is a WAL dat
2280: 61 62 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20  abase, then the 
2290: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  WAL connection i
22a0: 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20  s open..**    * 
22b0: 45 76 65 6e 20 69 66 20 61 20 72 65 61 64 2d 74  Even if a read-t
22c0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f  ransaction is no
22d0: 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 67 75  t open, it is gu
22e0: 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 0a 2a  aranteed that .*
22f0: 2a 20 20 20 20 20 20 74 68 65 72 65 20 69 73 20  *      there is 
2300: 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69  no hot-journal i
2310: 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
2320: 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52  m..**.**  WRITER
2330: 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  _LOCKED:.**.**  
2340: 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65    The pager move
2350: 73 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  s to this state 
2360: 66 72 6f 6d 20 52 45 41 44 45 52 20 77 68 65 6e  from READER when
2370: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
2380: 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73 20 66 69  tion.**    is fi
2390: 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  rst opened on th
23a0: 65 20 64 61 74 61 62 61 73 65 2e 20 49 6e 20 57  e database. In W
23b0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
23c0: 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73 20 0a 2a  te, all locks .*
23d0: 2a 20 20 20 20 72 65 71 75 69 72 65 64 20 74 6f  *    required to
23e0: 20 73 74 61 72 74 20 61 20 77 72 69 74 65 2d 74   start a write-t
23f0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 68  ransaction are h
2400: 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61 63 74 75  eld, but no actu
2410: 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64 69 66 69  al .**    modifi
2420: 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 63  cations to the c
2430: 61 63 68 65 20 6f 72 20 64 61 74 61 62 61 73 65  ache or database
2440: 20 68 61 76 65 20 74 61 6b 65 6e 20 70 6c 61 63   have taken plac
2450: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 72  e..**.**    In r
2460: 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 61 20  ollback mode, a 
2470: 52 45 53 45 52 56 45 44 20 6f 72 20 28 69 66 20  RESERVED or (if 
2480: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2490: 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20  was opened with 
24a0: 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20 45 58 43  .**    BEGIN EXC
24b0: 4c 55 53 49 56 45 29 20 45 58 43 4c 55 53 49 56  LUSIVE) EXCLUSIV
24c0: 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  E lock is obtain
24d0: 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
24e0: 73 65 20 66 69 6c 65 20 77 68 65 6e 0a 2a 2a 20  se file when.** 
24f0: 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20 74 68 69     moving to thi
2500: 73 20 73 74 61 74 65 2c 20 62 75 74 20 74 68 65  s state, but the
2510: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2520: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
2530: 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 20 20  or opened .**   
2540: 20 74 6f 20 69 6e 20 74 68 69 73 20 73 74 61 74   to in this stat
2550: 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  e. If the transa
2560: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
2570: 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
2580: 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20 20 20 69  k while .**    i
2590: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
25a0: 73 74 61 74 65 2c 20 61 6c 6c 20 74 68 61 74 20  state, all that 
25b0: 69 73 20 72 65 71 75 69 72 65 64 20 69 73 20 74  is required is t
25c0: 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
25d0: 61 62 61 73 65 20 0a 2a 2a 20 20 20 20 66 69 6c  abase .**    fil
25e0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 4e 20 57  e..**.**    IN W
25f0: 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42 65 67 69  AL mode, WalBegi
2600: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
2610: 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  n() is called to
2620: 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67 20 66 69   lock the log fi
2630: 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20 74 68 65  le..**    If the
2640: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72   connection is r
2650: 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b  unning with lock
2660: 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
2670: 76 65 2c 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ve, an attempt.*
2680: 2a 20 20 20 20 69 73 20 6d 61 64 65 20 74 6f 20  *    is made to 
2690: 6f 62 74 61 69 6e 20 61 6e 20 45 58 43 4c 55 53  obtain an EXCLUS
26a0: 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
26b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
26c0: 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74  *.**    * A writ
26d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
26e0: 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a   active..**    *
26f0: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2700: 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20 72 6f  on is open in ro
2710: 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20 61 20 52  llback-mode, a R
2720: 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74  ESERVED or great
2730: 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c 6f 63 6b  er .**      lock
2740: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2750: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2760: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
2770: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
2780: 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c 20 61 20   in WAL-mode, a 
2790: 57 41 4c 20 77 72 69 74 65 20 74 72 61 6e 73 61  WAL write transa
27a0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 69 73  ction.**      is
27b0: 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73 71 6c 69   open (i.e. sqli
27c0: 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65  te3WalBeginWrite
27d0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 68 61  Transaction() ha
27e0: 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75  s been successfu
27f0: 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63 61 6c 6c  lly.**      call
2800: 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ed)..**    * The
2810: 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53   dbSize, dbOrigS
2820: 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69  ize and dbFileSi
2830: 7a 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  ze variables are
2840: 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a 2a 20 20   all valid..**  
2850: 20 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73    * The contents
2860: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
2870: 63 68 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65  che have not bee
2880: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 20  n modified..**  
2890: 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20    * The journal 
28a0: 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20  file may or may 
28b0: 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20  not be open..** 
28c0: 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20 28 6e 6f     * Nothing (no
28d0: 74 20 65 76 65 6e 20 74 68 65 20 66 69 72 73 74  t even the first
28e0: 20 68 65 61 64 65 72 29 20 68 61 73 20 62 65 65   header) has bee
28f0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
2900: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
2910: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
2920: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 70 61 67  :.**.**    A pag
2930: 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d 20 57 52  er moves from WR
2940: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74  ITER_LOCKED stat
2950: 65 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  e to this state 
2960: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 0a 2a  when a page is.*
2970: 2a 20 20 20 20 66 69 72 73 74 20 6d 6f 64 69 66  *    first modif
2980: 69 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ied by the upper
2990: 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f 6c 6c 62   layer. In rollb
29a0: 61 63 6b 20 6d 6f 64 65 20 74 68 65 20 6a 6f 75  ack mode the jou
29b0: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
29c0: 69 73 20 6f 70 65 6e 65 64 20 28 69 66 20 69 74  is opened (if it
29d0: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
29e0: 6f 70 65 6e 29 20 61 6e 64 20 61 20 68 65 61 64  open) and a head
29f0: 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  er written to th
2a00: 65 0a 2a 2a 20 20 20 20 73 74 61 72 74 20 6f 66  e.**    start of
2a10: 20 69 74 2e 20 54 68 65 20 64 61 74 61 62 61 73   it. The databas
2a20: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 68  e file on disk h
2a30: 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69  as not been modi
2a40: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  fied..**.**    *
2a50: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
2a60: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
2a70: 2a 2a 20 20 20 20 2a 20 41 20 52 45 53 45 52 56  **    * A RESERV
2a80: 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
2a90: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2aa0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2ab0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ac0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2ad0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2ae0: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2af0: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2b00: 20 74 6f 20 69 74 2c 20 62 75 74 20 74 68 65 20   to it, but the 
2b10: 68 65 61 64 65 72 20 68 61 73 20 6e 6f 74 20 62  header has not b
2b20: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69  een synced to di
2b30: 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  sk..**    * The 
2b40: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2b50: 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65 20  page cache have 
2b60: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2b70: 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 44 42 4d  *.**  WRITER_DBM
2b80: 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54 68 65  OD:.**.**    The
2b90: 20 70 61 67 65 72 20 74 72 61 6e 73 69 74 69 6f   pager transitio
2ba0: 6e 73 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 43  ns from WRITER_C
2bb0: 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20 57 52 49  ACHEMOD into WRI
2bc0: 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 0a  TER_DBMOD state.
2bd0: 2a 2a 20 20 20 20 77 68 65 6e 20 69 74 20 6d 6f  **    when it mo
2be0: 64 69 66 69 65 73 20 74 68 65 20 63 6f 6e 74 65  difies the conte
2bf0: 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
2c00: 61 73 65 20 66 69 6c 65 2e 20 57 41 4c 20 63 6f  ase file. WAL co
2c10: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 20 20 20  nnections.**    
2c20: 6e 65 76 65 72 20 65 6e 74 65 72 20 74 68 69 73  never enter this
2c30: 20 73 74 61 74 65 20 28 73 69 6e 63 65 20 74 68   state (since th
2c40: 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  ey do not modify
2c50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c60: 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73 74 20 74  le,.**    just t
2c70: 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e 0a 2a 2a  he log file)..**
2c80: 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65  .**    * A write
2c90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2ca0: 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20  active..**    * 
2cb0: 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6f 72 20  An EXCLUSIVE or 
2cc0: 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
2cd0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
2ce0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
2cf0: 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66   * The journal f
2d00: 69 6c 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  ile is open and 
2d10: 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
2d20: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
2d30: 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e 64 20 73  n .**      and s
2d40: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
2d50: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2d60: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
2d70: 63 61 63 68 65 20 68 61 76 65 20 62 65 65 6e 20  cache have been 
2d80: 6d 6f 64 69 66 69 65 64 20 28 61 6e 64 20 70 6f  modified (and po
2d90: 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20 20 20 77  ssibly.**      w
2da0: 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 29 2e  ritten to disk).
2db0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 46  .**.**  WRITER_F
2dc0: 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  INISHED:.**.**  
2dd0: 20 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73    It is not poss
2de0: 69 62 6c 65 20 66 6f 72 20 61 20 57 41 4c 20 63  ible for a WAL c
2df0: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 65 6e 74  onnection to ent
2e00: 65 72 20 74 68 69 73 20 73 74 61 74 65 2e 0a 2a  er this state..*
2e10: 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c 6c 62 61  *.**    A rollba
2e20: 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72 20 63 68  ck-mode pager ch
2e30: 61 6e 67 65 73 20 74 6f 20 57 52 49 54 45 52 5f  anges to WRITER_
2e40: 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 20 66  FINISHED state f
2e50: 72 6f 6d 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  rom WRITER_DBMOD
2e60: 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 61 66 74  .**    state aft
2e70: 65 72 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  er the entire tr
2e80: 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
2e90: 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
2ea0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
2eb0: 0a 2a 2a 20 20 20 20 64 61 74 61 62 61 73 65 20  .**    database 
2ec0: 66 69 6c 65 2e 20 49 6e 20 74 68 69 73 20 73 74  file. In this st
2ed0: 61 74 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ate the transact
2ee0: 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f 6d 6d 69  ion may be commi
2ef0: 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a 2a 20 20  tted simply.**  
2f00: 20 20 62 79 20 66 69 6e 61 6c 69 7a 69 6e 67 20    by finalizing 
2f10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f20: 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49 54 45 52  . Once in WRITER
2f30: 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 2c  _FINISHED state,
2f40: 20 69 74 20 69 73 20 0a 2a 2a 20 20 20 20 6e 6f   it is .**    no
2f50: 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6d 6f  t possible to mo
2f60: 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73  dify the databas
2f70: 65 20 66 75 72 74 68 65 72 2e 20 41 74 20 74 68  e further. At th
2f80: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 75 70  is point, the up
2f90: 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61 79 65 72  per .**    layer
2fa0: 20 6d 75 73 74 20 65 69 74 68 65 72 20 63 6f 6d   must either com
2fb0: 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
2fc0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
2fd0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2fe0: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2ff0: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
3000: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
3010: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
3020: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
3030: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
3040: 20 20 20 20 2a 20 41 6c 6c 20 77 72 69 74 69 6e      * All writin
3050: 67 20 61 6e 64 20 73 79 6e 63 69 6e 67 20 6f 66  g and syncing of
3060: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 61 74   journal and dat
3070: 61 62 61 73 65 20 64 61 74 61 20 68 61 73 20 66  abase data has f
3080: 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20 20 20 20  inished..**     
3090: 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
30a0: 75 72 72 65 64 2c 20 61 6c 6c 20 74 68 61 74 20  urred, all that 
30b0: 72 65 6d 61 69 6e 73 20 69 73 20 74 6f 20 66 69  remains is to fi
30c0: 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
30d0: 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20 20 63 6f  al to.**      co
30e0: 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
30f0: 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f  tion. If an erro
3100: 72 20 64 69 64 20 6f 63 63 75 72 2c 20 74 68 65  r did occur, the
3110: 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6e 65 65   caller will nee
3120: 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20 72 6f 6c  d.**      to rol
3130: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
3140: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 20 45  ction. .**.**  E
3150: 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  RROR:.**.**    T
3160: 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  he ERROR state i
3170: 73 20 65 6e 74 65 72 65 64 20 77 68 65 6e 20 61  s entered when a
3180: 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d 66 75 6c  n IO or disk-ful
3190: 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c 75 64 69  l error (includi
31a0: 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f  ng.**    SQLITE_
31b0: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20 6f 63 63  IOERR_NOMEM) occ
31c0: 75 72 73 20 61 74 20 61 20 70 6f 69 6e 74 20 69  urs at a point i
31d0: 6e 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  n the code that 
31e0: 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20 20 20 20  makes it .**    
31f0: 64 69 66 66 69 63 75 6c 74 20 74 6f 20 62 65 20  difficult to be 
3200: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 69 6e  sure that the in
3210: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 73 74  -memory pager st
3220: 61 74 65 20 28 63 61 63 68 65 20 63 6f 6e 74 65  ate (cache conte
3230: 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64 62 20 73  nts, .**    db s
3240: 69 7a 65 20 65 74 63 2e 29 20 61 72 65 20 63 6f  ize etc.) are co
3250: 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 74 68  nsistent with th
3260: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3270: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 2a  e file-system..*
3280: 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f 72 61 72  *.**    Temporar
3290: 79 20 70 61 67 65 72 20 66 69 6c 65 73 20 6d 61  y pager files ma
32a0: 79 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f  y enter the ERRO
32b0: 52 20 73 74 61 74 65 2c 20 62 75 74 20 69 6e 2d  R state, but in-
32c0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 73 0a 2a 2a  memory pagers.**
32d0: 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a 2a 0a 2a      cannot..**.*
32e0: 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  *    For example
32f0: 2c 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  , if an IO error
3300: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70 65   occurs while pe
3310: 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f 6c 6c 62  rforming a rollb
3320: 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74 68 65 20  ack, .**    the 
3330: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
3340: 70 61 67 65 2d 63 61 63 68 65 20 6d 61 79 20 62  page-cache may b
3350: 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
3360: 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
3370: 0a 2a 2a 20 20 20 20 41 74 20 74 68 69 73 20 70  .**    At this p
3380: 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64 20 62 65  oint it would be
3390: 20 64 61 6e 67 65 72 6f 75 73 20 74 6f 20 63 68   dangerous to ch
33a0: 61 6e 67 65 20 62 61 63 6b 20 74 6f 20 52 45 41  ange back to REA
33b0: 44 45 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20  DER state.**    
33c0: 28 61 73 20 75 73 75 61 6c 6c 79 20 68 61 70 70  (as usually happ
33d0: 65 6e 73 20 61 66 74 65 72 20 61 20 72 6f 6c 6c  ens after a roll
33e0: 62 61 63 6b 29 2e 20 41 6e 79 20 73 75 62 73 65  back). Any subse
33f0: 71 75 65 6e 74 20 72 65 61 64 65 72 73 20 6d 69  quent readers mi
3400: 67 68 74 0a 2a 2a 20 20 20 20 72 65 70 6f 72 74  ght.**    report
3410: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
3420: 74 69 6f 6e 20 28 64 75 65 20 74 6f 20 74 68 65  tion (due to the
3430: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61   inconsistent ca
3440: 63 68 65 29 2c 20 61 6e 64 20 69 66 0a 2a 2a 20  che), and if.** 
3450: 20 20 20 74 68 65 79 20 75 70 67 72 61 64 65 20     they upgrade 
3460: 74 6f 20 77 72 69 74 65 72 73 2c 20 74 68 65 79  to writers, they
3470: 20 6d 61 79 20 69 6e 61 64 76 65 72 74 65 6e 74   may inadvertent
3480: 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64  ly corrupt the d
3490: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 66 69  atabase.**    fi
34a0: 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20 74 68 69  le. To avoid thi
34b0: 73 20 68 61 7a 61 72 64 2c 20 74 68 65 20 70 61  s hazard, the pa
34c0: 67 65 72 20 73 77 69 74 63 68 65 73 20 69 6e 74  ger switches int
34d0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
34e0: 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65 61 64 20  e.**    instead 
34f0: 6f 66 20 52 45 41 44 45 52 20 66 6f 6c 6c 6f 77  of READER follow
3500: 69 6e 67 20 73 75 63 68 20 61 6e 20 65 72 72 6f  ing such an erro
3510: 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 6e 63 65  r..**.**    Once
3520: 20 69 74 20 68 61 73 20 65 6e 74 65 72 65 64 20   it has entered 
3530: 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
3540: 20 61 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   any attempt to 
3550: 75 73 65 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  use the pager.**
3560: 20 20 20 20 74 6f 20 72 65 61 64 20 6f 72 20 77      to read or w
3570: 72 69 74 65 20 64 61 74 61 20 72 65 74 75 72 6e  rite data return
3580: 73 20 61 6e 20 65 72 72 6f 72 2e 20 45 76 65 6e  s an error. Even
3590: 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20 61 6c 6c  tually, once all
35a0: 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74 61 6e 64   .**    outstand
35b0: 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ing transactions
35c0: 20 68 61 76 65 20 62 65 65 6e 20 61 62 61 6e 64   have been aband
35d0: 6f 6e 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  oned, the pager 
35e0: 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 20 20  is able to.**   
35f0: 20 74 72 61 6e 73 69 74 69 6f 6e 20 62 61 63 6b   transition back
3600: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   to OPEN state, 
3610: 64 69 73 63 61 72 64 69 6e 67 20 74 68 65 20 63  discarding the c
3620: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a  ontents of the .
3630: 2a 2a 20 20 20 20 70 61 67 65 2d 63 61 63 68 65  **    page-cache
3640: 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 69   and any other i
3650: 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74 65 20 61  n-memory state a
3660: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
3670: 20 45 76 65 72 79 74 68 69 6e 67 0a 2a 2a 20 20   Everything.**  
3680: 20 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72    is reloaded fr
3690: 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c 20 69 66  om disk (and, if
36a0: 20 6e 65 63 65 73 73 61 72 79 2c 20 68 6f 74 2d   necessary, hot-
36b0: 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
36c0: 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a 20 20 20   peformed).**   
36d0: 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
36e0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 65 78 74  nsaction is next
36f0: 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 70   opened on the p
3700: 61 67 65 72 20 28 74 72 61 6e 73 69 74 69 6f 6e  ager (transition
3710: 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65 20 70 61  ing.**    the pa
3720: 67 65 72 20 69 6e 74 6f 20 52 45 41 44 45 52 20  ger into READER 
3730: 73 74 61 74 65 29 2e 20 41 74 20 74 68 61 74 20  state). At that 
3740: 70 6f 69 6e 74 20 74 68 65 20 73 79 73 74 65 6d  point the system
3750: 20 68 61 73 20 72 65 63 6f 76 65 72 65 64 20 0a   has recovered .
3760: 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68 65 20 65  **    from the e
3770: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  rror..**.**    S
3780: 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65  pecifically, the
3790: 20 70 61 67 65 72 20 6a 75 6d 70 73 20 69 6e 74   pager jumps int
37a0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
37b0: 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e if:.**.**     
37c0: 20 31 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63   1. An error occ
37d0: 75 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70  urs while attemp
37e0: 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ting a rollback.
37f0: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   This happens in
3800: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 75 6e 63  .**         func
3810: 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65  tion sqlite3Page
3820: 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 2a 2a 0a  rRollback()..**.
3830: 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e 20 65 72  **      2. An er
3840: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
3850: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 66   attempting to f
3860: 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75 72 6e 61  inalize a journa
3870: 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20  l file.**       
3880: 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 63 6f    following a co
3890: 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e  mmit in function
38a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
38b0: 6d 69 74 50 68 61 73 65 54 77 6f 28 29 2e 0a 2a  mitPhaseTwo()..*
38c0: 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20 41 6e 20  *.**      3. An 
38d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
38e0: 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  le attempting to
38f0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
3900: 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20 20 20 20  urnal or.**     
3910: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
3920: 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 70 61  e in function pa
3930: 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 6f  gerStress() in o
3940: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 0a  rder to free up.
3950: 2a 2a 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72  **         memor
3960: 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 6f  y..**.**    In o
3970: 74 68 65 72 20 63 61 73 65 73 2c 20 74 68 65 20  ther cases, the 
3980: 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
3990: 64 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20  d to the b-tree 
39a0: 6c 61 79 65 72 2e 20 54 68 65 20 62 2d 74 72 65  layer. The b-tre
39b0: 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72 20 74 68  e.**    layer th
39c0: 65 6e 20 61 74 74 65 6d 70 74 73 20 61 20 72 6f  en attempts a ro
39d0: 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
39e0: 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 63  . If the error c
39f0: 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  ondition .**    
3a00: 70 65 72 73 69 73 74 73 2c 20 74 68 65 20 70 61  persists, the pa
3a10: 67 65 72 20 65 6e 74 65 72 73 20 74 68 65 20 45  ger enters the E
3a20: 52 52 4f 52 20 73 74 61 74 65 20 76 69 61 20 63  RROR state via c
3a30: 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 61 62 6f  ondition (1) abo
3a40: 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 6f 6e  ve..**.**    Con
3a50: 64 69 74 69 6f 6e 20 28 33 29 20 69 73 20 6e 65  dition (3) is ne
3a60: 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20  cessary because 
3a70: 69 74 20 63 61 6e 20 62 65 20 74 72 69 67 67 65  it can be trigge
3a80: 72 65 64 20 62 79 20 61 20 72 65 61 64 2d 6f 6e  red by a read-on
3a90: 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74 65 6d 65  ly.**    stateme
3aa0: 6e 74 20 65 78 65 63 75 74 65 64 20 77 69 74 68  nt executed with
3ab0: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
3ac0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
3ad0: 69 66 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  if the error.** 
3ae0: 20 20 20 63 6f 64 65 20 77 65 72 65 20 73 69 6d     code were sim
3af0: 70 6c 79 20 72 65 74 75 72 6e 65 64 20 74 6f 20  ply returned to 
3b00: 74 68 65 20 75 73 65 72 2c 20 74 68 65 20 62 2d  the user, the b-
3b10: 74 72 65 65 20 6c 61 79 65 72 20 77 6f 75 6c 64  tree layer would
3b20: 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75 74 6f 6d   not.**    autom
3b30: 61 74 69 63 61 6c 6c 79 20 61 74 74 65 6d 70 74  atically attempt
3b40: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20   a rollback, as 
3b50: 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  it assumes that 
3b60: 61 6e 20 65 72 72 6f 72 20 69 6e 20 61 0a 2a 2a  an error in a.**
3b70: 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79 20 73 74      read-only st
3b80: 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f 74 20 6c  atement cannot l
3b90: 65 61 76 65 20 74 68 65 20 70 61 67 65 72 20 69  eave the pager i
3ba0: 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 20  n an internally 
3bb0: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 0a 2a 2a  inconsistent .**
3bc0: 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a      state..**.**
3bd0: 20 20 20 20 2a 20 54 68 65 20 50 61 67 65 72 2e      * The Pager.
3be0: 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
3bf0: 20 69 73 20 73 65 74 20 74 6f 20 73 6f 6d 65 74   is set to somet
3c00: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
3c10: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 20 20  SQLITE_OK..**   
3c20: 20 2a 20 54 68 65 72 65 20 61 72 65 20 6f 6e 65   * There are one
3c30: 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e   or more outstan
3c40: 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
3c50: 74 6f 20 70 61 67 65 73 20 28 61 66 74 65 72 20  to pages (after 
3c60: 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c 61 73 74  the.**      last
3c70: 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 64 72   reference is dr
3c80: 6f 70 70 65 64 20 74 68 65 20 70 61 67 65 72 20  opped the pager 
3c90: 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62 61 63 6b  should move back
3ca0: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 29 2e   to OPEN state).
3cb0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 70 61 67  .**    * The pag
3cc0: 65 72 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 2d  er is not an in-
3cd0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a 2a 2a  memory pager..**
3ce0: 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 73      .**.** Notes
3cf0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 20 70 61  :.**.**   * A pa
3d00: 67 65 72 20 69 73 20 6e 65 76 65 72 20 69 6e 20  ger is never in 
3d10: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 6f 72 20  WRITER_DBMOD or 
3d20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
3d30: 73 74 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20  state if the.** 
3d40: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69      connection i
3d50: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f  s open in WAL mo
3d60: 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e 6e 65 63  de. A WAL connec
3d70: 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69  tion is always i
3d80: 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 6f 66 20  n one.**     of 
3d90: 74 68 65 20 66 69 72 73 74 20 66 6f 75 72 20 73  the first four s
3da0: 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  tates..**.**   *
3db0: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20 63 6f 6e   Normally, a con
3dc0: 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20 69 6e 20  nection open in 
3dd0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 69  exclusive mode i
3de0: 73 20 6e 65 76 65 72 20 69 6e 20 50 41 47 45 52  s never in PAGER
3df0: 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20 73 74 61  _OPEN.**     sta
3e00: 74 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  te. There are tw
3e10: 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a 20 69 6d  o exceptions: im
3e20: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
3e30: 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 68  exclusive-mode h
3e40: 61 73 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 74  as.**     been t
3e50: 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64 20 62 65  urned on (and be
3e60: 66 6f 72 65 20 61 6e 79 20 72 65 61 64 20 6f 72  fore any read or
3e70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
3e80: 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20 20 20 20  ons are .**     
3e90: 65 78 65 63 75 74 65 64 29 2c 20 61 6e 64 20 77  executed), and w
3ea0: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
3eb0: 20 6c 65 61 76 69 6e 67 20 74 68 65 20 22 65 72   leaving the "er
3ec0: 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a 2a 0a 2a  ror state"..**.*
3ed0: 2a 20 20 20 2a 20 53 65 65 20 61 6c 73 6f 3a 20  *   * See also: 
3ee0: 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
3ef0: 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  te()..*/.#define
3f00: 20 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20   PAGER_OPEN     
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 23               0.#
3f20: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52 45 41  define PAGER_REA
3f30: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
3f40: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41 47     1.#define PAG
3f50: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
3f60: 20 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69           2.#defi
3f70: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f80: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 20 20 33  CACHEMOD       3
3f90: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3fa0: 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20  RITER_DBMOD     
3fb0: 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 50       4.#define P
3fc0: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
3fd0: 53 48 45 44 20 20 20 20 20 20 20 35 0a 23 64 65  SHED       5.#de
3fe0: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 4f 52  fine PAGER_ERROR
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 50 61   6../*.** The Pa
4010: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
4020: 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  le is almost alw
4030: 61 79 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6f  ays set to one o
4040: 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  f the .** follow
4050: 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73 74 61 74  ing locking-stat
4060: 65 73 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  es, according to
4070: 20 74 68 65 20 6c 6f 63 6b 20 63 75 72 72 65 6e   the lock curren
4080: 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a 2a 20 74  tly held on.** t
4090: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
40a0: 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45  : NO_LOCK, SHARE
40b0: 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
40c0: 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49  _LOCK or EXCLUSI
40d0: 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54 68 69 73  VE_LOCK..** This
40e0: 20 76 61 72 69 61 62 6c 65 20 69 73 20 6b 65 70   variable is kep
40f0: 74 20 75 70 20 74 6f 20 64 61 74 65 20 61 73 20  t up to date as 
4100: 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b 65 6e 20  locks are taken 
4110: 61 6e 64 20 72 65 6c 65 61 73 65 64 20 62 79 0a  and released by.
4120: 2a 2a 20 74 68 65 20 70 61 67 65 72 4c 6f 63 6b  ** the pagerLock
4130: 44 62 28 29 20 61 6e 64 20 70 61 67 65 72 55 6e  Db() and pagerUn
4140: 6c 6f 63 6b 44 62 28 29 20 77 72 61 70 70 65 72  lockDb() wrapper
4150: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
4160: 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f 72 20 78  VFS xLock() or x
4170: 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73  Unlock() returns
4180: 20 61 6e 20 65 72 72 6f 72 20 6f 74 68 65 72 20   an error other 
4190: 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  than SQLITE_BUSY
41a0: 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65 20 6f 66  .** (i.e. one of
41b0: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
41c0: 52 20 73 75 62 74 79 70 65 73 29 2c 20 69 74 20  R subtypes), it 
41d0: 69 73 20 6e 6f 74 20 63 6c 65 61 72 20 77 68 65  is not clear whe
41e0: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
41f0: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 61 73  he operation was
4200: 20 73 75 63 63 65 73 73 66 75 6c 2e 20 49 6e 20   successful. In 
4210: 74 68 65 73 65 20 63 69 72 63 75 6d 73 74 61 6e  these circumstan
4220: 63 65 73 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  ces pagerLockDb(
4230: 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65 72 55 6e  ) and.** pagerUn
4240: 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65 20 61 20  lockDb() take a 
4250: 63 6f 6e 73 65 72 76 61 74 69 76 65 20 61 70 70  conservative app
4260: 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b 20 69 73  roach - eLock is
4270: 20 61 6c 77 61 79 73 20 75 70 64 61 74 65 64 0a   always updated.
4280: 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63 6b 69 6e  ** when unlockin
4290: 67 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  g the file, and 
42a0: 6f 6e 6c 79 20 75 70 64 61 74 65 64 20 77 68 65  only updated whe
42b0: 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69  n locking the fi
42c0: 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20 56 46 53  le if the.** VFS
42d0: 20 63 61 6c 6c 20 69 73 20 73 75 63 63 65 73 73   call is success
42e0: 66 75 6c 2e 20 54 68 69 73 20 77 61 79 2c 20 74  ful. This way, t
42f0: 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76  he Pager.eLock v
4300: 61 72 69 61 62 6c 65 20 6d 61 79 20 62 65 20 73  ariable may be s
4310: 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65 73 73 20  et.** to a less 
4320: 65 78 63 6c 75 73 69 76 65 20 28 6c 6f 77 65 72  exclusive (lower
4330: 29 20 76 61 6c 75 65 20 74 68 61 6e 20 74 68 65  ) value than the
4340: 20 6c 6f 63 6b 20 74 68 61 74 20 69 73 20 61 63   lock that is ac
4350: 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a 2a 20 61  tually held.** a
4360: 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
4370: 65 6c 2c 20 62 75 74 20 69 74 20 69 73 20 6e 65  el, but it is ne
4380: 76 65 72 20 73 65 74 20 74 6f 20 61 20 6d 6f 72  ver set to a mor
4390: 65 20 65 78 63 6c 75 73 69 76 65 20 76 61 6c 75  e exclusive valu
43a0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  e..**.** This is
43b0: 20 75 73 75 61 6c 6c 79 20 73 61 66 65 2e 20 49   usually safe. I
43c0: 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20 66 61 69  f an xUnlock fai
43d0: 6c 73 20 6f 72 20 61 70 70 65 61 72 73 20 74 6f  ls or appears to
43e0: 20 66 61 69 6c 2c 20 74 68 65 72 65 20 6d 61 79   fail, there may
43f0: 20 0a 2a 2a 20 62 65 20 61 20 66 65 77 20 72 65   .** be a few re
4400: 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b 28 29 20  dundant xLock() 
4410: 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f 63 6b 20  calls or a lock 
4420: 6d 61 79 20 62 65 20 68 65 6c 64 20 66 6f 72 20  may be held for 
4430: 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a 2a 20 72  longer than.** r
4440: 65 71 75 69 72 65 64 2c 20 62 75 74 20 6e 6f 74  equired, but not
4450: 68 69 6e 67 20 72 65 61 6c 6c 79 20 67 6f 65 73  hing really goes
4460: 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68   wrong..**.** Th
4470: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77  e exception is w
4480: 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
4490: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
44a0: 64 20 61 73 20 74 68 65 20 70 61 67 65 72 20 6d  d as the pager m
44b0: 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20 45 52 52  oves.** from ERR
44c0: 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  OR to OPEN state
44d0: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
44e0: 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 68  there may be a h
44f0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
4500: 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  .** in the file-
4510: 73 79 73 74 65 6d 20 74 68 61 74 20 6e 65 65 64  system that need
4520: 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
4530: 61 63 6b 20 28 61 73 20 70 61 72 74 20 6f 66 20  ack (as part of 
4540: 61 6e 20 4f 50 45 4e 2d 3e 53 48 41 52 45 44 0a  an OPEN->SHARED.
4550: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c 20 62  ** transition, b
4560: 79 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  y the same pager
4570: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29 2e 20   or any other). 
4580: 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78  If the call to x
4590: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61 69 6c  Unlock().** fail
45a0: 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
45b0: 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
45c0: 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20 61 6e   left holding an
45d0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
45e0: 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63 6f 6e   this.** can con
45f0: 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  fuse the call to
4600: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4610: 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64 65 20  ock() call made 
4620: 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a 2a 2a  later as part.**
4630: 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   of hot-journal 
4640: 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  detection..**.**
4650: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4660: 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e 65 64  ock() is defined
4670: 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20 74 72   as returning tr
4680: 75 65 20 22 69 66 20 74 68 65 72 65 20 69 73 20  ue "if there is 
4690: 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a 20 6c  a RESERVED .** l
46a0: 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68 69 73  ock held by this
46b0: 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e 79 20   process or any 
46c0: 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43 68 65  others". So xChe
46d0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
46e0: 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 72  ay .** return tr
46f0: 75 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63  ue because the c
4700: 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69 73 20  aller itself is 
4710: 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
4720: 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74 0a 2a  SIVE lock (but.*
4730: 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77 20 69  * doesn't know i
4740: 74 20 62 65 63 61 75 73 65 20 6f 66 20 61 20 70  t because of a p
4750: 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20 69 6e  revious error in
4760: 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20 74 68   xUnlock). If th
4770: 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 61 20  is happens.** a 
4780: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot-journal may 
4790: 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f 72 20  be mistaken for 
47a0: 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e 67 20  a journal being 
47b0: 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 61 63  created by an ac
47c0: 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
47d0: 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 70  ion in another p
47e0: 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e 67 20  rocess, causing 
47f0: 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64 20 66  SQLite to read f
4800: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
4810: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f 6c 6c  .** without roll
4820: 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  ing it back..**.
4830: 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
4840: 64 20 74 68 69 73 2c 20 69 66 20 61 20 63 61 6c  d this, if a cal
4850: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 20 66  l to xUnlock() f
4860: 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f 63 6b  ails when unlock
4870: 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ing the.** datab
4880: 61 73 65 20 69 6e 20 74 68 65 20 45 52 52 4f 52  ase in the ERROR
4890: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 4c   state, Pager.eL
48a0: 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e  ock is set to UN
48b0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74 0a 2a  KNOWN_LOCK. It.*
48c0: 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65  * is only change
48d0: 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65 61 6c  d back to a real
48e0: 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 61   locking state a
48f0: 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66 75  fter a successfu
4900: 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78 4c 6f  l call.** to xLo
4910: 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e 20 41  ck(EXCLUSIVE). A
4920: 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20 74 6f  lso, the code to
4930: 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e 53 48   do the OPEN->SH
4940: 41 52 45 44 20 73 74 61 74 65 20 74 72 61 6e 73  ARED state trans
4950: 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73 20 74  ition.** omits t
4960: 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68  he check for a h
4970: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 50 61  ot-journal if Pa
4980: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4990: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
49a0: 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73 74 65   .** lock. Inste
49b0: 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73 20 61  ad, it assumes a
49c0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65 78 69   hot-journal exi
49d0: 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e 73 20  sts and obtains 
49e0: 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  an EXCLUSIVE.** 
49f0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
4a00: 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
4a10: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
4a20: 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53 65 65  oll it back. See
4a30: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50 61 67   function.** Pag
4a40: 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 66  erSharedLock() f
4a50: 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 2e 0a  or more detail..
4a60: 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63  **.** Pager.eLoc
4a70: 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 73 65  k may only be se
4a80: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
4a90: 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  K when the pager
4aa0: 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47 45 52   is in .** PAGER
4ab0: 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a 2f 0a  _OPEN state..*/.
4ac0: 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57 4e 5f  #define UNKNOWN_
4ad0: 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20 20 20  LOCK            
4ae0: 20 20 20 20 28 45 58 43 4c 55 53 49 56 45 5f 4c      (EXCLUSIVE_L
4af0: 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 41 20  OCK+1)../*.** A 
4b00: 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69  macro used for i
4b10: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65  nvoking the code
4b20: 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  c if there is on
4b30: 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e.*/.#ifdef SQLI
4b40: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64  TE_HAS_CODEC.# d
4b50: 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44  efine CODEC1(P,D
4b60: 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69 66  ,N,X,E) \.    if
4b70: 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20 50  ( P->xCodec && P
4b80: 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64  ->xCodec(P->pCod
4b90: 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b 20  ec,D,N,X)==0 ){ 
4ba0: 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f  E; }.# define CO
4bb0: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f  DEC2(P,D,N,X,E,O
4bc0: 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e 78  ) \.    if( P->x
4bd0: 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28 63  Codec==0 ){ O=(c
4be0: 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c 0a  har*)D; }else \.
4bf0: 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61 72      if( (O=(char
4c00: 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  *)(P->xCodec(P->
4c10: 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29 3d  pCodec,D,N,X)))=
4c20: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73 65  =0 ){ E; }.#else
4c30: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
4c40: 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f 2a  (P,D,N,X,E)   /*
4c50: 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69   NO-OP */.# defi
4c60: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4c70: 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a 29  X,E,O) O=(char*)
4c80: 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  D.#endif../*.** 
4c90: 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  The maximum allo
4ca0: 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  wed sector size.
4cb0: 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65 20 78   64KiB. If the x
4cc0: 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74  Sectorsize() met
4cd0: 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20  hod .** returns 
4ce0: 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74  a value larger t
4cf0: 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d  han this, then M
4d00: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69  AX_SECTOR_SIZE i
4d10: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
4d20: 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f  ** This could co
4d30: 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73 65 20  nceivably cause 
4d40: 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f  corruption follo
4d50: 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69  wing a power fai
4d60: 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20  lure on.** such 
4d70: 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69  a system. This i
4d80: 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75  s currently an u
4d90: 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69  ndocumented limi
4da0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41  t..*/.#define MA
4db0: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78  X_SECTOR_SIZE 0x
4dc0: 31 30 30 30 30 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e  10000.../*.** An
4dd0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4de0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
4df0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
4e00: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
4e10: 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61  e.** savepoint a
4e20: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  nd statement tra
4e30: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
4e40: 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68  system. All such
4e50: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61   structures.** a
4e60: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
4e70: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
4e80: 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68  t[] array, which
4e90: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
4ea0: 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69  d.** resized usi
4eb0: 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  ng sqlite3Reallo
4ec0: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  c()..**.** When 
4ed0: 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63  a savepoint is c
4ee0: 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65  reated, the Page
4ef0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
4f00: 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a  ffset field is.*
4f10: 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61  * set to 0. If a
4f20: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
4f30: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
4f40: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
4f50: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61   while.** the sa
4f60: 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
4f70: 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73  e, then iHdrOffs
4f80: 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
4f90: 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a   byte offset .**
4fa0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
4fb0: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
4fc0: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
4fd0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
4fe0: 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
4ff0: 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e  before the journ
5000: 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20  al-header. This 
5010: 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69  is required duri
5020: 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  ng savepoint.** 
5030: 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61  rollback (see pa
5040: 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
5050: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65  oint())..*/.type
5060: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
5070: 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53  Savepoint PagerS
5080: 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74  avepoint;.struct
5090: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
50a0: 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  {.  i64 iOffset;
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66   /* Starting off
50d0: 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72  set in main jour
50e0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
50f0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
5100: 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
5110: 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ve */.  Bitvec *
5120: 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  pInSavepoint;   
5130: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70       /* Set of p
5140: 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76  ages in this sav
5150: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f  epoint */.  Pgno
5160: 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20   nOrig;         
5170: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
5180: 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  inal number of p
5190: 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a  ages in file */.
51a0: 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20    Pgno iSubRec; 
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51c0: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
51d0: 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a   record in sub-j
51e0: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
51f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
5200: 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61  L.  u32 aWalData
5210: 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e  [WAL_SAVEPOINT_N
5220: 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a  DATA];        /*
5230: 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63   WAL savepoint c
5240: 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66  ontext */.#endif
5250: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 73 20  .};../*.** Bits 
5260: 6f 66 20 74 68 65 20 50 61 67 65 72 2e 64 6f 4e  of the Pager.doN
5270: 6f 74 53 70 69 6c 6c 20 66 6c 61 67 2e 20 20 53  otSpill flag.  S
5280: 65 65 20 66 75 72 74 68 65 72 20 64 65 73 63 72  ee further descr
5290: 69 70 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a 2a 2f  iption below..*/
52a0: 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c  .#define SPILLFL
52b0: 41 47 5f 4f 46 46 20 20 20 20 20 20 20 20 20 30  AG_OFF         0
52c0: 78 30 31 20 2f 2a 20 4e 65 76 65 72 20 73 70 69  x01 /* Never spi
52d0: 6c 6c 20 63 61 63 68 65 2e 20 20 53 65 74 20 76  ll cache.  Set v
52e0: 69 61 20 70 72 61 67 6d 61 20 2a 2f 0a 23 64 65  ia pragma */.#de
52f0: 66 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 52  fine SPILLFLAG_R
5300: 4f 4c 4c 42 41 43 4b 20 20 20 20 30 78 30 32 20  OLLBACK    0x02 
5310: 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69  /* Current rolli
5320: 6e 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e  ng back, so do n
5330: 6f 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66  ot spill */.#def
5340: 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f  ine SPILLFLAG_NO
5350: 53 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 2f  SYNC      0x04 /
5360: 2a 20 53 70 69 6c 6c 20 69 73 20 6f 6b 2c 20 62  * Spill is ok, b
5370: 75 74 20 64 6f 20 6e 6f 74 20 73 79 6e 63 20 2a  ut do not sync *
5380: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 70 65 6e  /../*.** An open
5390: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61   page cache is a
53a0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74  n instance of st
53b0: 72 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65  ruct Pager. A de
53c0: 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20  scription of.** 
53d0: 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65  some of the more
53e0: 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65   important membe
53f0: 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c  r variables foll
5400: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74  ows:.**.** eStat
5410: 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75  e.**.**   The cu
5420: 72 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66  rrent 'state' of
5430: 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
5440: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
5450: 6e 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20  nt and state.** 
5460: 20 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20    diagram above 
5470: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
5480: 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73  n of the pager s
5490: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63  tate..**.** eLoc
54a0: 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20  k.**.**   For a 
54b0: 72 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74  real on-disk dat
54c0: 61 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65  abase, the curre
54d0: 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  nt lock held on 
54e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
54f0: 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b  e -.**   NO_LOCK
5500: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52  , SHARED_LOCK, R
5510: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20  ESERVED_LOCK or 
5520: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a  EXCLUSIVE_LOCK..
5530: 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65  **.**   For a te
5540: 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
5550: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e  mory database (n
5560: 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20  either of which 
5570: 72 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20  require any.**  
5580: 20 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61   locks), this va
5590: 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73  riable is always
55a0: 20 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56   set to EXCLUSIV
55b0: 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75  E_LOCK. Since su
55c0: 63 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65  ch.**   database
55d0: 73 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61  s always have Pa
55e0: 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64  ger.exclusiveMod
55f0: 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b  e==1, this trick
5600: 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20  s the pager.**  
5610: 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e   logic into thin
5620: 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72  king that it alr
5630: 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65  eady has all the
5640: 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65   locks it will e
5650: 76 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61  ver.**   need (a
5660: 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20  nd no reason to 
5670: 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a  release them)..*
5680: 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28  *.**   In some (
5690: 6f 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73  obscure) circums
56a0: 74 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72  tances, this var
56b0: 69 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62  iable may also b
56c0: 65 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e  e set to.**   UN
56d0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20  KNOWN_LOCK. See 
56e0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
56f0: 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66  e the #define of
5700: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
5710: 72 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a  r.**   details..
5720: 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e  **.** changeCoun
5730: 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  tDone.**.**   Th
5740: 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  is boolean varia
5750: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ble is used to m
5760: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
5770: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5780: 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79   .**   (the 4-by
5790: 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  te header field 
57a0: 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32  at byte offset 2
57b0: 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  4 of the databas
57c0: 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20  e file) is .**  
57d0: 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72   not updated mor
57e0: 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63  e often than nec
57f0: 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20  essary. .**.**  
5800: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72   It is set to tr
5810: 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e  ue when the chan
5820: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
5830: 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69   is updated, whi
5840: 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c  ch .**   can onl
5850: 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65  y happen if an e
5860: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5870: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
5880: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
5890: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28   It is cleared (
58a0: 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68  set to false) wh
58b0: 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73  enever an exclus
58c0: 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  ive lock is .** 
58d0: 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f    relinquished o
58e0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
58f0: 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61  ile. Each time a
5900: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
5910: 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20  committed,.**   
5920: 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  The changeCountD
5930: 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70  one flag is insp
5940: 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20  ected. If it is 
5950: 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f  true, the work o
5960: 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20  f.**   updating 
5970: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5980: 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f  er is omitted fo
5990: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  r the current tr
59a0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
59b0: 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73     This mechanis
59c0: 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65  m means that whe
59d0: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  n running in exc
59e0: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63  lusive mode, a c
59f0: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  onnection .**   
5a00: 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65  need only update
5a10: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
5a20: 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68  ter once, for th
5a30: 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74  e first transact
5a40: 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74  ion.**   committ
5a50: 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73  ed..**.** setMas
5a60: 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e  ter.**.**   When
5a70: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
5a80: 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64  eOne() is called
5a90: 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61   to commit a tra
5aa0: 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79  nsaction, it may
5ab0: 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f  .**   (or may no
5ac0: 74 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73  t) specify a mas
5ad0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
5ae0: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
5af0: 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f  nto the .**   jo
5b00: 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
5b10: 65 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74  e it is synced t
5b20: 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  o disk..**.**   
5b30: 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
5b40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
5b50: 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d  ntains a master-
5b60: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
5b70: 61 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68  affects .**   th
5b80: 65 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74  e way in which t
5b90: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ba0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74  is finalized aft
5bb0: 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  er the transacti
5bc0: 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d  on is .**   comm
5bd0: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
5be0: 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e  back when runnin
5bf0: 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  g in "journal_mo
5c00: 64 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 65  de=PERSIST" mode
5c10: 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72  ..**   If a jour
5c20: 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
5c30: 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74  t contain a mast
5c40: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er-journal point
5c50: 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66  er, it is.**   f
5c60: 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72  inalized by over
5c70: 77 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73  writing the firs
5c80: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
5c90: 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66   with zeroes. If
5ca0: 0a 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f  .**   it does co
5cb0: 6e 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a  ntain a master-j
5cc0: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74  ournal pointer t
5cd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ce0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a  is finalized .**
5cf0: 20 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67     by truncating
5d00: 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65   it to zero byte
5d10: 73 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68  s, just as if th
5d20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72  e connection wer
5d30: 65 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20  e .**   running 
5d40: 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  in "journal_mode
5d50: 3d 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e  =truncate" mode.
5d60: 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c  .**.**   Journal
5d70: 20 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74   files that cont
5d80: 61 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ain master journ
5d90: 61 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e  al pointers cann
5da0: 6f 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a  ot be finalized.
5db0: 2a 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f  **   simply by o
5dc0: 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66  verwriting the f
5dd0: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
5de0: 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c  der with zeroes,
5df0: 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73   as the.**   mas
5e00: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
5e10: 74 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66  ter could interf
5e20: 65 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75  ere with hot-jou
5e30: 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  rnal rollback of
5e40: 20 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71   any.**   subseq
5e50: 75 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74  uently interrupt
5e60: 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ed transaction t
5e70: 68 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a  hat reuses the j
5e80: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
5e90: 2a 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73  **   The flag is
5ea0: 20 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e   cleared as soon
5eb0: 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
5ec0: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ed0: 64 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62  d (either.**   b
5ee0: 79 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  y PagerCommitPha
5ef0: 73 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f  seTwo or PagerRo
5f00: 6c 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49  llback). If an I
5f10: 4f 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73  O error prevents
5f20: 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61   the.**   journa
5f30: 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e  l file from bein
5f40: 67 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66  g successfully f
5f50: 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65  inalized, the se
5f60: 74 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20  tMaster flag.** 
5f70: 20 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79    is cleared any
5f80: 77 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67  way (and the pag
5f90: 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20  er will move to 
5fa0: 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a  ERROR state)..**
5fb0: 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a 2a  .** doNotSpill.*
5fc0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69  *.**   This vari
5fd0: 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68  ables control th
5fe0: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61  e behavior of ca
5ff0: 63 68 65 2d 73 70 69 6c 6c 73 20 20 28 63 61 6c  che-spills  (cal
6000: 6c 73 20 6d 61 64 65 20 62 79 0a 2a 2a 20 20 20  ls made by.**   
6010: 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c  the pcache modul
6020: 65 20 74 6f 20 74 68 65 20 70 61 67 65 72 53 74  e to the pagerSt
6030: 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74  ress() routine t
6040: 6f 20 77 72 69 74 65 20 63 61 63 68 65 64 20 64  o write cached d
6050: 61 74 61 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20  ata.**   to the 
6060: 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f  file-system in o
6070: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20  rder to free up 
6080: 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20  memory)..**.**  
6090: 20 57 68 65 6e 20 62 69 74 73 20 53 50 49 4c 4c   When bits SPILL
60a0: 46 4c 41 47 5f 4f 46 46 20 6f 72 20 53 50 49 4c  FLAG_OFF or SPIL
60b0: 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 6f  LFLAG_ROLLBACK o
60c0: 66 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 61 72 65  f doNotSpill are
60d0: 20 73 65 74 2c 0a 2a 2a 20 20 20 77 72 69 74 69   set,.**   writi
60e0: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
60f0: 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72  se from pagerStr
6100: 65 73 73 28 29 20 69 73 20 64 69 73 61 62 6c 65  ess() is disable
6110: 64 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a  d altogether..**
6120: 20 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41 47     The SPILLFLAG
6130: 5f 52 4f 4c 4c 42 41 43 4b 20 63 61 73 65 20 69  _ROLLBACK case i
6140: 73 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79  s done in a very
6150: 20 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68   obscure case th
6160: 61 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70  at.**   comes up
6170: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
6180: 74 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20  t rollback that 
6190: 72 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61  requires the pca
61a0: 63 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20  che module.**   
61b0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
61c0: 77 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e  w page to preven
61d0: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
61e0: 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72  le from being wr
61f0: 69 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65  itten.**   while
6200: 20 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61   it is being tra
6210: 76 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69  versed by code i
6220: 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
6230: 28 29 2e 20 20 54 68 65 20 53 50 49 4c 4c 46 4c  ().  The SPILLFL
6240: 41 47 5f 4f 46 46 0a 2a 2a 20 20 20 63 61 73 65  AG_OFF.**   case
6250: 20 69 73 20 61 20 75 73 65 72 20 70 72 65 66 65   is a user prefe
6260: 72 65 6e 63 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  rence..** .**   
6270: 49 66 20 74 68 65 20 53 50 49 4c 4c 46 4c 41 47  If the SPILLFLAG
6280: 5f 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73  _NOSYNC bit is s
6290: 65 74 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74  et, writing to t
62a0: 68 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d  he database from
62b0: 0a 2a 2a 20 20 20 70 61 67 65 72 53 74 72 65 73  .**   pagerStres
62c0: 73 28 29 20 69 73 20 70 65 72 6d 69 74 74 65 64  s() is permitted
62d0: 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68  , but syncing th
62e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
62f0: 73 20 6e 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73  s not..**   This
6300: 20 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20   flag is set by 
6310: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
6320: 65 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 6c  e() when the fil
6330: 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 2d  e-system sector-
6340: 73 69 7a 65 0a 2a 2a 20 20 20 69 73 20 6c 61 72  size.**   is lar
6350: 67 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74  ger than the dat
6360: 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20  abase page-size 
6370: 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76  in order to prev
6380: 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79  ent a journal sy
6390: 6e 63 0a 2a 2a 20 20 20 66 72 6f 6d 20 68 61 70  nc.**   from hap
63a0: 70 65 6e 69 6e 67 20 69 6e 20 62 65 74 77 65 65  pening in betwee
63b0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  n the journallin
63c0: 67 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f  g of two pages o
63d0: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  n the same secto
63e0: 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e  r. .**.** subjIn
63f0: 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54  Memory.**.**   T
6400: 68 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e  his is a boolean
6410: 20 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72   variable. If tr
6420: 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ue, then any req
6430: 75 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61  uired sub-journa
6440: 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64  l.**   is opened
6450: 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
6460: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
6470: 66 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e  f false, then in
6480: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62  -memory.**   sub
6490: 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e  -journals are on
64a0: 6c 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ly used for in-m
64b0: 65 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65  emory pager file
64c0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  s..**.**   This 
64d0: 76 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61  variable is upda
64e0: 74 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ted by the upper
64f0: 20 6c 61 79 65 72 20 65 61 63 68 20 74 69 6d 65   layer each time
6500: 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77 72 69   a new .**   wri
6510: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6520: 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  s opened..**.** 
6530: 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69  dbSize, dbOrigSi
6540: 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a  ze, dbFileSize.*
6550: 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 20  *.**   Variable 
6560: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
6570: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
6580: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
6590: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
65a0: 49 74 20 69 73 20 76 61 6c 69 64 20 69 6e 20 50  It is valid in P
65b0: 41 47 45 52 5f 52 45 41 44 45 52 20 61 6e 64 20  AGER_READER and 
65c0: 68 69 67 68 65 72 20 73 74 61 74 65 73 20 28 61  higher states (a
65d0: 6c 6c 20 73 74 61 74 65 73 20 65 78 63 65 70 74  ll states except
65e0: 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e 20 61   for.**   OPEN a
65f0: 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a 0a 2a  nd ERROR). .**.*
6600: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 73 65  *   dbSize is se
6610: 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
6620: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
6630: 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
6640: 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c 61 72  may be .**   lar
6650: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a  ger than the siz
6660: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
6670: 65 20 28 74 68 65 20 76 61 6c 75 65 20 73 74 6f  e (the value sto
6680: 72 65 64 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a  red at offset.**
6690: 20 20 20 32 38 20 6f 66 20 74 68 65 20 64 61 74     28 of the dat
66a0: 61 62 61 73 65 20 68 65 61 64 65 72 20 62 79 20  abase header by 
66b0: 74 68 65 20 62 74 72 65 65 29 2e 20 49 66 20 74  the btree). If t
66c0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
66d0: 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20  ile.**   is not 
66e0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
66f0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d  ple of the page-
6700: 73 69 7a 65 2c 20 74 68 65 20 76 61 6c 75 65 20  size, the value 
6710: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 64  stored in.**   d
6720: 62 53 69 7a 65 20 69 73 20 72 6f 75 6e 64 65 64  bSize is rounded
6730: 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20 35 4b   down (i.e. a 5K
6740: 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70  B file with 2K p
6750: 61 67 65 2d 73 69 7a 65 20 68 61 73 20 64 62 53  age-size has dbS
6760: 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20 45 78  ize==2)..**   Ex
6770: 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 74  cept, any file t
6780: 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
6790: 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
67a0: 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ize is considere
67b0: 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65 20 61  d.**   to have a
67c0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65  t least one page
67d0: 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42 20 66 69  . (i.e. a 1KB fi
67e0: 6c 65 20 77 69 74 68 20 32 4b 20 70 61 67 65 2d  le with 2K page-
67f0: 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20 20 20  size leads.**   
6800: 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e 0a 2a  to dbSize==1)..*
6810: 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20  *.**   During a 
6820: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6830: 6e 2c 20 69 66 20 70 61 67 65 73 20 77 69 74 68  n, if pages with
6840: 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72   page-numbers gr
6850: 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20  eater than.**   
6860: 64 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66  dbSize are modif
6870: 69 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  ied in the cache
6880: 2c 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61  , dbSize is upda
6890: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
68a0: 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c  .**   Similarly,
68b0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
68c0: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73   is truncated us
68d0: 69 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74  ing PagerTruncat
68e0: 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20 20 20  eImage(), .**   
68f0: 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 65  dbSize is update
6900: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61  d..**.**   Varia
6910: 62 6c 65 73 20 64 62 4f 72 69 67 53 69 7a 65 20  bles dbOrigSize 
6920: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 61  and dbFileSize a
6930: 72 65 20 76 61 6c 69 64 20 69 6e 20 73 74 61 74  re valid in stat
6940: 65 73 20 0a 2a 2a 20 20 20 50 41 47 45 52 5f 57  es .**   PAGER_W
6950: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61 6e 64  RITER_LOCKED and
6960: 20 68 69 67 68 65 72 2e 20 64 62 4f 72 69 67 53   higher. dbOrigS
6970: 69 7a 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ize is a copy of
6980: 20 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a 20 20   the dbSize.**  
6990: 20 76 61 72 69 61 62 6c 65 20 61 74 20 74 68 65   variable at the
69a0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
69b0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
69c0: 20 75 73 65 64 20 64 75 72 69 6e 67 20 72 6f 6c   used during rol
69d0: 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e 64 20  lback,.**   and 
69e0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
69f0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 67 65  ther or not page
6a00: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  s need to be jou
6a10: 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65 0a 2a  rnalled before.*
6a20: 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  *   being modifi
6a30: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 72 6f  ed..**.**   Thro
6a40: 75 67 68 6f 75 74 20 61 20 77 72 69 74 65 2d 74  ughout a write-t
6a50: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62 46 69  ransaction, dbFi
6a60: 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20  leSize contains 
6a70: 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 20  the size of.**  
6a80: 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
6a90: 6b 20 69 6e 20 70 61 67 65 73 2e 20 49 74 20 69  k in pages. It i
6aa0: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6ab0: 6f 66 20 64 62 53 69 7a 65 20 77 68 65 6e 20 74  of dbSize when t
6ac0: 68 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72  he.**   write-tr
6ad0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72  ansaction is fir
6ae0: 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 75  st opened, and u
6af0: 70 64 61 74 65 64 20 77 68 65 6e 20 56 46 53 20  pdated when VFS 
6b00: 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a  calls are made.*
6b10: 2a 20 20 20 74 6f 20 77 72 69 74 65 20 6f 72 20  *   to write or 
6b20: 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  truncate the dat
6b30: 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
6b40: 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  sk. .**.**   The
6b50: 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65   only reason the
6b60: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
6b70: 61 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  able is required
6b80: 20 69 73 20 74 6f 20 73 75 70 70 72 65 73 73 20   is to suppress 
6b90: 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72  .**   unnecessar
6ba0: 79 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e  y calls to xTrun
6bb0: 63 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d  cate() after com
6bc0: 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
6bd0: 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a 2a 20 20  ction. If, .**  
6be0: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
6bf0: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
6c00: 2c 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  , the dbFileSize
6c10: 20 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61   variable indica
6c20: 74 65 73 20 0a 2a 2a 20 20 20 74 68 61 74 20 74  tes .**   that t
6c30: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6c40: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
6c50: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
6c60: 67 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a 65  ge (Pager.dbSize
6c70: 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  ), .**   pager_t
6c80: 72 75 6e 63 61 74 65 28 29 20 69 73 20 63 61 6c  runcate() is cal
6c90: 6c 65 64 2e 20 54 68 65 20 70 61 67 65 72 5f 74  led. The pager_t
6ca0: 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75  runcate() call u
6cb0: 73 65 73 20 78 46 69 6c 65 73 69 7a 65 28 29 0a  ses xFilesize().
6cc0: 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75 72 65 20  **   to measure 
6cd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6ce0: 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 74  e on disk, and t
6cf0: 68 65 6e 20 74 72 75 6e 63 61 74 65 73 20 69 74  hen truncates it
6d00: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
6d10: 20 20 20 64 62 46 69 6c 65 53 69 7a 65 20 69 73     dbFileSize is
6d20: 20 6e 6f 74 20 75 73 65 64 20 77 68 65 6e 20 72   not used when r
6d30: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
6d40: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
6d50: 69 73 20 63 61 73 65 0a 2a 2a 20 20 20 70 61 67  is case.**   pag
6d60: 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73  er_truncate() is
6d70: 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e 64 69 74   called uncondit
6d80: 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63 68 20 6d  ionally (which m
6d90: 65 61 6e 73 20 74 68 65 72 65 20 6d 61 79 20 62  eans there may b
6da0: 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c 20 74 6f  e.**   a call to
6db0: 20 78 46 69 6c 65 73 69 7a 65 28 29 20 74 68 61   xFilesize() tha
6dc0: 74 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c  t is not strictl
6dd0: 79 20 72 65 71 75 69 72 65 64 29 2e 20 49 6e 20  y required). In 
6de0: 65 69 74 68 65 72 20 63 61 73 65 2c 0a 2a 2a 20  either case,.** 
6df0: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6e00: 28 29 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  () may cause the
6e10: 20 66 69 6c 65 20 74 6f 20 62 65 63 6f 6d 65 20   file to become 
6e20: 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61 72 67 65  smaller or large
6e30: 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69 6e 74 53  r..**.** dbHintS
6e40: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ize.**.**   The 
6e50: 64 62 48 69 6e 74 53 69 7a 65 20 76 61 72 69 61  dbHintSize varia
6e60: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6c  ble is used to l
6e70: 69 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20  imit the number 
6e80: 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 6f  of calls made to
6e90: 0a 2a 2a 20 20 20 74 68 65 20 56 46 53 20 78 46  .**   the VFS xF
6ea0: 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c  ileControl(FCNTL
6eb0: 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68  _SIZE_HINT) meth
6ec0: 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 48  od. .**.**   dbH
6ed0: 69 6e 74 53 69 7a 65 20 69 73 20 73 65 74 20 74  intSize is set t
6ee0: 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  o a copy of the 
6ef0: 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  dbSize variable 
6f00: 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77 72 69 74  when a.**   writ
6f10: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
6f20: 20 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20   opened (at the 
6f30: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46  same time as dbF
6f40: 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a 2a 20 20  ileSize and.**  
6f50: 20 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66   dbOrigSize). If
6f60: 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f   the xFileContro
6f70: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6f80: 54 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c  T) method is cal
6f90: 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48 69 6e 74  led,.**   dbHint
6fa0: 53 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 65  Size is increase
6fb0: 64 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  d to the number 
6fc0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 63 6f  of pages that co
6fd0: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 0a  rrespond to the.
6fe0: 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 20 70  **   size-hint p
6ff0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 65 74  assed to the met
7000: 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 70 61  hod call. See pa
7010: 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
7020: 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20 20 20 64  st() for .**   d
7030: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 65 72  etails..**.** er
7040: 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  rCode.**.**   Th
7050: 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  e Pager.errCode 
7060: 76 61 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79  variable is only
7070: 20 65 76 65 72 20 75 73 65 64 20 69 6e 20 50 41   ever used in PA
7080: 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
7090: 20 49 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20   It.**   is set 
70a0: 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f  to zero in all o
70b0: 74 68 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20  ther states. In 
70c0: 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
70d0: 65 2c 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  e, Pager.errCode
70e0: 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73   .**   is always
70f0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46   set to SQLITE_F
7100: 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
7110: 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  R or one of the 
7120: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
7130: 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73   .**   sub-codes
7140: 2e 0a 2a 2a 0a 2a 2a 20 73 79 6e 63 46 6c 61 67  ..**.** syncFlag
7150: 73 2c 20 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a  s, walSyncFlags.
7160: 2a 2a 0a 2a 2a 20 20 20 73 79 6e 63 46 6c 61 67  **.**   syncFlag
7170: 73 20 69 73 20 65 69 74 68 65 72 20 53 51 4c 49  s is either SQLI
7180: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 28  TE_SYNC_NORMAL (
7190: 30 78 30 32 29 20 6f 72 20 53 51 4c 49 54 45 5f  0x02) or SQLITE_
71a0: 53 59 4e 43 5f 46 55 4c 4c 20 28 30 78 30 33 29  SYNC_FULL (0x03)
71b0: 2e 0a 2a 2a 20 20 20 73 79 6e 63 46 6c 61 67 73  ..**   syncFlags
71c0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 72 6f 6c   is used for rol
71d0: 6c 62 61 63 6b 20 6d 6f 64 65 2e 20 20 77 61 6c  lback mode.  wal
71e0: 53 79 6e 63 46 6c 61 67 73 20 69 73 20 75 73 65  SyncFlags is use
71f0: 64 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65 0a 2a  d for WAL mode.*
7200: 2a 20 20 20 61 6e 64 20 63 6f 6e 74 61 69 6e 73  *   and contains
7210: 20 74 68 65 20 66 6c 61 67 73 20 75 73 65 64 20   the flags used 
7220: 74 6f 20 73 79 6e 63 20 74 68 65 20 63 68 65 63  to sync the chec
7230: 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69 6f 6e  kpoint operation
7240: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 6c 6f  s in the.**   lo
7250: 77 65 72 20 74 77 6f 20 62 69 74 73 2c 20 61 6e  wer two bits, an
7260: 64 20 73 79 6e 63 20 66 6c 61 67 73 20 75 73 65  d sync flags use
7270: 64 20 66 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  d for transactio
7280: 6e 20 63 6f 6d 6d 69 74 73 20 69 6e 20 74 68 65  n commits in the
7290: 20 57 41 4c 0a 2a 2a 20 20 20 66 69 6c 65 20 69   WAL.**   file i
72a0: 6e 20 62 69 74 73 20 30 78 30 34 20 61 6e 64 20  n bits 0x04 and 
72b0: 30 78 30 38 2e 20 20 49 6e 20 6f 74 68 65 72 20  0x08.  In other 
72c0: 77 6f 72 64 73 2c 20 74 6f 20 67 65 74 20 74 68  words, to get th
72d0: 65 20 63 6f 72 72 65 63 74 20 73 79 6e 63 20 66  e correct sync f
72e0: 6c 61 67 73 0a 2a 2a 20 20 20 66 6f 72 20 63 68  lags.**   for ch
72f0: 65 63 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69  eckpoint operati
7300: 6f 6e 73 2c 20 75 73 65 20 28 77 61 6c 53 79 6e  ons, use (walSyn
7310: 63 46 6c 61 67 73 26 30 78 30 33 29 20 61 6e 64  cFlags&0x03) and
7320: 20 74 6f 20 67 65 74 20 74 68 65 20 63 6f 72 72   to get the corr
7330: 65 63 74 0a 2a 2a 20 20 20 73 79 6e 63 20 66 6c  ect.**   sync fl
7340: 61 67 73 20 66 6f 72 20 74 72 61 6e 73 61 63 74  ags for transact
7350: 69 6f 6e 20 63 6f 6d 6d 69 74 2c 20 75 73 65 20  ion commit, use 
7360: 28 28 77 61 6c 53 79 6e 63 46 6c 61 67 73 3e 3e  ((walSyncFlags>>
7370: 32 29 26 30 78 30 33 29 2e 20 20 4e 6f 74 65 0a  2)&0x03).  Note.
7380: 2a 2a 20 20 20 74 68 61 74 20 77 69 74 68 20 73  **   that with s
7390: 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
73a0: 4c 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 74  L in WAL mode, t
73b0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
73c0: 74 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 0a  t is not synced.
73d0: 2a 2a 20 20 20 6d 65 61 6e 69 6e 67 20 74 68 61  **   meaning tha
73e0: 74 20 74 68 65 20 30 78 30 34 20 61 6e 64 20 30  t the 0x04 and 0
73f0: 78 30 38 20 62 69 74 73 20 61 72 65 20 62 6f 74  x08 bits are bot
7400: 68 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 72 75 63  h zero..*/.struc
7410: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
7420: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
7430: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
7440: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
7450: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
7460: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
7470: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
7480: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
7490: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
74a0: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
74b0: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
74c0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
74d0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
74e0: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
74f0: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7510: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
7520: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
7530: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53  file */.  u8 noS
7540: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
7550: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7560: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
7570: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
7580: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
7590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
75a0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
75b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
75c0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
75d0: 38 20 65 78 74 72 61 53 79 6e 63 3b 20 20 20 20  8 extraSync;    
75e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 79             /* sy
75f0: 6e 63 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  nc directory aft
7600: 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 6c 65 74  er journal delet
7610: 65 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c  e */.  u8 syncFl
7620: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
7630: 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41     /* SYNC_NORMA
7640: 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f  L or SYNC_FULL o
7650: 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38  therwise */.  u8
7660: 20 77 61 6c 53 79 6e 63 46 6c 61 67 73 3b 20 20   walSyncFlags;  
7670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
7680: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 61 62 6f   description abo
7690: 76 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  ve */.  u8 tempF
76a0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
76b0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
76c0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
76d0: 6f 72 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c  or immutable fil
76e0: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b  e */.  u8 noLock
76f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7700: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63     /* Do not loc
7710: 6b 20 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c  k (except in WAL
7720: 20 6d 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72   mode) */.  u8 r
7730: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
7740: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7750: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
7760: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
7770: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
7780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7790: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
77a0: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20   file I/O */..  
77b0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
77c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a  ***********.  **
7800: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
7810: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
7820: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
7830: 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75  s that change du
7840: 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  ring.  ** routin
7850: 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 43 6c  e operation.  Cl
7860: 61 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20  ass members not 
7870: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
7880: 65 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20  e either fixed. 
7890: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67   ** when the pag
78a0: 65 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61  er is first crea
78b0: 74 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79  ted or else only
78c0: 20 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65   change when the
78d0: 72 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67  re is a.  ** sig
78e0: 6e 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68  nificant mode ch
78f0: 61 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68  ange (such as ch
7900: 61 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f  anging the page_
7910: 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  size, locking_mo
7920: 64 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20  de,.  ** or the 
7930: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20  journal_mode).  
7940: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65  From another vie
7950: 77 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d  w, these class m
7960: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a  embers describe.
7970: 20 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22    ** the "state"
7980: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77   of the pager, w
7990: 68 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73  hile other class
79a0: 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62   members describ
79b0: 65 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66  e the.  ** "conf
79c0: 69 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68  iguration" of th
79d0: 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  e pager..  */.  
79e0: 75 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  u8 eState;      
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7a00: 61 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e  ager state (OPEN
7a10: 2c 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52  , READER, WRITER
7a20: 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20  _LOCKED..) */.  
7a30: 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  u8 eLock;       
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
7a50: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
7a60: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
7a70: 65 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  e */.  u8 change
7a80: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
7a90: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
7aa0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
7ab0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
7ac0: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
7ad0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
7ae0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
7af0: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
7b00: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
7b10: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69  */.  u8 doNotSpi
7b20: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7b30: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c   /* Do not spill
7b40: 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
7b50: 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38  non-zero */.  u8
7b60: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20   subjInMemory;  
7b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7b80: 65 20 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f  e to use in-memo
7b90: 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20  ry sub-journals 
7ba0: 2a 2f 0a 20 20 75 38 20 62 55 73 65 46 65 74 63  */.  u8 bUseFetc
7bb0: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
7bc0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
7bd0: 78 46 65 74 63 68 28 29 20 2a 2f 0a 20 20 75 38  xFetch() */.  u8
7be0: 20 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f   hasHeldSharedLo
7bf0: 63 6b 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ck;       /* Tru
7c00: 65 20 69 66 20 61 20 73 68 61 72 65 64 20 6c 6f  e if a shared lo
7c10: 63 6b 20 68 61 73 20 65 76 65 72 20 62 65 65 6e  ck has ever been
7c20: 20 68 65 6c 64 20 2a 2f 0a 20 20 50 67 6e 6f 20   held */.  Pgno 
7c30: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
7c40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7c50: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
7c60: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
7c70: 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20  gno dbOrigSize; 
7c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
7c90: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
7ca0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
7cb0: 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ion */.  Pgno db
7cc0: 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  FileSize;       
7cd0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7ce0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
7cf0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7d00: 20 20 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a    Pgno dbHintSiz
7d10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
7d20: 20 56 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f   Value passed to
7d30: 20 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54   FCNTL_SIZE_HINT
7d40: 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65   call */.  int e
7d50: 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20  rrCode;         
7d60: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
7d70: 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f   several kinds o
7d80: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e  f errors */.  in
7d90: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
7da0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7db0: 65 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69  es journalled si
7dc0: 6e 63 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65  nce last j-heade
7dd0: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75  r written */.  u
7de0: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
7df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
7e00: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
7e10: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
7e20: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33  checksum */.  u3
7e30: 32 20 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20  2 nSubRec;      
7e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7e50: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77  ber of records w
7e60: 72 69 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f  ritten to sub-jo
7e70: 75 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65  urnal */.  Bitve
7e80: 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20  c *pInJournal;  
7e90: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
7ea0: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
7eb0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7ec0: 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  file */.  sqlite
7ed0: 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20  3_file *fd;     
7ee0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
7ef0: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74  scriptor for dat
7f00: 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
7f10: 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20  e3_file *jfd;   
7f20: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
7f30: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61  escriptor for ma
7f40: 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
7f50: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a  sqlite3_file *sj
7f60: 66 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46  fd;         /* F
7f70: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7f80: 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a  or sub-journal *
7f90: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f  /.  i64 journalO
7fa0: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
7fb0: 2f 2a 20 43 75 72 72 65 6e 74 20 77 72 69 74 65  /* Current write
7fc0: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a   offset in the j
7fd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
7fe0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b   i64 journalHdr;
7ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8000: 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70  Byte offset to p
8010: 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20  revious journal 
8020: 68 65 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69  header */.  sqli
8030: 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
8040: 6b 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  kup;    /* Point
8050: 65 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e  er to list of on
8060: 67 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f  going backup pro
8070: 63 65 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65  cesses */.  Page
8080: 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76  rSavepoint *aSav
8090: 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79  epoint; /* Array
80a0: 20 6f 66 20 61 63 74 69 76 65 20 73 61 76 65 70   of active savep
80b0: 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  oints */.  int n
80c0: 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20  Savepoint;      
80d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
80e0: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
80f0: 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a  aSavepoint[] */.
8100: 20 20 75 33 32 20 69 44 61 74 61 56 65 72 73 69    u32 iDataVersi
8110: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  on;           /*
8120: 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65   Changes wheneve
8130: 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65  r database conte
8140: 6e 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  nt changes */.  
8150: 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
8160: 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  16];        /* C
8170: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
8180: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
8190: 61 6e 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20  anges */..  int 
81a0: 6e 4d 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20  nMmapOut;       
81b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
81c0: 72 20 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20  r of mmap pages 
81d0: 63 75 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61  currently outsta
81e0: 6e 64 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74  nding */.  sqlit
81f0: 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b  e3_int64 szMmap;
8200: 20 20 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65         /* Desire
8210: 64 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73  d maximum mmap s
8220: 69 7a 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ize */.  PgHdr *
8230: 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20  pMmapFreelist;  
8240: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
8250: 66 72 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68  free mmap page h
8260: 65 61 64 65 72 73 20 28 70 44 69 72 74 79 29 20  eaders (pDirty) 
8270: 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64  */.  /*.  ** End
8280: 20 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c   of the routinel
8290: 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73  y-changing class
82a0: 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a   members.  *****
82b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82f0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e  ******/..  u16 n
8300: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
8310: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
8320: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
8330: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
8340: 70 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52  page */.  i16 nR
8350: 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
8360: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8370: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
8380: 61 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70  at end of each p
8390: 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73  age */.  u32 vfs
83a0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
83b0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
83c0: 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  r sqlite3_vfs.xO
83d0: 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73  pen() */.  u32 s
83e0: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
83f0: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
8400: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
8410: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
8420: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8440: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
8450: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
8460: 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20   Pgno mxPgno;   
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8480: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
8490: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
84a0: 62 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  base */.  i64 jo
84b0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20  urnalSizeLimit; 
84c0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69        /* Size li
84d0: 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65  mit for persiste
84e0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nt journal files
84f0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
8500: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
8510: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
8520: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
8530: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
8540: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
8550: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
8560: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
8570: 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
8580: 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20  ler)(void*); /* 
8590: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c  Function to call
85a0: 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20   when busy */.  
85b0: 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
85c0: 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43  erArg;      /* C
85d0: 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20  ontext argument 
85e0: 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72  for xBusyHandler
85f0: 20 2a 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b   */.  int aStat[
8600: 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  3];             
8610: 20 20 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65    /* Total cache
8620: 20 68 69 74 73 2c 20 6d 69 73 73 65 73 20 61 6e   hits, misses an
8630: 64 20 77 72 69 74 65 73 20 2a 2f 0a 23 69 66 64  d writes */.#ifd
8640: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
8650: 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20   int nRead;     
8660: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8670: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
8680: 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ead */.#endif.  
8690: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72  void (*xReiniter
86a0: 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43  )(DbPage*); /* C
86b0: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
86c0: 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20   when reloading 
86d0: 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 28  pages */.  int (
86e0: 2a 78 47 65 74 29 28 50 61 67 65 72 2a 2c 50 67  *xGet)(Pager*,Pg
86f0: 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c 69 6e 74 29  no,DbPage**,int)
8700: 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20  ; /* Routine to 
8710: 66 65 74 63 68 20 61 20 70 61 74 63 68 20 2a 2f  fetch a patch */
8720: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
8730: 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20  AS_CODEC.  void 
8740: 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
8750: 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
8760: 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72  ; /* Routine for
8770: 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74   en/decoding dat
8780: 61 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  a */.  void (*xC
8790: 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f  odecSizeChng)(vo
87a0: 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a  id*,int,int); /*
87b0: 20 4e 6f 74 69 66 79 20 6f 66 20 70 61 67 65 20   Notify of page 
87c0: 73 69 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a  size changes */.
87d0: 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46    void (*xCodecF
87e0: 72 65 65 29 28 76 6f 69 64 2a 29 3b 20 20 20 20  ree)(void*);    
87f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74           /* Dest
8800: 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63  ructor for the c
8810: 6f 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  odec */.  void *
8820: 70 43 6f 64 65 63 3b 20 20 20 20 20 20 20 20 20  pCodec;         
8830: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
8840: 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65  rgument to xCode
8850: 63 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a  c... methods */.
8860: 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70  #endif.  char *p
8870: 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20 20  TmpSpace;       
8880: 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61       /* Pager.pa
8890: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
88a0: 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73  space for tmp us
88b0: 65 20 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70  e */.  PCache *p
88c0: 50 43 61 63 68 65 3b 20 20 20 20 20 20 20 20 20  PCache;         
88d0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
88e0: 20 70 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65   page cache obje
88f0: 63 74 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  ct */.#ifndef SQ
8900: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
8910: 57 61 6c 20 2a 70 57 61 6c 3b 20 20 20 20 20 20  Wal *pWal;      
8920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
8930: 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 75  rite-ahead log u
8940: 73 65 64 20 62 79 20 22 6a 6f 75 72 6e 61 6c 5f  sed by "journal_
8950: 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f 0a 20 20 63  mode=wal" */.  c
8960: 68 61 72 20 2a 7a 57 61 6c 3b 20 20 20 20 20 20  har *zWal;      
8970: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8980: 6c 65 20 6e 61 6d 65 20 66 6f 72 20 77 72 69 74  le name for writ
8990: 65 2d 61 68 65 61 64 20 6c 6f 67 20 2a 2f 0a 23  e-ahead log */.#
89a0: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
89b0: 49 6e 64 65 78 65 73 20 66 6f 72 20 75 73 65 20  Indexes for use 
89c0: 77 69 74 68 20 50 61 67 65 72 2e 61 53 74 61 74  with Pager.aStat
89d0: 5b 5d 2e 20 54 68 65 20 50 61 67 65 72 2e 61 53  []. The Pager.aS
89e0: 74 61 74 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74  tat[] array cont
89f0: 61 69 6e 73 0a 2a 2a 20 74 68 65 20 76 61 6c 75  ains.** the valu
8a00: 65 73 20 61 63 63 65 73 73 65 64 20 62 79 20 70  es accessed by p
8a10: 61 73 73 69 6e 67 20 53 51 4c 49 54 45 5f 44 42  assing SQLITE_DB
8a20: 53 54 41 54 55 53 5f 43 41 43 48 45 5f 48 49 54  STATUS_CACHE_HIT
8a30: 2c 20 43 41 43 48 45 5f 4d 49 53 53 20 0a 2a 2a  , CACHE_MISS .**
8a40: 20 6f 72 20 43 41 43 48 45 5f 57 52 49 54 45 20   or CACHE_WRITE 
8a50: 74 6f 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74  to sqlite3_db_st
8a60: 61 74 75 73 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  atus()..*/.#defi
8a70: 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 48 49  ne PAGER_STAT_HI
8a80: 54 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41  T   0.#define PA
8a90: 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 20 20 31  GER_STAT_MISS  1
8aa0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
8ab0: 54 41 54 5f 57 52 49 54 45 20 32 0a 0a 2f 2a 0a  TAT_WRITE 2../*.
8ac0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
8ad0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
8ae0: 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20  s hold counters 
8af0: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
8b00: 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c  ing purposes onl
8b10: 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  y.  These variab
8b20: 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  les do not exist
8b30: 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73   in.** a non-tes
8b40: 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65  ting build.  The
8b50: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
8b60: 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65   not thread-safe
8b70: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
8b80: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
8b90: 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
8ba0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
8bb0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
8bc0: 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d   pages read from
8bd0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
8be0: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
8bf0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a  _count = 0;   /*
8c00: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
8c10: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
8c20: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
8c30: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
8c40: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
8c50: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
8c60: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
8c70: 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  nal */.# define 
8c80: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76  PAGER_INCR(v)  v
8c90: 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ++.#else.# defin
8ca0: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a  e PAGER_INCR(v).
8cb0: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
8cc0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
8cd0: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
8ce0: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
8cf0: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
8d00: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
8d10: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
8d20: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
8d30: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
8d40: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
8d50: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
8d60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
8d70: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
8d80: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
8d90: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
8da0: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
8db0: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
8dc0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
8dd0: 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e  being.** written
8de0: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
8df0: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
8e00: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
8e10: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
8e20: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
8e30: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
8e40: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
8e50: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
8e60: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
8e70: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
8e80: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
8e90: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
8ea0: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
8eb0: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
8ec0: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
8ed0: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
8ee0: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
8ef0: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
8f00: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
8f10: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
8f20: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
8f30: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
8f40: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
8f50: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
8f60: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
8f70: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
8f80: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
8f90: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
8fa0: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
8fb0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
8fc0: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
8fd0: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
8fe0: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
8ff0: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
9000: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
9010: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
9020: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
9030: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
9040: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
9050: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
9060: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
9070: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
9080: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
9090: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
90a0: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
90b0: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
90c0: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
90d0: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
90e0: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
90f0: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
9100: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
9110: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
9120: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
9130: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
9140: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
9150: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
9160: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
9170: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
9180: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
9190: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
91a0: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
91b0: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
91c0: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
91d0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
91e0: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
91f0: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
9200: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
9210: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
9220: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
9230: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
9240: 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63  ze of the of eac
9250: 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e  h page record in
9260: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
9270: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20  given by.** the 
9280: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e  following macro.
9290: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
92a0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
92b0: 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67  )  ((pPager->pag
92c0: 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a  eSize) + 8)../*.
92d0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** The journal h
92e0: 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74  eader size for t
92f0: 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20  his pager. This 
9300: 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73  is usually the s
9310: 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20  ame .** size as 
9320: 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
9330: 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73  ctor. See also s
9340: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a  etSectorSize()..
9350: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
9360: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
9370: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
9380: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
9390: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
93a0: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
93b0: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
93c0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
93d0: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
93e0: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
93f0: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
9400: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
9410: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
9420: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
9430: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
9440: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
9450: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
9460: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
9470: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
9480: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
9490: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
94a0: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
94b0: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
94c0: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
94d0: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
94e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
94f0: 65 20 6d 61 63 72 6f 20 55 53 45 46 45 54 43 48  e macro USEFETCH
9500: 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61   is true if we a
9510: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73  re allowed to us
9520: 65 20 74 68 65 20 78 46 65 74 63 68 20 61 6e 64  e the xFetch and
9530: 20 78 55 6e 66 65 74 63 68 0a 2a 2a 20 69 6e 74   xUnfetch.** int
9540: 65 72 66 61 63 65 73 20 74 6f 20 61 63 63 65 73  erfaces to acces
9550: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75  s the database u
9560: 73 69 6e 67 20 6d 65 6d 6f 72 79 2d 6d 61 70 70  sing memory-mapp
9570: 65 64 20 49 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53  ed I/O..*/.#if S
9580: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
9590: 49 5a 45 3e 30 0a 23 20 64 65 66 69 6e 65 20 55  IZE>0.# define U
95a0: 53 45 46 45 54 43 48 28 78 29 20 28 28 78 29 2d  SEFETCH(x) ((x)-
95b0: 3e 62 55 73 65 46 65 74 63 68 29 0a 23 65 6c 73  >bUseFetch).#els
95c0: 65 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45  e.# define USEFE
95d0: 54 43 48 28 78 29 20 30 0a 23 65 6e 64 69 66 0a  TCH(x) 0.#endif.
95e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
95f0: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
9600: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
9610: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
9620: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
9630: 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20  47483647../*.** 
9640: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
9650: 68 69 73 20 70 61 67 65 72 20 75 73 65 73 20 61  his pager uses a
9660: 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
9670: 20 74 6f 20 72 65 61 64 20 70 61 67 65 20 70 67   to read page pg
9680: 6e 6f 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61  no..** Return fa
9690: 6c 73 65 20 69 66 20 74 68 65 20 70 61 67 65 72  lse if the pager
96a0: 20 72 65 61 64 73 20 70 67 6e 6f 20 64 69 72 65   reads pgno dire
96b0: 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61  ctly from the da
96c0: 74 61 62 61 73 65 2e 0a 2a 2f 0a 23 69 66 20 21  tabase..*/.#if !
96d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
96e0: 4d 49 54 5f 57 41 4c 29 20 26 26 20 64 65 66 69  MIT_WAL) && defi
96f0: 6e 65 64 28 53 51 4c 49 54 45 5f 44 49 52 45 43  ned(SQLITE_DIREC
9700: 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 29  T_OVERFLOW_READ)
9710: 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
9720: 72 55 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70  rUseWal(Pager *p
9730: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
9740: 29 7b 0a 20 20 75 33 32 20 69 52 65 61 64 20 3d  ){.  u32 iRead =
9750: 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
9760: 69 66 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  if( pPager->pWal
9770: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
9780: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
9790: 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
97a0: 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26  r->pWal, pgno, &
97b0: 69 52 65 61 64 29 3b 0a 20 20 72 65 74 75 72 6e  iRead);.  return
97c0: 20 72 63 20 7c 7c 20 69 52 65 61 64 3b 0a 7d 0a   rc || iRead;.}.
97d0: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
97e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23  QLITE_OMIT_WAL.#
97f0: 20 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65   define pagerUse
9800: 57 61 6c 28 78 29 20 28 28 78 29 2d 3e 70 57 61  Wal(x) ((x)->pWa
9810: 6c 21 3d 30 29 0a 23 65 6c 73 65 0a 23 20 64 65  l!=0).#else.# de
9820: 66 69 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c  fine pagerUseWal
9830: 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70  (x) 0.# define p
9840: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
9850: 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  x) 0.# define pa
9860: 67 65 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77  gerWalFrames(v,w
9870: 2c 78 2c 79 29 20 30 0a 23 20 64 65 66 69 6e 65  ,x,y) 0.# define
9880: 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
9890: 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45  resent(z) SQLITE
98a0: 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67  _OK.# define pag
98b0: 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
98c0: 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45  action(z) SQLITE
98d0: 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  _OK.#endif..#ifn
98e0: 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a  def NDEBUG ./*.*
98f0: 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20  * Usage:.**.**  
9900: 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
9910: 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
9920: 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69  er) );.**.** Thi
9930: 73 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20  s function runs 
9940: 6d 61 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20  many asserts to 
9950: 74 72 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f  try to find inco
9960: 6e 73 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a  nsistencies in.*
9970: 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  * the internal s
9980: 74 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65  tate of the Page
9990: 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  r object..*/.sta
99a0: 74 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70  tic int assert_p
99b0: 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72  ager_state(Pager
99c0: 20 2a 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70   *p){.  Pager *p
99d0: 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a  Pager = p;..  /*
99e0: 20 53 74 61 74 65 20 6d 75 73 74 20 62 65 20 76   State must be v
99f0: 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72  alid. */.  asser
9a00: 74 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  t( p->eState==PA
9a10: 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20  GER_OPEN.       
9a20: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9a30: 47 45 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20  GER_READER.     
9a40: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9a50: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
9a60: 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  KED.       || p-
9a70: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9a80: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
9a90: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
9aa0: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
9ab0: 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  _DBMOD.       ||
9ac0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9ad0: 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  R_WRITER_FINISHE
9ae0: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
9af0: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52  State==PAGER_ERR
9b00: 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  OR.  );..  /* Re
9b10: 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
9b20: 63 75 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61  current state, a
9b30: 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65   temp-file conne
9b40: 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68  ction always beh
9b50: 61 76 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20  aves.  ** as if 
9b60: 69 74 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73  it has an exclus
9b70: 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
9b80: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
9b90: 74 20 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a  t never updates.
9ba0: 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d    ** the change-
9bb0: 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73  counter field, s
9bc0: 6f 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e  o the changeCoun
9bd0: 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c  tDone flag is al
9be0: 77 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  ways set..  */. 
9bf0: 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70   assert( p->temp
9c00: 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c  File==0 || p->eL
9c10: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
9c20: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
9c30: 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20   p->tempFile==0 
9c40: 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  || pPager->chang
9c50: 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20  eCountDone );.. 
9c60: 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f   /* If the useJo
9c70: 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c  urnal flag is cl
9c80: 65 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ear, the journal
9c90: 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f  -mode must be "O
9ca0: 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69  FF". .  ** And i
9cb0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  f the journal-mo
9cc0: 64 65 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65  de is "OFF", the
9cd0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
9ce0: 73 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a  st not be open..
9cf0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
9d00: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
9d10: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
9d20: 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f  _OFF || p->useJo
9d30: 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
9d40: 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  t( p->journalMod
9d50: 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
9d60: 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f  MODE_OFF || !isO
9d70: 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a  pen(p->jfd) );..
9d80: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
9d90: 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f  MEMDB implies no
9da0: 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d  Sync. And an in-
9db0: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20  memory journal. 
9dc0: 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73  Since .  ** this
9dd0: 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d   means an in-mem
9de0: 6f 72 79 20 70 61 67 65 72 20 70 65 72 66 6f 72  ory pager perfor
9df0: 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c  ms no IO at all,
9e00: 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75   it cannot encou
9e10: 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65  nter .  ** eithe
9e20: 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f  r SQLITE_IOERR o
9e30: 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75  r SQLITE_FULL du
9e40: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  ring rollback or
9e50: 20 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e   while finalizin
9e60: 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61  g .  ** a journa
9e70: 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67  l file. (althoug
9e80: 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  h the in-memory 
9e90: 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e  journal implemen
9ea0: 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a  tation may .  **
9eb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
9ec0: 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65  OERR_NOMEM while
9ed0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
9ee0: 65 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  e is being writt
9ef0: 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73  en). It .  ** is
9f00: 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70   therefore not p
9f10: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69  ossible for an i
9f20: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74  n-memory pager t
9f30: 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f  o enter the ERRO
9f40: 52 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20  R .  ** state.. 
9f50: 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20   */.  if( MEMDB 
9f60: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
9f70: 69 73 4f 70 65 6e 28 70 2d 3e 66 64 29 20 29 3b  isOpen(p->fd) );
9f80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
9f90: 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73  noSync );.    as
9fa0: 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c  sert( p->journal
9fb0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
9fc0: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
9fd0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
9fe0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
9ff0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
a000: 59 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73  Y .    );.    as
a010: 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21  sert( p->eState!
a020: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20  =PAGER_ERROR && 
a030: 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  p->eState!=PAGER
a040: 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73  _OPEN );.    ass
a050: 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
a060: 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  (p)==0 );.  }.. 
a070: 20 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75   /* If changeCou
a080: 6e 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61  ntDone is set, a
a090: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
a0a0: 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62  r greater must b
a0b0: 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74  e held.  ** on t
a0c0: 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
a0d0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a0e0: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d  changeCountDone=
a0f0: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  =0 || pPager->eL
a100: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
a110: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
a120: 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  p->eLock!=PENDIN
a130: 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69  G_LOCK );..  swi
a140: 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29  tch( p->eState )
a150: 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  {.    case PAGER
a160: 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73  _OPEN:.      ass
a170: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
a180: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a190: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a1a0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a1b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a1c0: 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
a1d0: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
a1e0: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =0 || pPager->te
a1f0: 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
a200: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a210: 20 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20   PAGER_READER:. 
a220: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a230: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a240: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a250: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
a260: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
a270: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a280: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45   p->eLock>=SHARE
a290: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  D_LOCK );.      
a2a0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a2b0: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
a2c0: 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65  CKED:.      asse
a2d0: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
a2e0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
a2f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a300: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a310: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a320: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
a330: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
a340: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a350: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
a360: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OCK );.      }. 
a370: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a380: 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61  ger->dbSize==pPa
a390: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
a3a0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a3b0: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a3c0: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46  ize==pPager->dbF
a3d0: 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ileSize );.     
a3e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a3f0: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
a400: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
a410: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a420: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
a430: 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  er==0 );.      b
a440: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a450: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
a460: 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73  HEMOD:.      ass
a470: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
a480: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
a490: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a4a0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a4b0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a4c0: 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
a4d0: 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
a4e0: 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f       /* It is po
a4f0: 73 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a  ssible that if j
a500: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20  ournal_mode=wal 
a510: 68 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65  here that neithe
a520: 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  r the.        **
a530: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f   journal file no
a540: 72 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61  r the WAL file a
a550: 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61  re open. This ha
a560: 70 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20  ppens during.   
a570: 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61       ** a rollba
a580: 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ck transaction t
a590: 68 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f  hat switches fro
a5a0: 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f  m journal_mode=o
a5b0: 66 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ff.        ** to
a5c0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61   journal_mode=wa
a5d0: 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
a5e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a5f0: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
a600: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20  _LOCK );.       
a610: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a620: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a630: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a640: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a650: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a660: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a670: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a680: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a690: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 20  E_WAL .         
a6a0: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a6b0: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a6c0: 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 32 0a 20 20  RNALMODE_WAL2.  
a6d0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
a6e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a6f0: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
a700: 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e==pPager->dbFil
a710: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  eSize );.      a
a720: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
a730: 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67 65  bOrigSize==pPage
a740: 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b  r->dbHintSize );
a750: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
a760: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52     case PAGER_WR
a770: 49 54 45 52 5f 44 42 4d 4f 44 3a 0a 20 20 20 20  ITER_DBMOD:.    
a780: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f    assert( p->eLo
a790: 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
a7a0: 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  CK );.      asse
a7b0: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
a7c0: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
a7d0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a7e0: 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
a7f0: 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ger) );.      as
a800: 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 3e 3d  sert( p->eLock>=
a810: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
a820: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a830: 69 73 4f 70 65 6e 28 70 2d 3e 6a 66 64 29 20 0a  isOpen(p->jfd) .
a840: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d             || p-
a850: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
a860: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
a870: 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
a880: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  || p->journalMod
a890: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
a8a0: 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20 20 20  MODE_WAL .      
a8b0: 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e       || p->journ
a8c0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
a8d0: 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 32 0a 20  URNALMODE_WAL2. 
a8e0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73 71            || (sq
a8f0: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
a900: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 2d 3e  racteristics(p->
a910: 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  fd)&SQLITE_IOCAP
a920: 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 29 0a 20  _BATCH_ATOMIC). 
a930: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
a940: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
a950: 4f 72 69 67 53 69 7a 65 3c 3d 70 50 61 67 65 72  OrigSize<=pPager
a960: 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 29 3b 0a  ->dbHintSize );.
a970: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
a980: 20 20 63 61 73 65 20 50 41 47 45 52 5f 57 52 49    case PAGER_WRI
a990: 54 45 52 5f 46 49 4e 49 53 48 45 44 3a 0a 20 20  TER_FINISHED:.  
a9a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a9b0: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
a9c0: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  LOCK );.      as
a9d0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
a9e0: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
a9f0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
aa00: 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
aa10: 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
aa20: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
aa30: 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20 20  ->jfd) .        
aa40: 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c     || p->journal
aa50: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
aa60: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
aa70: 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f          || p->jo
aa80: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
aa90: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
aaa0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
aab0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
aac0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
aad0: 45 5f 57 41 4c 32 0a 20 20 20 20 20 20 20 20 20  E_WAL2.         
aae0: 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44    || (sqlite3OsD
aaf0: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
ab00: 74 69 63 73 28 70 2d 3e 66 64 29 26 53 51 4c 49  tics(p->fd)&SQLI
ab10: 54 45 5f 49 4f 43 41 50 5f 42 41 54 43 48 5f 41  TE_IOCAP_BATCH_A
ab20: 54 4f 4d 49 43 29 0a 20 20 20 20 20 20 29 3b 0a  TOMIC).      );.
ab30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
ab40: 20 20 63 61 73 65 20 50 41 47 45 52 5f 45 52 52    case PAGER_ERR
ab50: 4f 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  OR:.      /* The
ab60: 72 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  re must be at le
ab70: 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64  ast one outstand
ab80: 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ing reference to
ab90: 20 74 68 65 20 70 61 67 65 72 20 69 66 0a 20 20   the pager if.  
aba0: 20 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20      ** in ERROR 
abb0: 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  state. Otherwise
abc0: 20 74 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c   the pager shoul
abd0: 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64  d have already d
abe0: 72 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20  ropped.      ** 
abf0: 62 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61  back to OPEN sta
ac00: 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  te..      */.   
ac10: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
ac20: 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
ac30: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61  TE_OK );.      a
ac40: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
ac50: 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
ac60: 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20  ger->pPCache)>0 
ac70: 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
ac80: 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65  ile );.      bre
ac90: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ak;.  }..  retur
aca0: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
acb0: 20 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a   ifndef NDEBUG *
acc0: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
acd0: 5f 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65  _DEBUG ./*.** Re
ace0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
acf0: 6f 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62  o a human readab
ad00: 6c 65 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73  le string in a s
ad10: 74 61 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20  tatic buffer.** 
ad20: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73  containing the s
ad30: 74 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65  tate of the Page
ad40: 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  r object passed 
ad50: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20  as an argument. 
ad60: 54 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e  This.** is inten
ad70: 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 77  ded to be used w
ad80: 69 74 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e  ithin debuggers.
ad90: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73   For example, as
ada0: 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a   an alternative.
adb0: 2a 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50  ** to "print *pP
adc0: 61 67 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a  ager" in gdb:.**
add0: 0a 2a 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66  .** (gdb) printf
ade0: 20 22 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67   "%s", print_pag
adf0: 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
ae00: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
ae10: 2a 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61  *print_pager_sta
ae20: 74 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20  te(Pager *p){.  
ae30: 73 74 61 74 69 63 20 63 68 61 72 20 7a 52 65 74  static char zRet
ae40: 5b 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74  [1024];..  sqlit
ae50: 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32 34  e3_snprintf(1024
ae60: 2c 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22 46  , zRet,.      "F
ae70: 69 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25 73  ilename:      %s
ae80: 5c 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74 65  \n".      "State
ae90: 3a 20 20 20 20 20 20 20 20 20 25 73 20 65 72 72  :         %s err
aea0: 43 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20  Code=%d\n".     
aeb0: 20 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20 20   "Lock:         
aec0: 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f   %s\n".      "Lo
aed0: 63 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63  cking mode:  loc
aee0: 6b 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a  king_mode=%s\n".
aef0: 20 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d        "Journal m
af00: 6f 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  ode:  journal_mo
af10: 64 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22  de=%s\n".      "
af20: 42 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74  Backing store: t
af30: 65 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62  empFile=%d memDb
af40: 3d 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25  =%d useJournal=%
af50: 64 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72  d\n".      "Jour
af60: 6e 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e  nal:       journ
af70: 61 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e  alOff=%lld journ
af80: 61 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20  alHdr=%lld\n".  
af90: 20 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20 20      "Size:      
afa0: 20 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64 62      dbsize=%d db
afb0: 4f 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46 69  OrigSize=%d dbFi
afc0: 6c 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20  leSize=%d\n".   
afd0: 20 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d     , p->zFilenam
afe0: 65 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53 74  e.      , p->eSt
aff0: 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
b000: 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f 50             ? "OP
b010: 45 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  EN" :.        p-
b020: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
b030: 45 41 44 45 52 20 20 20 20 20 20 20 20 20 20 3f  EADER          ?
b040: 20 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20 20   "READER" :.    
b050: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50      p->eState==P
b060: 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b  AGER_WRITER_LOCK
b070: 45 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f 4c  ED   ? "WRITER_L
b080: 4f 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20 20  OCKED" :.       
b090: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
b0a0: 52 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f  R_WRITER_CACHEMO
b0b0: 44 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43 48  D ? "WRITER_CACH
b0c0: 45 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20  EMOD" :.        
b0d0: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
b0e0: 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20  _WRITER_DBMOD   
b0f0: 20 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f 44   ? "WRITER_DBMOD
b100: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  " :.        p->e
b110: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
b120: 54 45 52 5f 46 49 4e 49 53 48 45 44 20 3f 20 22  TER_FINISHED ? "
b130: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 22  WRITER_FINISHED"
b140: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
b150: 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
b160: 52 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 45  R           ? "E
b170: 52 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f  RROR" : "?error?
b180: 22 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70  ".      , (int)p
b190: 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20  ->errCode.      
b1a0: 2c 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c  , p->eLock==NO_L
b1b0: 4f 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22 4e  OCK         ? "N
b1c0: 4f 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20  O_LOCK" :.      
b1d0: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45    p->eLock==RESE
b1e0: 52 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52  RVED_LOCK   ? "R
b1f0: 45 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20 20  ESERVED" :.     
b200: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43     p->eLock==EXC
b210: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22  LUSIVE_LOCK  ? "
b220: 45 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20 20  EXCLUSIVE" :.   
b230: 20 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53       p->eLock==S
b240: 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f  HARED_LOCK     ?
b250: 20 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20 20   "SHARED" :.    
b260: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e      p->eLock==UN
b270: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20  KNOWN_LOCK    ? 
b280: 22 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72  "UNKNOWN" : "?er
b290: 72 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d  ror?".      , p-
b2a0: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f  >exclusiveMode ?
b2b0: 20 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20 22   "exclusive" : "
b2c0: 6e 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20  normal".      , 
b2d0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b2e0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b2f0: 45 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65  E_MEMORY   ? "me
b300: 6d 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20 20  mory" :.        
b310: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b320: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b330: 45 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f 66  E_OFF      ? "of
b340: 66 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  f" :.        p->
b350: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b360: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
b370: 45 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65 74  ELETE   ? "delet
b380: 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  e" :.        p->
b390: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b3a0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
b3b0: 45 52 53 49 53 54 20 20 3f 20 22 70 65 72 73 69  ERSIST  ? "persi
b3c0: 73 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d  st" :.        p-
b3d0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
b3e0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
b3f0: 54 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75 6e  TRUNCATE ? "trun
b400: 63 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20  cate" :.        
b410: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
b420: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
b430: 45 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77 61  E_WAL      ? "wa
b440: 6c 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20  l" : "?error?". 
b450: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74       , (int)p->t
b460: 65 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d  empFile, (int)p-
b470: 3e 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e  >memDb, (int)p->
b480: 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  useJournal.     
b490: 20 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66   , p->journalOff
b4a0: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a  , p->journalHdr.
b4b0: 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e        , (int)p->
b4c0: 64 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e  dbSize, (int)p->
b4d0: 64 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e 74  dbOrigSize, (int
b4e0: 29 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20  )p->dbFileSize. 
b4f0: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52   );..  return zR
b500: 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  et;.}.#endif../*
b510: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
b520: 63 65 73 20 74 6f 20 74 68 65 20 76 61 72 69 6f  ces to the vario
b530: 75 73 20 70 61 67 65 20 67 65 74 74 65 72 73 20  us page getters 
b540: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
b550: 74 50 61 67 65 4e 6f 72 6d 61 6c 28 50 61 67 65  tPageNormal(Page
b560: 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a  r*,Pgno,DbPage**
b570: 2c 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e  ,int);.static in
b580: 74 20 67 65 74 50 61 67 65 45 72 72 6f 72 28 50  t getPageError(P
b590: 61 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67  ager*,Pgno,DbPag
b5a0: 65 2a 2a 2c 69 6e 74 29 3b 0a 23 69 66 20 53 51  e**,int);.#if SQ
b5b0: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
b5c0: 5a 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74 20  ZE>0.static int 
b5d0: 67 65 74 50 61 67 65 4d 4d 61 70 28 50 61 67 65  getPageMMap(Page
b5e0: 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a  r*,Pgno,DbPage**
b5f0: 2c 69 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  ,int);.#endif../
b600: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 50 61 67  *.** Set the Pag
b610: 65 72 2e 78 47 65 74 20 6d 65 74 68 6f 64 20 66  er.xGet method f
b620: 6f 72 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  or the appropria
b630: 74 65 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  te routine used 
b640: 74 6f 20 66 65 74 63 68 0a 2a 2a 20 63 6f 6e 74  to fetch.** cont
b650: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ent from the pag
b660: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
b670: 69 64 20 73 65 74 47 65 74 74 65 72 4d 65 74 68  id setGetterMeth
b680: 6f 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  od(Pager *pPager
b690: 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
b6a0: 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
b6b0: 70 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20 67  pPager->xGet = g
b6c0: 65 74 50 61 67 65 45 72 72 6f 72 3b 0a 23 69 66  etPageError;.#if
b6d0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
b6e0: 5f 53 49 5a 45 3e 30 0a 20 20 7d 65 6c 73 65 20  _SIZE>0.  }else 
b6f0: 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61  if( USEFETCH(pPa
b700: 67 65 72 29 0a 23 69 66 64 65 66 20 53 51 4c 49  ger).#ifdef SQLI
b710: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20  TE_HAS_CODEC.   
b720: 26 26 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  && pPager->xCode
b730: 63 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20 29 7b  c==0.#endif.  ){
b740: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 47 65  .    pPager->xGe
b750: 74 20 3d 20 67 65 74 50 61 67 65 4d 4d 61 70 3b  t = getPageMMap;
b760: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
b770: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
b780: 30 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 */.  }else{.  
b790: 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74 20 3d    pPager->xGet =
b7a0: 20 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 3b 0a   getPageNormal;.
b7b0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
b7c0: 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69  urn true if it i
b7d0: 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77  s necessary to w
b7e0: 72 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69  rite page *pPg i
b7f0: 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  nto the sub-jour
b800: 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e  nal..** A page n
b810: 65 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74  eeds to be writt
b820: 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  en into the sub-
b830: 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65  journal if there
b840: 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f   exists one.** o
b850: 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65  r more open save
b860: 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68  points for which
b870: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
b880: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c  page-number is l
b890: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
b8a0: 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f  l to PagerSavepo
b8b0: 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a  int.nOrig, and.*
b8c0: 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f  *   * The bit co
b8d0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
b8e0: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
b8f0: 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20  s not set in.** 
b900: 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
b910: 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e  nt.pInSavepoint.
b920: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
b930: 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
b940: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
b950: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
b960: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 61  Pg->pPager;.  Pa
b970: 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b  gerSavepoint *p;
b980: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
b990: 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  Pg->pgno;.  int 
b9a0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
b9b0: 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
b9c0: 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20  nt; i++){.    p 
b9d0: 3d 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65  = &pPager->aSave
b9e0: 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66  point[i];.    if
b9f0: 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f  ( p->nOrig>=pgno
ba00: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69   && 0==sqlite3Bi
ba10: 74 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28  tvecTestNotNull(
ba20: 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c  p->pInSavepoint,
ba30: 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20   pgno) ){.      
ba40: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
ba50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
ba60: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
ba70: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  _DEBUG./*.** Ret
ba80: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
ba90: 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
baa0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
bab0: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
bac0: 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  nt pageInJournal
bad0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
bae0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72  PgHdr *pPg){.  r
baf0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74  eturn sqlite3Bit
bb00: 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
bb10: 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d  pInJournal, pPg-
bb20: 3e 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64 69 66  >pgno);.}.#endif
bb30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33  ../*.** Read a 3
bb40: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72  2-bit integer fr
bb50: 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  om the given fil
bb60: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53  e descriptor.  S
bb70: 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72  tore the integer
bb80: 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64  .** that is read
bb90: 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75   in *pRes.  Retu
bba0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
bbb0: 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65  everything worke
bbc0: 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f  d, or an.** erro
bbd0: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
bbe0: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
bbf0: 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73  **.** All values
bc00: 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64   are stored on d
bc10: 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61  isk as big-endia
bc20: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
bc30: 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69   read32bits(sqli
bc40: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
bc50: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70  4 offset, u32 *p
bc60: 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Res){.  unsigned
bc70: 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69   char ac[4];.  i
bc80: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  nt rc = sqlite3O
bc90: 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69  sRead(fd, ac, si
bca0: 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74  zeof(ac), offset
bcb0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
bcc0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
bcd0: 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Res = sqlite3Get
bce0: 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20  4byte(ac);.  }. 
bcf0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
bd00: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d  *.** Write a 32-
bd10: 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  bit integer into
bd20: 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72   a string buffer
bd30: 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62   in big-endian b
bd40: 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64  yte order..*/.#d
bd50: 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28  efine put32bits(
bd60: 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74  A,B)  sqlite3Put
bd70: 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a  4byte((u8*)A,B).
bd80: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
bd90: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
bda0: 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69  nto the given fi
bdb0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
bdc0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
bdd0: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  .** on success o
bde0: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
bdf0: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
be00: 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
be10: 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69  ic int write32bi
be20: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
be30: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
be40: 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61   u32 val){.  cha
be50: 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32  r ac[4];.  put32
be60: 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20  bits(ac, val);. 
be70: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
be80: 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34  sWrite(fd, ac, 4
be90: 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a  , offset);.}../*
bea0: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  .** Unlock the d
beb0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
bec0: 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69  level eLock, whi
bed0: 63 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ch must be eithe
bee0: 72 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20  r NO_LOCK.** or 
bef0: 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67  SHARED_LOCK. Reg
bf00: 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
bf10: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61  er or not the ca
bf20: 6c 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a  ll to xUnlock().
bf30: 2a 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65 74  ** succeeds, set
bf40: 20 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b   the Pager.eLock
bf50: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74   variable to mat
bf60: 63 68 20 74 68 65 20 28 61 74 74 65 6d 70 74 65  ch the (attempte
bf70: 64 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a  d) new lock..**.
bf80: 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61  ** Except, if Pa
bf90: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
bfa0: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
bfb0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
bfc0: 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64  ion is.** called
bfd0: 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20  , do not modify 
bfe0: 69 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  it. See the comm
bff0: 65 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64  ent above the #d
c000: 65 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b  efine of .** UNK
c010: 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e  NOWN_LOCK for an
c020: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
c030: 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  this..*/.static 
c040: 69 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44  int pagerUnlockD
c050: 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  b(Pager *pPager,
c060: 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69   int eLock){.  i
c070: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c080: 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  K;..  assert( !p
c090: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
c0a0: 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Mode || pPager->
c0b0: 65 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a  eLock==eLock );.
c0c0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
c0d0: 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  =NO_LOCK || eLoc
c0e0: 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
c0f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ;.  assert( eLoc
c100: 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61  k!=NO_LOCK || pa
c110: 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
c120: 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  )==0 );.  if( is
c130: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
c140: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
c150: 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65  pPager->eLock>=e
c160: 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d  Lock );.    rc =
c170: 20 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20   pPager->noLock 
c180: 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71  ? SQLITE_OK : sq
c190: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50  lite3OsUnlock(pP
c1a0: 61 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29  ager->fd, eLock)
c1b0: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
c1c0: 2d 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e  ->eLock!=UNKNOWN
c1d0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70  _LOCK ){.      p
c1e0: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28  Pager->eLock = (
c1f0: 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  u8)eLock;.    }.
c200: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e      IOTRACE(("UN
c210: 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
c220: 50 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20  Pager, eLock)). 
c230: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
c240: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
c250: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
c260: 74 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20  to level eLock, 
c270: 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69  which must be ei
c280: 74 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ther SHARED_LOCK
c290: 2c 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c 4f  ,.** RESERVED_LO
c2a0: 43 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  CK or EXCLUSIVE_
c2b0: 4c 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61 6c  LOCK. If the cal
c2c0: 6c 65 72 20 69 73 20 73 75 63 63 65 73 73 66 75  ler is successfu
c2d0: 6c 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50 61  l, set the.** Pa
c2e0: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
c2f0: 6c 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f  le to the new lo
c300: 63 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a 2a  cking state. .**
c310: 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50  .** Except, if P
c320: 61 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65  ager.eLock is se
c330: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
c340: 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  K when this func
c350: 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c 6c  tion is .** call
c360: 65 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66  ed, do not modif
c370: 79 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65 20  y it unless the 
c380: 6e 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74  new locking stat
c390: 65 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f 4c  e is EXCLUSIVE_L
c3a0: 4f 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68 65  OCK. .** See the
c3b0: 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74   comment above t
c3c0: 68 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55 4e  he #define of UN
c3d0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61  KNOWN_LOCK for a
c3e0: 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a  n explanation .*
c3f0: 2a 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  * of this..*/.st
c400: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c 6f  atic int pagerLo
c410: 63 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67  ckDb(Pager *pPag
c420: 65 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a  er, int eLock){.
c430: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c440: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
c450: 20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c   eLock==SHARED_L
c460: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45  OCK || eLock==RE
c470: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65  SERVED_LOCK || e
c480: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
c490: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  LOCK );.  if( pP
c4a0: 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63  ager->eLock<eLoc
c4b0: 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  k || pPager->eLo
c4c0: 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck==UNKNOWN_LOCK
c4d0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
c4e0: 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51  ger->noLock ? SQ
c4f0: 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65  LITE_OK : sqlite
c500: 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
c510: 66 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  fd, eLock);.    
c520: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
c530: 4b 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 4c  K && (pPager->eL
c540: 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  ock!=UNKNOWN_LOC
c550: 4b 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  K||eLock==EXCLUS
c560: 49 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  IVE_LOCK) ){.   
c570: 20 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b     pPager->eLock
c580: 20 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20   = (u8)eLock;.  
c590: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f      IOTRACE(("LO
c5a0: 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  CK %p %d\n", pPa
c5b0: 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20  ger, eLock)).   
c5c0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
c5d0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
c5e0: 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72  s function deter
c5f0: 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72  mines whether or
c600: 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d   not the atomic-
c610: 77 72 69 74 65 20 6f 72 0a 2a 2a 20 61 74 6f 6d  write or.** atom
c620: 69 63 2d 62 61 74 63 68 2d 77 72 69 74 65 20 6f  ic-batch-write o
c630: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 63 61 6e  ptimizations can
c640: 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68   be used with th
c650: 69 73 20 70 61 67 65 72 2e 20 54 68 65 0a 2a 2a  is pager. The.**
c660: 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
c670: 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62  timization can b
c680: 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a  e used if:.**.**
c690: 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20    (a) the value 
c6a0: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65  returned by OsDe
c6b0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
c6c0: 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20  ics() indicates 
c6d0: 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64  that.**      a d
c6e0: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79  atabase page may
c6f0: 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
c700: 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20  ically, and.**  
c710: 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (b) the value re
c720: 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74  turned by OsSect
c730: 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73  orSize() is less
c740: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
c750: 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61  *      to the pa
c760: 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  ge size..**.** I
c770: 66 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64  f it can be used
c780: 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
c790: 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
c7a0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
c7b0: 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 77 68  rnal .** file wh
c7c0: 65 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 72  en it contains r
c7d0: 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72  ollback data for
c7e0: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67   exactly one pag
c7f0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 74 6f  e..**.** The ato
c800: 6d 69 63 2d 62 61 74 63 68 2d 77 72 69 74 65 20  mic-batch-write 
c810: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
c820: 20 62 65 20 75 73 65 64 20 69 66 20 4f 73 44 65   be used if OsDe
c830: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
c840: 69 63 73 28 29 0a 2a 2a 20 72 65 74 75 72 6e 73  ics().** returns
c850: 20 61 20 76 61 6c 75 65 20 77 69 74 68 20 74 68   a value with th
c860: 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42  e SQLITE_IOCAP_B
c870: 41 54 43 48 5f 41 54 4f 4d 49 43 20 62 69 74 20  ATCH_ATOMIC bit 
c880: 73 65 74 2e 20 2d 31 20 69 73 0a 2a 2a 20 72 65  set. -1 is.** re
c890: 74 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63  turned in this c
c8a0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65  ase..**.** If ne
c8b0: 69 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  ither optimizati
c8c0: 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20  on can be used, 
c8d0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  0 is returned..*
c8e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e  /.static int jrn
c8f0: 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65  lBufferSize(Page
c900: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73  r *pPager){.  as
c910: 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
c920: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
c930: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
c940: 43 5f 57 52 49 54 45 29 20 5c 0a 20 7c 7c 20 64  C_WRITE) \. || d
c950: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
c960: 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49  ABLE_BATCH_ATOMI
c970: 43 5f 57 52 49 54 45 29 0a 20 20 69 6e 74 20 64  C_WRITE).  int d
c980: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
c990: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c9a0: 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  Device character
c9b0: 69 73 74 69 63 73 20 2a 2f 0a 0a 20 20 61 73 73  istics */..  ass
c9c0: 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
c9d0: 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 64 63 20  er->fd) );.  dc 
c9e0: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
c9f0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
ca00: 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 23 65  (pPager->fd);.#e
ca10: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
ca20: 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48  ITE_ENABLE_BATCH
ca30: 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
ca40: 69 66 28 20 64 63 26 53 51 4c 49 54 45 5f 49 4f  if( dc&SQLITE_IO
ca50: 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  CAP_BATCH_ATOMIC
ca60: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d   ){.    return -
ca70: 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  1;.  }.#endif..#
ca80: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
ca90: 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
caa0: 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 6e 53 65  .  {.    int nSe
cab0: 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e 73  ctor = pPager->s
cac0: 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 69  ectorSize;.    i
cad0: 6e 74 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67  nt szPage = pPag
cae0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20  er->pageSize;.. 
caf0: 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
cb00: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
cb10: 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
cb20: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
cb30: 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
cb40: 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
cb50: 20 69 66 28 20 30 3d 3d 28 64 63 26 28 53 51 4c   if( 0==(dc&(SQL
cb60: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
cb70: 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c  |(szPage>>8)) ||
cb80: 20 6e 53 65 63 74 6f 72 3e 73 7a 50 61 67 65 29   nSector>szPage)
cb90: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
cba0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
cbb0: 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f   return JOURNAL_
cbc0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
cbd0: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
cbe0: 50 61 67 65 72 29 3b 0a 23 65 6e 64 69 66 0a 0a  Pager);.#endif..
cbf0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
cc00: 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43  *.** If SQLITE_C
cc10: 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65  HECK_PAGES is de
cc20: 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f  fined then we do
cc30: 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65   some sanity che
cc40: 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20  cking.** on the 
cc50: 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68 61  cache using a ha
cc60: 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  sh function.  Th
cc70: 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  is is used for t
cc80: 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65  esting.** and de
cc90: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
cca0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
ccb0: 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a  HECK_PAGES./*.**
ccc0: 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74   Return a 32-bit
ccd0: 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67   hash of the pag
cce0: 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65  e data for pPage
ccf0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
cd00: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 69  pager_datahash(i
cd10: 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e  nt nByte, unsign
cd20: 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b  ed char *pData){
cd30: 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b  .  u32 hash = 0;
cd40: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
cd50: 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b  i=0; i<nByte; i+
cd60: 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28  +){.    hash = (
cd70: 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61  hash*1039) + pDa
cd80: 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74  ta[i];.  }.  ret
cd90: 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74  urn hash;.}.stat
cda0: 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67  ic u32 pager_pag
cdb0: 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61  ehash(PgHdr *pPa
cdc0: 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61  ge){.  return pa
cdd0: 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61  ger_datahash(pPa
cde0: 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65  ge->pPager->page
cdf0: 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  Size, (unsigned 
ce00: 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44  char *)pPage->pD
ce10: 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ata);.}.static v
ce20: 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61  oid pager_set_pa
ce30: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
ce40: 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70  age){.  pPage->p
ce50: 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
ce60: 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29 3b  pagehash(pPage);
ce70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48  .}../*.** The CH
ce80: 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74  ECK_PAGE macro t
ce90: 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73  akes a PgHdr* as
cea0: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66   an argument. If
ceb0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
cec0: 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65  GES.** is define
ced0: 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73  d, and NDEBUG is
cee0: 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e   not defined, an
cef0: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
cf00: 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68  ent checks.** th
cf10: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65  at the page is e
cf20: 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73  ither dirty or s
cf30: 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65  till matches the
cf40: 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65   calculated page
cf50: 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  -hash..*/.#defin
cf60: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20  e CHECK_PAGE(x) 
cf70: 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61  checkPage(x).sta
cf80: 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61  tic void checkPa
cf90: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
cfa0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
cfb0: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
cfc0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
cfd0: 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 45  >eState!=PAGER_E
cfe0: 52 52 4f 52 20 29 3b 0a 20 20 61 73 73 65 72 74  RROR );.  assert
cff0: 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  ( (pPg->flags&PG
d000: 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50  HDR_DIRTY) || pP
d010: 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67  g->pageHash==pag
d020: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
d030: 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65   );.}..#else.#de
d040: 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68  fine pager_datah
d050: 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66  ash(X,Y)  0.#def
d060: 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68 61  ine pager_pageha
d070: 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65  sh(X)  0.#define
d080: 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
d090: 61 73 68 28 58 29 0a 23 64 65 66 69 6e 65 20 43  ash(X).#define C
d0a0: 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e  HECK_PAGE(x).#en
d0b0: 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43  dif  /* SQLITE_C
d0c0: 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f  HECK_PAGES */../
d0d0: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
d0e0: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75  s called the jou
d0f0: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
d100: 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20  ger pPager must 
d110: 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 69 73  be open..** This
d120: 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
d130: 74 73 20 74 6f 20 72 65 61 64 20 61 20 6d 61 73  ts to read a mas
d140: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
d150: 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 0a   name from the .
d160: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  ** end of the fi
d170: 6c 65 20 61 6e 64 2c 20 69 66 20 73 75 63 63 65  le and, if succe
d180: 73 73 66 75 6c 2c 20 63 6f 70 69 65 73 20 69 74  ssful, copies it
d190: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70   into memory sup
d1a0: 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74 68 65  plied .** by the
d1b0: 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 63 6f 6d   caller. See com
d1c0: 6d 65 6e 74 73 20 61 62 6f 76 65 20 77 72 69 74  ments above writ
d1d0: 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29  eMasterJournal()
d1e0: 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61 74 0a   for the format.
d1f0: 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  ** used to store
d200: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
d210: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61 74 20 74  l file name at t
d220: 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72  he end of a jour
d230: 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
d240: 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69  zMaster must poi
d250: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f  nt to a buffer o
d260: 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74  f at least nMast
d270: 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74  er bytes allocat
d280: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c  ed by.** the cal
d290: 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  ler. This should
d2a0: 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   be sqlite3_vfs.
d2b0: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f  mxPathname+1 (to
d2c0: 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69 73   ensure there is
d2d0: 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65  .** enough space
d2e0: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61   to write the ma
d2f0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
d300: 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65  e). If the maste
d310: 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d  r journal.** nam
d320: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
d330: 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20   is longer than 
d340: 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28 69  nMaster bytes (i
d350: 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75  ncluding a.** nu
d360: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74  l-terminator), t
d370: 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64  hen this is hand
d380: 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73  led as if no mas
d390: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
d3a0: 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74  .** were present
d3b0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
d3c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61 73 74  .**.** If a mast
d3d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
d3e0: 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20  name is present 
d3f0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
d400: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
d410: 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f  e, then it is co
d420: 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 75  pied into the bu
d430: 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f 20  ffer pointed to 
d440: 62 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a 2a 2a  by zMaster. A.**
d450: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
d460: 62 79 74 65 20 69 73 20 61 70 70 65 6e 64 65 64  byte is appended
d470: 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 66   to the buffer f
d480: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d 61 73  ollowing the mas
d490: 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ter.** journal f
d4a0: 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ile name..**.** 
d4b0: 49 66 20 69 74 20 69 73 20 64 65 74 65 72 6d 69  If it is determi
d4c0: 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d 61 73 74  ned that no mast
d4d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
d4e0: 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20  name is present 
d4f0: 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69  .** zMaster[0] i
d500: 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53  s set to 0 and S
d510: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
d520: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
d530: 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
d540: 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74  e reading from t
d550: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
d560: 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 65 72   an SQLite.** er
d570: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
d580: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
d590: 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  int readMasterJo
d5a0: 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69  urnal(sqlite3_fi
d5b0: 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20  le *pJrnl, char 
d5c0: 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32 20 6e 4d  *zMaster, u32 nM
d5d0: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
d5e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d5f0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
d600: 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e  ode */.  u32 len
d610: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d620: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 69 6e      /* Length in
d630: 20 62 79 74 65 73 20 6f 66 20 6d 61 73 74 65 72   bytes of master
d640: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f   journal name */
d650: 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
d660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d670: 20 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e 20 62   Total size in b
d680: 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ytes of journal 
d690: 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20  file pJrnl */.  
d6a0: 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20  u32 cksum;      
d6b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 4a             /* MJ
d6c0: 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   checksum value 
d6d0: 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72 6e 61  read from journa
d6e0: 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20  l */.  u32 u;   
d6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d700: 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f    /* Unsigned lo
d710: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
d720: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d  unsigned char aM
d730: 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20 41 20  agic[8];   /* A 
d740: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
d750: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
d760: 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20  */.  zMaster[0] 
d770: 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28 20 53  = '\0';..  if( S
d780: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
d790: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
d7a0: 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a  e(pJrnl, &szJ)).
d7b0: 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20 20 20     || szJ<16.   
d7c0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
d7d0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
d7e0: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c  Jrnl, szJ-16, &l
d7f0: 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d  en)).   || len>=
d800: 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 6c  nMaster .   || l
d810: 65 6e 3e 73 7a 4a 2d 31 36 0a 20 20 20 7c 7c 20  en>szJ-16.   || 
d820: 6c 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 53 51  len==0 .   || SQ
d830: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
d840: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
d850: 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29   szJ-12, &cksum)
d860: 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  ).   || SQLITE_O
d870: 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
d880: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d  OsRead(pJrnl, aM
d890: 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29  agic, 8, szJ-8))
d8a0: 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d  .   || memcmp(aM
d8b0: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
d8c0: 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51  gic, 8).   || SQ
d8d0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
d8e0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
d8f0: 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  nl, zMaster, len
d900: 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20  , szJ-16-len)). 
d910: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
d920: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65  c;.  }..  /* See
d930: 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   if the checksum
d940: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73   matches the mas
d950: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
d960: 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75   */.  for(u=0; u
d970: 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20  <len; u++){.    
d980: 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72  cksum -= zMaster
d990: 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  [u];.  }.  if( c
d9a0: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ksum ){.    /* I
d9b0: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64  f the checksum d
d9c0: 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74  oesn't add up, t
d9d0: 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  hen one or more 
d9e0: 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74  of the disk sect
d9f0: 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61  ors.    ** conta
da00: 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  ining the master
da10: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
da20: 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20  e is corrupted. 
da30: 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a  This means.    *
da40: 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c  * definitely rol
da50: 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20  l back, so just 
da60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
da70: 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e   and report a (n
da80: 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  ul).    ** maste
da90: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r-journal filena
daa0: 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c  me..    */.    l
dab0: 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d  en = 0;.  }.  zM
dac0: 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30  aster[len] = '\0
dad0: 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20  ';.   .  return 
dae0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
daf0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f  .** Return the o
db00: 66 66 73 65 74 20 6f 66 20 74 68 65 20 73 65 63  ffset of the sec
db10: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 61 74 20  tor boundary at 
db20: 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a  or immediately .
db30: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
db40: 20 76 61 6c 75 65 20 69 6e 20 70 50 61 67 65 72   value in pPager
db50: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73  ->journalOff, as
db60: 73 75 6d 69 6e 67 20 61 20 73 65 63 74 6f 72 20  suming a sector 
db70: 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70 50 61 67  .** size of pPag
db80: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 62  er->sectorSize b
db90: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20  ytes..**.** i.e 
dba0: 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a  for a sector siz
dbb0: 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20  e of 512:.**.** 
dbc0: 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f    Pager.journalO
dbd0: 66 66 20 20 20 20 20 20 20 20 20 20 52 65 74 75  ff          Retu
dbe0: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d  rn value.**   --
dbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dc10: 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20  -----.**   0    
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc30: 20 20 20 20 20 30 0a 2a 2a 20 20 20 35 31 32 20       0.**   512 
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc50: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 31        512.**   1
dc60: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
dc70: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
dc80: 20 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20    2000          
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38              2048
dca0: 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  .** .*/.static i
dcb0: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66  64 journalHdrOff
dcc0: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
dcd0: 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  r){.  i64 offset
dce0: 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20   = 0;.  i64 c = 
dcf0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
dd00: 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20  ff;.  if( c ){. 
dd10: 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d     offset = ((c-
dd20: 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  1)/JOURNAL_HDR_S
dd30: 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a  Z(pPager) + 1) *
dd40: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
dd50: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61  pPager);.  }.  a
dd60: 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f  ssert( offset%JO
dd70: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
dd80: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ger)==0 );.  ass
dd90: 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29  ert( offset>=c )
dda0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66  ;.  assert( (off
ddb0: 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48  set-c)<JOURNAL_H
ddc0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
ddd0: 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74  .  return offset
dde0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
ddf0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
de00: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
de10: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
de20: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
de30: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
de40: 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 6a 6f 75  no-op if the jou
de50: 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f  rnal file has no
de60: 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  t been written t
de70: 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  o.** within the 
de80: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
de90: 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20 50 61 67  ion (i.e. if Pag
dea0: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  er.journalOff==0
deb0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72  )..**.** If doTr
dec0: 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  uncate is non-ze
ded0: 72 6f 20 6f 72 20 74 68 65 20 50 61 67 65 72 2e  ro or the Pager.
dee0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
def0: 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20   variable is.** 
df00: 73 65 74 20 74 6f 20 30 2c 20 74 68 65 6e 20 74  set to 0, then t
df10: 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72  runcate the jour
df20: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  nal file to zero
df30: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
df40: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65  Otherwise,.** ze
df50: 72 6f 20 74 68 65 20 32 38 2d 62 79 74 65 20 68  ro the 28-byte h
df60: 65 61 64 65 72 20 61 74 20 74 68 65 20 73 74 61  eader at the sta
df70: 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
df80: 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69 74 68 65  l file. In eithe
df90: 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74  r case, .** if t
dfa0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
dfb0: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c  in no-sync mode,
dfc0: 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
dfd0: 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69 61 74 65  l file immediate
dfe0: 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20 77 72 69  ly .** after wri
dff0: 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
e000: 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ng it..**.** If 
e010: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a  Pager.journalSiz
e020: 65 4c 69 6d 69 74 20 69 73 20 73 65 74 20 74 6f  eLimit is set to
e030: 20 61 20 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e   a positive, non
e040: 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64  -zero value, and
e050: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  .** following th
e060: 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20  e truncation or 
e070: 7a 65 72 6f 69 6e 67 20 64 65 73 63 72 69 62 65  zeroing describe
e080: 64 20 61 62 6f 76 65 20 74 68 65 20 73 69 7a 65  d above the size
e090: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72   of the .** jour
e0a0: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
e0b0: 73 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  s is larger than
e0c0: 20 74 68 69 73 20 76 61 6c 75 65 2c 20 74 68 65   this value, the
e0d0: 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a  n truncate the.*
e0e0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
e0f0: 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53  o Pager.journalS
e100: 69 7a 65 4c 69 6d 69 74 20 62 79 74 65 73 2e 20  izeLimit bytes. 
e110: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
e120: 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65   does.** not nee
e130: 64 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20 66  d to be synced f
e140: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
e150: 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  eration..**.** I
e160: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
e170: 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72  curs, abandon pr
e180: 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74  ocessing and ret
e190: 75 72 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  urn the IO error
e1a0: 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77   code..** Otherw
e1b0: 69 73 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ise, return SQLI
e1c0: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
e1d0: 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c   int zeroJournal
e1e0: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
e1f0: 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74  r, int doTruncat
e200: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
e210: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
e220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e230: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
e240: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65  n code */.  asse
e250: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
e260: 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 61 73 73  r->jfd) );.  ass
e270: 65 72 74 28 20 21 73 71 6c 69 74 65 33 4a 6f 75  ert( !sqlite3Jou
e280: 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70  rnalIsInMemory(p
e290: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
e2a0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
e2b0: 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63  rnalOff ){.    c
e2c0: 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20  onst i64 iLimit 
e2d0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
e2e0: 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f  lSizeLimit;    /
e2f0: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
e300: 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54   jsl */..    IOT
e310: 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20  RACE(("JZEROHDR 
e320: 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
e330: 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61      if( doTrunca
e340: 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20  te || iLimit==0 
e350: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
e360: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
e370: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
e380: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e390: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
e3a0: 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20  har zeroHdr[28] 
e3b0: 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20  = {0};.      rc 
e3c0: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
e3d0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65  (pPager->jfd, ze
e3e0: 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65  roHdr, sizeof(ze
e3f0: 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20  roHdr), 0);.    
e400: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
e410: 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67  LITE_OK && !pPag
e420: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
e430: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e440: 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
e450: 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  fd, SQLITE_SYNC_
e460: 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d  DATAONLY|pPager-
e470: 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20 20  >syncFlags);.   
e480: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   }..    /* At th
e490: 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61  is point the tra
e4a0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
e4b0: 69 74 74 65 64 20 62 75 74 20 74 68 65 20 77 72  itted but the wr
e4c0: 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a  ite lock .    **
e4d0: 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f   is still held o
e4e0: 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74  n the file. If t
e4f0: 68 65 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c  here is a size l
e500: 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20  imit configured 
e510: 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  for .    ** the 
e520: 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e  persistent journ
e530: 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  al and the journ
e540: 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  al file currentl
e550: 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a  y consumes more.
e560: 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61      ** space tha
e570: 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c  n that limit all
e580: 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74  ows for, truncat
e590: 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20  e it now. There 
e5a0: 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a  is no need.    *
e5b0: 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69  * to sync the fi
e5c0: 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  le following thi
e5d0: 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20  s operation..   
e5e0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
e5f0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69  SQLITE_OK && iLi
e600: 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  mit>0 ){.      i
e610: 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20  64 sz;.      rc 
e620: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
e630: 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
e640: 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28   &sz);.      if(
e650: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
e660: 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  & sz>iLimit ){. 
e670: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
e680: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
e690: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69  ager->jfd, iLimi
e6a0: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
e6b0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
e6c0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
e6d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
e6e0: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
e6f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
e700: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
e710: 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52  .** header (JOUR
e720: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
e730: 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  ) is written int
e740: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
e750: 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72  le at the.** cur
e760: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  rent location..*
e770: 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20  *.** The format 
e780: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
e790: 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c  header is as fol
e7a0: 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74  lows:.** - 8 byt
e7b0: 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69  es: Magic identi
e7c0: 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f  fying journal fo
e7d0: 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  rmat..** - 4 byt
e7e0: 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65  es: Number of re
e7f0: 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c  cords in journal
e800: 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20  , or -1 no-sync 
e810: 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d  mode is on..** -
e820: 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d   4 bytes: Random
e830: 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72   number used for
e840: 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d   page hash..** -
e850: 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61   4 bytes: Initia
e860: 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  l database page 
e870: 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  count..** - 4 by
e880: 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65  tes: Sector size
e890: 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f   used by the pro
e8a0: 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
e8b0: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  this journal..**
e8c0: 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61 74 61   - 4 bytes: Data
e8d0: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a  base page size..
e8e0: 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20  ** .** Followed 
e8f0: 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  by (JOURNAL_HDR_
e900: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f  SZ - 28) bytes o
e910: 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a  f unused space..
e920: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
e930: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  iteJournalHdr(Pa
e940: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
e950: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
e960: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
e970: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
e980: 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48  de */.  char *zH
e990: 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  eader = pPager->
e9a0: 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54  pTmpSpace;  /* T
e9b0: 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65 20 75  emporary space u
e9c0: 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61  sed to build hea
e9d0: 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65  der */.  u32 nHe
e9e0: 61 64 65 72 20 3d 20 28 75 33 32 29 70 50 61 67  ader = (u32)pPag
e9f0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 2f 2a 20  er->pageSize;/* 
ea00: 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70  Size of buffer p
ea10: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65  ointed to by zHe
ea20: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57  ader */.  u32 nW
ea30: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
ea40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ea50: 20 42 79 74 65 73 20 6f 66 20 68 65 61 64 65 72   Bytes of header
ea60: 20 73 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20   sector written 
ea70: 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  */.  int ii;    
ea80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
eaa0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   counter */..  a
eab0: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
eac0: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20  ager->jfd) );   
ead0: 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69     /* Journal fi
eae0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  le must be open.
eaf0: 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64   */..  if( nHead
eb00: 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  er>JOURNAL_HDR_S
eb10: 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
eb20: 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e   nHeader = JOURN
eb30: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
eb40: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
eb50: 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
eb60: 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20   savepoints and 
eb70: 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65  any of them were
eb80: 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73   created .  ** s
eb90: 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65  ince the most re
eba0: 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  cent journal hea
ebb0: 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c  der was written,
ebc0: 20 75 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a   update the .  *
ebd0: 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  * PagerSavepoint
ebe0: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
ebf0: 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66  ds now..  */.  f
ec00: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
ec10: 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
ec20: 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  ii++){.    if( p
ec30: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
ec40: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
ec50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ==0 ){.      pPa
ec60: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
ec70: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d  ii].iHdrOffset =
ec80: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ec90: 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Off;.    }.  }..
eca0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
ecb0: 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lHdr = pPager->j
ecc0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72  ournalOff = jour
ecd0: 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
ece0: 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a  ger);..  /* .  *
ecf0: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
ed00: 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d   Field - the num
ed10: 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
ed20: 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  rds that follow 
ed30: 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  this.  ** journa
ed40: 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c  l header. Normal
ed50: 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74  ly, zero is writ
ed60: 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ten to this valu
ed70: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a  e at this time..
ed80: 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72    ** After the r
ed90: 65 63 6f 72 64 73 20 61 72 65 20 61 64 64 65 64  ecords are added
eda0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
edb0: 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  (and the journal
edc0: 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69   synced, .  ** i
edd0: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
ede0: 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69  ode), the zero i
edf0: 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69  s overwritten wi
ee00: 74 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62  th the true numb
ee10: 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72  er.  ** of recor
ee20: 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72  ds (see syncJour
ee30: 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a  nal())..  **.  *
ee40: 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74 65 72  * A faster alter
ee50: 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77 72 69  native is to wri
ee60: 74 65 20 30 78 46 46 46 46 46 46 46 46 20 74 6f  te 0xFFFFFFFF to
ee70: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e   the nRec field.
ee80: 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69   When.  ** readi
ee90: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  ng the journal t
eea0: 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20  his value tells 
eeb0: 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65  SQLite to assume
eec0: 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72   that the.  ** r
eed0: 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  est of the journ
eee0: 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  al file contains
eef0: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
ef00: 72 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70  rds. This assump
ef10: 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e  tion.  ** is dan
ef20: 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20  gerous, as if a 
ef30: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
ef40: 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20   whilst writing 
ef50: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
ef60: 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20   ** file it may 
ef70: 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72  contain some gar
ef80: 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72 65  bage data. There
ef90: 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69   are two scenari
efa0: 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68  os.  ** where th
efb0: 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69  is risk can be i
efc0: 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  gnored:.  **.  *
efd0: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70  *   * When the p
efe0: 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79  ager is in no-sy
eff0: 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74  nc mode. Corrupt
f000: 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61  ion can follow a
f010: 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20  .  **     power 
f020: 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20  failure in this 
f030: 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a  case anyway..  *
f040: 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20  *.  **   * When 
f050: 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  the SQLITE_IOCAP
f060: 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61  _SAFE_APPEND fla
f070: 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 67  g is set. This g
f080: 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20  uarantees.  **  
f090: 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65 20     that garbage 
f0a0: 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61 70  data is never ap
f0b0: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f  pended to the jo
f0c0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f  urnal file..  */
f0d0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
f0e0: 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
f0f0: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
f100: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
f110: 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 70 50 61 67  >noSync || (pPag
f120: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
f130: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
f140: 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c  DE_MEMORY).   ||
f150: 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
f160: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
f170: 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c  (pPager->fd)&SQL
f180: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
f190: 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20  PPEND) .  ){.   
f1a0: 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
f1b0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
f1c0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
f1d0: 61 67 69 63 29 29 3b 0a 20 20 20 20 70 75 74 33  agic));.    put3
f1e0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
f1f0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
f200: 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66  gic)], 0xfffffff
f210: 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f);.  }else{.   
f220: 20 6d 65 6d 73 65 74 28 7a 48 65 61 64 65 72 2c   memset(zHeader,
f230: 20 30 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72   0, sizeof(aJour
f240: 6e 61 6c 4d 61 67 69 63 29 2b 34 29 3b 0a 20 20  nalMagic)+4);.  
f250: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64  }..  /* The rand
f260: 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e  om check-hash in
f270: 69 74 69 61 6c 69 7a 65 72 20 2a 2f 20 0a 20 20  itializer */ .  
f280: 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
f290: 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ss(sizeof(pPager
f2a0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70  ->cksumInit), &p
f2b0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
f2c0: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
f2d0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
f2e0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
f2f0: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
f300: 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69  nit);.  /* The i
f310: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
f320: 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62  size */.  put32b
f330: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
f340: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
f350: 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64  c)+8], pPager->d
f360: 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a  bOrigSize);.  /*
f370: 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   The assumed sec
f380: 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  tor size for thi
f390: 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70  s process */.  p
f3a0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
f3b0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
f3c0: 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61  lMagic)+12], pPa
f3d0: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
f3e0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65  ;..  /* The page
f3f0: 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32   size */.  put32
f400: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
f410: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
f420: 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d  ic)+16], pPager-
f430: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f  >pageSize);..  /
f440: 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  * Initializing t
f450: 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62  he tail of the b
f460: 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63  uffer is not nec
f470: 65 73 73 61 72 79 2e 20 20 45 76 65 72 79 74 68  essary.  Everyth
f480: 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66  ing.  ** works f
f490: 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  ind if the follo
f4a0: 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73  wing memset() is
f4b0: 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69   omitted.  But i
f4c0: 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a  nitializing.  **
f4d0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76   the memory prev
f4e0: 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72  ents valgrind fr
f4f0: 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20  om complaining, 
f500: 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e  so we are willin
f510: 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74  g to.  ** take t
f520: 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68  he performance h
f530: 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  it..  */.  memse
f540: 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  t(&zHeader[sizeo
f550: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
f560: 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20  +20], 0,.       
f570: 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f    nHeader-(sizeo
f580: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
f590: 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20  +20));..  /* In 
f5a0: 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e  theory, it is on
f5b0: 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ly necessary to 
f5c0: 77 72 69 74 65 20 74 68 65 20 32 38 20 62 79 74  write the 28 byt
f5d0: 65 73 20 74 68 61 74 20 74 68 65 20 0a 20 20 2a  es that the .  *
f5e0: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
f5f0: 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74 68 65   consumes to the
f600: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
f610: 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65 6d 65  re. Then increme
f620: 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67  nt the .  ** Pag
f630: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61  er.journalOff va
f640: 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41  riable by JOURNA
f650: 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68 61 74  L_HDR_SZ so that
f660: 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20   the next .  ** 
f670: 72 65 63 6f 72 64 20 69 73 20 77 72 69 74 74 65  record is writte
f680: 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  n to the followi
f690: 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61 76 69  ng sector (leavi
f6a0: 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68 65 20  ng a gap in the 
f6b0: 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74 20 77  file.  ** that w
f6c0: 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69 74 6c  ill be implicitl
f6d0: 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79 20 74  y filled in by t
f6e0: 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a  he OS)..  **.  *
f6f0: 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68 61 73  * However it has
f700: 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72 65 64   been discovered
f710: 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79   that on some sy
f720: 73 74 65 6d 73 20 74 68 69 73 20 70 61 74 74 65  stems this patte
f730: 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20  rn can .  ** be 
f740: 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c  significantly sl
f750: 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74 69 67  ower than contig
f760: 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67 20 64  uously writing d
f770: 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c 65 2c  ata to the file,
f780: 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68  .  ** even if th
f790: 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69 63 69  at means explici
f7a0: 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61  tly writing data
f7b0: 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66   to the block of
f7c0: 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f   .  ** (JOURNAL_
f7d0: 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74  HDR_SZ - 28) byt
f7e0: 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74  es that will not
f7f0: 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74 68 61   be used. So tha
f800: 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a 20 69  t is what.  ** i
f810: 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20  s done. .  **.  
f820: 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 72  ** The loop is r
f830: 65 71 75 69 72 65 64 20 68 65 72 65 20 69 6e 20  equired here in 
f840: 63 61 73 65 20 74 68 65 20 73 65 63 74 6f 72 2d  case the sector-
f850: 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72 20 74  size is larger t
f860: 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20 64 61  han the .  ** da
f870: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
f880: 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48 65 61  . Since the zHea
f890: 64 65 72 20 62 75 66 66 65 72 20 69 73 20 6f 6e  der buffer is on
f8a0: 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  ly Pager.pageSiz
f8b0: 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20  e.  ** bytes in 
f8c0: 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20  size, more than 
f8d0: 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  one call to sqli
f8e0: 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d 61 79  te3OsWrite() may
f8f0: 20 62 65 20 72 65 71 75 69 72 65 64 0a 20 20 2a   be required.  *
f900: 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68  * to populate th
f910: 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
f920: 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a   header sector..
f930: 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69    */ .  for(nWri
f940: 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  te=0; rc==SQLITE
f950: 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52  _OK&&nWrite<JOUR
f960: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
f970: 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61  r); nWrite+=nHea
f980: 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  der){.    IOTRAC
f990: 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64  E(("JHDR %p %lld
f9a0: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
f9b0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
f9c0: 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20  dr, nHeader)).  
f9d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
f9e0: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
f9f0: 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61  d, zHeader, nHea
fa00: 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  der, pPager->jou
fa10: 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 61 73  rnalOff);.    as
fa20: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
fa30: 75 72 6e 61 6c 48 64 72 20 3c 3d 20 70 50 61 67  urnalHdr <= pPag
fa40: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
fa50: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
fa60: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61  urnalOff += nHea
fa70: 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
fa80: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
fa90: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
faa0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
fab0: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
fac0: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d. A journal hea
fad0: 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55  der file.** (JOU
fae0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
faf0: 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  s) is read from 
fb00: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
fb10: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72  tion in the jour
fb20: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65  nal.** file. The
fb30: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
fb40: 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n in the journal
fb50: 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62   file is given b
fb60: 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75  y.** pPager->jou
fb70: 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63 6f 6d  rnalOff. See com
fb80: 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63  ments above func
fb90: 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61  tion writeJourna
fba0: 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20  lHdr() for.** a 
fbb0: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
fbc0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
fbd0: 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  r format..**.** 
fbe0: 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73  If the header is
fbf0: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
fc00: 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20 73 65  ly, *pNRec is se
fc10: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
fc20: 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72  of.** page recor
fc30: 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  ds following thi
fc40: 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 70 44  s header and *pD
fc50: 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  bSize is set to 
fc60: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
fc70: 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  ** database befo
fc80: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
fc90: 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67  on began, in pag
fca0: 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72  es. Also, pPager
fcb0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69  ->cksumInit.** i
fcc0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
fcd0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
fce0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
fcf0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
fd00: 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69  turned.** in thi
fd10: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
fd20: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
fd30: 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73  der file appears
fd40: 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64   to be corrupted
fd50: 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
fd60: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64  .** returned and
fd70: 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50 44 62   *pNRec and *PDb
fd80: 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66 69 6e  Size are undefin
fd90: 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f  ed.  If JOURNAL_
fda0: 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20  HDR_SZ bytes.** 
fdb0: 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66  cannot be read f
fdc0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
fdd0: 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  file an error co
fde0: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
fdf0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
fe00: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20  adJournalHdr(.  
fe10: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
fe20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fe30: 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
fe40: 20 20 69 6e 74 20 69 73 48 6f 74 2c 0a 20 20 69    int isHot,.  i
fe50: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20  64 journalSize, 
fe60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
fe70: 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ize of the open 
fe80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
fe90: 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a  bytes */.  u32 *
fea0: 70 4e 52 65 63 2c 20 20 20 20 20 20 20 20 20 20  pNRec,          
feb0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
fec0: 56 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  Value read from 
fed0: 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a  the nRec field *
fee0: 2f 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65  /.  u32 *pDbSize
fef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff00: 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f   /* OUT: Value o
ff10: 66 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  f original datab
ff20: 61 73 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a  ase size field *
ff30: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
ff40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff50: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
ff60: 64 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  de */.  unsigned
ff70: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
ff80: 20 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72       /* A buffer
ff90: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
ffa0: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ic header */.  i
ffb0: 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
ffc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
ffd0: 66 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c  ffset of journal
ffe0: 20 68 65 61 64 65 72 20 62 65 69 6e 67 20 72 65   header being re
fff0: 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
10000 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
10010 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20  jfd) );      /* 
10020 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  Journal file mus
10030 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20  t be open. */.. 
10040 20 2f 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65   /* Advance Page
10050 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20  r.journalOff to 
10060 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
10070 20 6e 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66   next sector. If
10080 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61   the.  ** journa
10090 6c 20 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d  l file is too sm
100a0 61 6c 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f  all for there to
100b0 20 62 65 20 61 20 68 65 61 64 65 72 20 73 74 6f   be a header sto
100c0 72 65 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a  red at this.  **
100d0 20 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53   point, return S
100e0 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f  QLITE_DONE..  */
100f0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
10100 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
10110 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
10120 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
10130 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
10140 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
10150 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
10160 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
10170 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
10180 20 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65   iHdrOff = pPage
10190 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
101a0 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65    /* Read in the
101b0 20 66 69 72 73 74 20 38 20 62 79 74 65 73 20 6f   first 8 bytes o
101c0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
101d0 61 64 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f  ader. If they do
101e0 20 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20   not match.  ** 
101f0 74 68 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e  the  magic strin
10200 67 20 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73  g found at the s
10210 74 61 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75  tart of each jou
10220 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74  rnal header, ret
10230 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  urn.  ** SQLITE_
10240 44 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65  DONE. If an IO e
10250 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
10260 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
10270 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  e. Otherwise,.  
10280 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f  ** proceed..  */
10290 0a 20 20 69 66 28 20 69 73 48 6f 74 20 7c 7c 20  .  if( isHot || 
102a0 69 48 64 72 4f 66 66 21 3d 70 50 61 67 65 72 2d  iHdrOff!=pPager-
102b0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 29 7b 0a 20  >journalHdr ){. 
102c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
102d0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
102e0 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f  d, aMagic, sizeo
102f0 66 28 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f  f(aMagic), iHdrO
10300 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ff);.    if( rc 
10310 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
10320 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
10330 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ( memcmp(aMagic,
10340 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
10350 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21  sizeof(aMagic))!
10360 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
10370 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
10380 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
10390 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 74  Read the first t
103a0 68 72 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c  hree 32-bit fiel
103b0 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
103c0 6c 20 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52  l header: The nR
103d0 65 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74  ec.  ** field, t
103e0 68 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74  he checksum-init
103f0 69 61 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20  ializer and the 
10400 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 74  database size at
10410 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20   the start.  ** 
10420 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
10430 6f 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  on. Return an er
10440 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
10450 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
10460 0a 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  .  */.  if( SQLI
10470 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61  TE_OK!=(rc = rea
10480 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
10490 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20  jfd, iHdrOff+8, 
104a0 70 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51  pNRec)).   || SQ
104b0 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
104c0 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
104d0 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31  ->jfd, iHdrOff+1
104e0 32 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  2, &pPager->cksu
104f0 6d 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51  mInit)).   || SQ
10500 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
10510 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
10520 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31  ->jfd, iHdrOff+1
10530 36 2c 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29  6, pDbSize)).  )
10540 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
10550 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
10560 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
10570 30 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61  0 ){.    u32 iPa
10580 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  geSize;         
10590 20 20 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69        /* Page-si
105a0 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
105b0 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
105c0 20 20 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a    u32 iSectorSiz
105d0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
105e0 2a 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69  * Sector-size fi
105f0 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  eld of journal h
10600 65 61 64 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a  eader */..    /*
10610 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d 73   Read the page-s
10620 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
10630 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ize journal head
10640 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20 20  er fields. */.  
10650 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
10660 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74  =(rc = read32bit
10670 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69  s(pPager->jfd, i
10680 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65 63  HdrOff+20, &iSec
10690 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20 7c  torSize)).     |
106a0 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  | SQLITE_OK!=(rc
106b0 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
106c0 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
106d0 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69 7a  ff+24, &iPageSiz
106e0 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  e)).    ){.     
106f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
10700 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 73 69 6f  }..    /* Versio
10710 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69  ns of SQLite pri
10720 6f 72 20 74 6f 20 33 2e 35 2e 38 20 73 65 74 20  or to 3.5.8 set 
10730 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 66 69  the page-size fi
10740 65 6c 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  eld of the.    *
10750 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
10760 20 74 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69   to zero. In thi
10770 73 20 63 61 73 65 2c 20 61 73 73 75 6d 65 20 74  s case, assume t
10780 68 61 74 20 74 68 65 20 50 61 67 65 72 2e 70 61  hat the Pager.pa
10790 67 65 53 69 7a 65 0a 20 20 20 20 2a 2a 20 76 61  geSize.    ** va
107a0 72 69 61 62 6c 65 20 69 73 20 61 6c 72 65 61 64  riable is alread
107b0 79 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 72  y set to the cor
107c0 72 65 63 74 20 70 61 67 65 20 73 69 7a 65 2e 0a  rect page size..
107d0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
107e0 50 61 67 65 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  PageSize==0 ){. 
107f0 20 20 20 20 20 69 50 61 67 65 53 69 7a 65 20 3d       iPageSize =
10800 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
10810 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
10820 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
10830 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d  values read from
10840 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
10850 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66  nd sector-size f
10860 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65  ields.    ** are
10870 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54   within range. T
10880 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c  o be 'in range',
10890 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65   both values nee
108a0 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a  d to be a power.
108b0 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72      ** of two gr
108c0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
108d0 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32  ual to 512 or 32
108e0 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65  , and not greate
108f0 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20  r than their .  
10900 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20    ** respective 
10910 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78  compile time max
10920 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20  imum limits..   
10930 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67   */.    if( iPag
10940 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20  eSize<512       
10950 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53             || iS
10960 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20  ectorSize<32.   
10970 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53    || iPageSize>S
10980 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
10990 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69  IZE || iSectorSi
109a0 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ze>MAX_SECTOR_SI
109b0 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61  ZE.     || ((iPa
109c0 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53  geSize-1)&iPageS
109d0 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69  ize)!=0   || ((i
109e0 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53  SectorSize-1)&iS
109f0 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20  ectorSize)!=0 . 
10a00 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49     ){.      /* I
10a10 66 20 74 68 65 20 65 69 74 68 65 72 20 74 68 65  f the either the
10a20 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65   page-size or se
10a30 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65  ctor-size in the
10a40 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
10a50 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76  is .      ** inv
10a60 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70  alid, then the p
10a70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
10a80 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65  e the journal-he
10a90 61 64 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a  ader must have .
10aa0 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64        ** crashed
10ab0 20 62 65 66 6f 72 65 20 74 68 65 20 68 65 61 64   before the head
10ac0 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49  er was synced. I
10ad0 6e 20 74 68 69 73 20 63 61 73 65 20 73 74 6f 70  n this case stop
10ae0 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20   reading .      
10af0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
10b00 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20  ile here..      
10b10 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
10b20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
10b30 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74   }..    /* Updat
10b40 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  e the page-size 
10b50 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
10b60 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
10b70 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a   journal. .    *
10b80 2a 20 55 73 65 20 61 20 74 65 73 74 63 61 73 65  * Use a testcase
10b90 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65  () macro to make
10ba0 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f   sure that mallo
10bb0 63 20 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e  c failure within
10bc0 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65   .    ** PagerSe
10bd0 74 50 61 67 65 73 69 7a 65 28 29 20 69 73 20 74  tPagesize() is t
10be0 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ested..    */.  
10bf0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
10c00 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
10c10 50 61 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a  Pager, &iPageSiz
10c20 65 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74  e, -1);.    test
10c30 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
10c40 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55  _OK );..    /* U
10c50 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65  pdate the assume
10c60 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f  d sector-size to
10c70 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
10c80 20 75 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a   used by .    **
10c90 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
10ca0 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a  t created this j
10cb0 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20  ournal. If this 
10cc0 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20  journal was.    
10cd0 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20  ** created by a 
10ce0 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68  process other th
10cf0 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65  an this one, the
10d00 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20  n this routine. 
10d10 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63     ** is being c
10d20 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
10d30 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
10d40 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61  (). The local va
10d50 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61  lue.    ** of Pa
10d60 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69  ger.sectorSize i
10d70 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68  s restored at th
10d80 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f  e end of that ro
10d90 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  utine..    */.  
10da0 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
10db0 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69  Size = iSectorSi
10dc0 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  ze;.  }..  pPage
10dd0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
10de0 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
10df0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
10e00 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
10e10 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69  Write the suppli
10e20 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ed master journa
10e30 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20  l name into the 
10e40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
10e50 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72   pager.** pPager
10e60 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
10e70 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61  location. The ma
10e80 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
10e90 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61  e must be the la
10ea0 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74  st.** thing writ
10eb0 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c  ten to a journal
10ec0 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61   file. If the pa
10ed0 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73  ger is in full-s
10ee0 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a  ync mode, the.**
10ef0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
10f00 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61  scriptor is adva
10f10 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74  nced to the next
10f20 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
10f30 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68   before.** anyth
10f40 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20  ing is written. 
10f50 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a  The format is:.*
10f60 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  *.**   + 4 bytes
10f70 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e  : PAGER_MJ_PGNO.
10f80 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a  .**   + N bytes:
10f90 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   Master journal 
10fa0 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d  filename in utf-
10fb0 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  8..**   + 4 byte
10fc0 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20  s: N (length of 
10fd0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
10fe0 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f  ame in bytes, no
10ff0 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29   nul-terminator)
11000 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  ..**   + 4 bytes
11010 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  : Master journal
11020 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a   name checksum..
11030 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20  **   + 8 bytes: 
11040 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
11050 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
11060 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63  r journal page c
11070 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73  hecksum is the s
11080 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20  um of the bytes 
11090 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  in the master.**
110a0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77   journal name, w
110b0 68 65 72 65 20 65 61 63 68 20 62 79 74 65 20 69  here each byte i
110c0 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
110d0 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20   a signed 8-bit 
110e0 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  integer..**.** I
110f0 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e  f zMaster is a N
11100 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63  ULL pointer (occ
11110 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  urs for a single
11120 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
11130 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73  ction), .** this
11140 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
11150 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11160 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
11170 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
11180 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
11190 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
111a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
111b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
111c0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
111d0 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20  nt nMaster;     
111e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111f0 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72  /* Length of str
11200 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20  ing zMaster */. 
11210 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
11220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11230 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68    /* Offset of h
11240 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c  eader in journal
11250 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a   file */.  i64 j
11260 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20  rnlSize;        
11270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
11280 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66  ize of journal f
11290 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20  ile on disk */. 
112a0 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20   u32 cksum = 0; 
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112c0 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66    /* Checksum of
112d0 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20   string zMaster 
112e0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
112f0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 3d  ager->setMaster=
11300 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
11310 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
11320 67 65 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 21  ger) );..  if( !
11330 7a 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c 20 70  zMaster .   || p
11340 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
11350 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
11360 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20  LMODE_MEMORY .  
11370 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67   || !isOpen(pPag
11380 65 72 2d 3e 6a 66 64 29 0a 20 20 29 7b 0a 20 20  er->jfd).  ){.  
11390 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
113a0 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  OK;.  }.  pPager
113b0 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b  ->setMaster = 1;
113c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
113d0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3c 3d  r->journalHdr <=
113e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
113f0 4f 66 66 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c  Off );..  /* Cal
11400 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74  culate the lengt
11410 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74  h in bytes and t
11420 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a  he checksum of z
11430 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28  Master */.  for(
11440 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74  nMaster=0; zMast
11450 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61  er[nMaster]; nMa
11460 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  ster++){.    cks
11470 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d  um += zMaster[nM
11480 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f  aster];.  }..  /
11490 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * If in full-syn
114a0 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20  c mode, advance 
114b0 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b  to the next disk
114c0 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77   sector before w
114d0 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  riting.  ** the 
114e0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
114f0 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20  ame. This is in 
11500 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75  case the previou
11510 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 74  s page written t
11520 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  o.  ** the journ
11530 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  al has already b
11540 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f  een synced..  */
11550 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
11560 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70  ullSync ){.    p
11570 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11580 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
11590 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
115a0 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50  }.  iHdrOff = pP
115b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
115c0 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  ;..  /* Write th
115d0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
115e0 20 64 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64   data to the end
115f0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
11600 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e  file. If.  ** an
11610 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
11620 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
11630 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
11640 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  er..  */.  if( (
11650 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
11660 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
11670 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47  fd, iHdrOff, PAG
11680 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
11690 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  r)))).   || (0 !
116a0 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  = (rc = sqlite3O
116b0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
116c0 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61  fd, zMaster, nMa
116d0 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29  ster, iHdrOff+4)
116e0 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
116f0 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
11700 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
11710 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c  drOff+4+nMaster,
11720 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c   nMaster))).   |
11730 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72  | (0 != (rc = wr
11740 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
11750 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34  ->jfd, iHdrOff+4
11760 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75  +nMaster+4, cksu
11770 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  m))).   || (0 !=
11780 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
11790 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
117a0 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  d, aJournalMagic
117b0 2c 20 38 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 8,.           
117c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117d0 20 20 20 20 20 20 69 48 64 72 4f 66 66 2b 34 2b        iHdrOff+4+
117e0 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29  nMaster+8))).  )
117f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
11800 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
11810 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d  ournalOff += (nM
11820 61 73 74 65 72 2b 32 30 29 3b 0a 0a 20 20 2f 2a  aster+20);..  /*
11830 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
11840 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f   in peristent-jo
11850 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e  urnal mode, then
11860 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20   the physical . 
11870 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65   ** journal-file
11880 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73 74   may extend past
11890 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
118a0 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
118b0 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62  ame.  ** and 8 b
118c0 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61  ytes of magic da
118d0 74 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  ta just written 
118e0 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69  to the file. Thi
118f0 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65  s is .  ** dange
11900 72 6f 75 73 20 62 65 63 61 75 73 65 20 74 68 65  rous because the
11910 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63   code to rollbac
11920 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  k a hot-journal 
11930 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e  file.  ** will n
11940 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69  ot be able to fi
11950 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  nd the master-jo
11960 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65  urnal name to de
11970 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68  termine .  ** wh
11980 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
11990 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e   journal is hot.
119a0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69   .  **.  ** Easi
119b0 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20  est thing to do 
119c0 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f  in this scenario
119d0 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20   is to truncate 
119e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  the journal .  *
119f0 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65  * file to the re
11a00 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a  quired size..  *
11a10 2f 20 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  / .  if( SQLITE_
11a20 4f 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK==(rc = sqlite
11a30 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
11a40 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69  er->jfd, &jrnlSi
11a50 7a 65 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53  ze)).   && jrnlS
11a60 69 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ize>pPager->jour
11a70 6e 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20  nalOff.  ){.    
11a80 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
11a90 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
11aa0 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
11ab0 6e 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72  nalOff);.  }.  r
11ac0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11ad0 2a 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 65  ** Discard the e
11ae0 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
11af0 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  f the in-memory 
11b00 70 61 67 65 2d 63 61 63 68 65 2e 0a 2a 2f 0a 73  page-cache..*/.s
11b10 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
11b20 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50  _reset(Pager *pP
11b30 61 67 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d  ager){.  pPager-
11b40 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b  >iDataVersion++;
11b50 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70  .  sqlite3Backup
11b60 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e  Restart(pPager->
11b70 70 42 61 63 6b 75 70 29 3b 0a 20 20 73 71 6c 69  pBackup);.  sqli
11b80 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70  te3PcacheClear(p
11b90 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
11ba0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
11bb0 20 74 68 65 20 70 50 61 67 65 72 2d 3e 69 44 61   the pPager->iDa
11bc0 74 61 56 65 72 73 69 6f 6e 20 76 61 6c 75 65 0a  taVersion value.
11bd0 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 50 61  */.u32 sqlite3Pa
11be0 67 65 72 44 61 74 61 56 65 72 73 69 6f 6e 28 50  gerDataVersion(P
11bf0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
11c00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11c10 3e 65 53 74 61 74 65 3e 50 41 47 45 52 5f 4f 50  >eState>PAGER_OP
11c20 45 4e 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  EN );.  return p
11c30 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73  Pager->iDataVers
11c40 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  ion;.}../*.** Fr
11c50 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65  ee all structure
11c60 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61  s in the Pager.a
11c70 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61  Savepoint[] arra
11c80 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a 2a  y and set both.*
11c90 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  * Pager.aSavepoi
11ca0 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53 61  nt and Pager.nSa
11cb0 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f 2e  vepoint to zero.
11cc0 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d 6a   Close the sub-j
11cd0 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74 20  ournal.** if it 
11ce0 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
11cf0 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
11d00 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a  exclusive mode..
11d10 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
11d20 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
11d30 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  nts(Pager *pPage
11d40 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20 20  r){.  int ii;   
11d50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
11d60 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f 70  terator for loop
11d70 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67 65  ing through Page
11d80 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  r.aSavepoint */.
11d90 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
11da0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
11db0 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73 71  t; ii++){.    sq
11dc0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
11dd0 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  oy(pPager->aSave
11de0 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76  point[ii].pInSav
11df0 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20 69  epoint);.  }.  i
11e00 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
11e10 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73 71 6c  usiveMode || sql
11e20 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d  ite3JournalIsInM
11e30 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 73 6a  emory(pPager->sj
11e40 66 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  fd) ){.    sqlit
11e50 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
11e60 2d 3e 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73  ->sjfd);.  }.  s
11e70 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
11e80 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b  er->aSavepoint);
11e90 0a 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65  .  pPager->aSave
11ea0 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61  point = 0;.  pPa
11eb0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  ger->nSavepoint 
11ec0 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
11ed0 53 75 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f  SubRec = 0;.}../
11ee0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74  *.** Set the bit
11ef0 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20   number pgno in 
11f00 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
11f10 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
11f20 0a 2a 2a 20 62 69 74 76 65 63 73 20 6f 66 20 61  .** bitvecs of a
11f30 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ll open savepoin
11f40 74 73 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  ts. Return SQLIT
11f50 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
11f60 75 6c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  ul.** or SQLITE_
11f70 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f  NOMEM if a mallo
11f80 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  c failure occurs
11f90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11fa0 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
11fb0 74 76 65 63 73 28 50 61 67 65 72 20 2a 70 50 61  tvecs(Pager *pPa
11fc0 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
11fd0 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
11fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11ff0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
12000 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12010 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52  E_OK;       /* R
12020 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20  esult code */.. 
12030 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
12040 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
12050 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67  ; ii++){.    Pag
12060 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d  erSavepoint *p =
12070 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
12080 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66  oint[ii];.    if
12090 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67  ( pgno<=p->nOrig
120a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20   ){.      rc |= 
120b0 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
120c0 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74  (p->pInSavepoint
120d0 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74  , pgno);.      t
120e0 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
120f0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
12100 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
12110 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  QLITE_OK || rc==
12120 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
12130 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
12140 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12150 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
12160 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
12170 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c  pager is in excl
12180 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 6e  usive mode and n
12190 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20 45 52 52  ot.** in the ERR
121a0 4f 52 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77  OR state. Otherw
121b0 69 73 65 2c 20 69 74 20 73 77 69 74 63 68 65 73  ise, it switches
121c0 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 50 41   the pager to PA
121d0 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 73 74 61 74  GER_OPEN.** stat
121e0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
121f0 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
12200 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
12210 20 6d 6f 64 65 2c 20 74 68 65 20 64 61 74 61 62   mode, the datab
12220 61 73 65 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63  ase file is.** c
12230 6f 6d 70 6c 65 74 65 6c 79 20 75 6e 6c 6f 63 6b  ompletely unlock
12240 65 64 2e 20 49 66 20 74 68 65 20 66 69 6c 65 20  ed. If the file 
12250 69 73 20 75 6e 6c 6f 63 6b 65 64 20 61 6e 64 20  is unlocked and 
12260 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
12270 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 68 69  does.** not exhi
12280 62 69 74 20 74 68 65 20 55 4e 44 45 4c 45 54 41  bit the UNDELETA
12290 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 70 72  BLE_WHEN_OPEN pr
122a0 6f 70 65 72 74 79 2c 20 74 68 65 20 6a 6f 75 72  operty, the jour
122b0 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63  nal file is.** c
122c0 6c 6f 73 65 64 20 28 69 66 20 69 74 20 69 73 20  losed (if it is 
122d0 6f 70 65 6e 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  open)..**.** If 
122e0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
122f0 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65 6e  ERROR state when
12300 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
12310 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 0a 2a  s called, the .*
12320 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
12330 65 20 70 61 67 65 72 20 63 61 63 68 65 20 61 72  e pager cache ar
12340 65 20 64 69 73 63 61 72 64 65 64 20 62 65 66 6f  e discarded befo
12350 72 65 20 73 77 69 74 63 68 69 6e 67 20 62 61 63  re switching bac
12360 6b 20 74 6f 20 0a 2a 2a 20 74 68 65 20 4f 50 45  k to .** the OPE
12370 4e 20 73 74 61 74 65 2e 20 52 65 67 61 72 64 6c  N state. Regardl
12380 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 74  ess of whether t
12390 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
123a0 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 0a 2a 2a  xclusive-mode.**
123b0 20 6f 72 20 6e 6f 74 2c 20 61 6e 79 20 6a 6f 75   or not, any jou
123c0 72 6e 61 6c 20 66 69 6c 65 20 6c 65 66 74 20 69  rnal file left i
123d0 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
123e0 6d 20 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65  m will be treate
123f0 64 0a 2a 2a 20 61 73 20 61 20 68 6f 74 2d 6a 6f  d.** as a hot-jo
12400 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64  urnal and rolled
12410 20 62 61 63 6b 20 74 68 65 20 6e 65 78 74 20 74   back the next t
12420 69 6d 65 20 61 20 72 65 61 64 2d 74 72 61 6e 73  ime a read-trans
12430 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 6f 70 65  action.** is ope
12440 6e 65 64 20 28 62 79 20 74 68 69 73 20 6f 72 20  ned (by this or 
12450 62 79 20 61 6e 79 20 6f 74 68 65 72 20 63 6f 6e  by any other con
12460 6e 65 63 74 69 6f 6e 29 2e 0a 2a 2f 0a 73 74 61  nection)..*/.sta
12470 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75  tic void pager_u
12480 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  nlock(Pager *pPa
12490 67 65 72 29 7b 0a 0a 20 20 61 73 73 65 72 74 28  ger){..  assert(
124a0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
124b0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20  =PAGER_READER . 
124c0 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d        || pPager-
124d0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
124e0 50 45 4e 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  PEN .       || p
124f0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
12500 41 47 45 52 5f 45 52 52 4f 52 20 0a 20 20 29 3b  AGER_ERROR .  );
12510 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  ..  sqlite3Bitve
12520 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
12530 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
12540 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
12550 61 6c 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73  al = 0;.  releas
12560 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70  eAllSavepoints(p
12570 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70  Pager);..  if( p
12580 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
12590 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  r) ){.    assert
125a0 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
125b0 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 73 71  ->jfd) );.    sq
125c0 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54  lite3WalEndReadT
125d0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
125e0 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 70 50  r->pWal);.    pP
125f0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
12600 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c  AGER_OPEN;.  }el
12610 73 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  se if( !pPager->
12620 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
12630 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20  .    int rc;    
12640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12650 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
12660 20 72 65 74 75 72 6e 65 64 20 62 79 20 70 61 67   returned by pag
12670 65 72 55 6e 6c 6f 63 6b 44 62 28 29 20 2a 2f 0a  erUnlockDb() */.
12680 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 69 73      int iDc = is
12690 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
126a0 3f 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  ?sqlite3OsDevice
126b0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
126c0 70 50 61 67 65 72 2d 3e 66 64 29 3a 30 3b 0a 0a  pPager->fd):0;..
126d0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 70      /* If the op
126e0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 73  erating system s
126f0 75 70 70 6f 72 74 20 64 65 6c 65 74 69 6f 6e 20  upport deletion 
12700 6f 66 20 6f 70 65 6e 20 66 69 6c 65 73 2c 20 74  of open files, t
12710 68 65 6e 0a 20 20 20 20 2a 2a 20 63 6c 6f 73 65  hen.    ** close
12720 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12730 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20  e when dropping 
12740 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
12750 6b 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 20 20  k.  Otherwise.  
12760 20 20 2a 2a 20 61 6e 6f 74 68 65 72 20 63 6f 6e    ** another con
12770 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75  nection with jou
12780 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65  rnal_mode=delete
12790 20 6d 69 67 68 74 20 64 65 6c 65 74 65 20 74 68   might delete th
127a0 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6f 75  e file.    ** ou
127b0 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e  t from under us.
127c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
127d0 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
127e0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 20 20  ALMODE_MEMORY   
127f0 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)!=1 );.    a
12800 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
12810 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 20 20  URNALMODE_OFF   
12820 20 20 20 26 20 35 29 21 3d 31 20 29 3b 0a 20 20     & 5)!=1 );.  
12830 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
12840 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
12850 20 20 20 20 20 20 26 20 35 29 21 3d 31 20 29 3b        & 5)!=1 );
12860 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 41  .    assert( (PA
12870 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
12880 44 45 4c 45 54 45 20 20 20 26 20 35 29 21 3d 31  DELETE   & 5)!=1
12890 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
128a0 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  (PAGER_JOURNALMO
128b0 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20 35 29  DE_TRUNCATE & 5)
128c0 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
128d0 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41  t( (PAGER_JOURNA
128e0 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 20 26  LMODE_PERSIST  &
128f0 20 35 29 3d 3d 31 20 29 3b 0a 20 20 20 20 69 66   5)==1 );.    if
12900 28 20 30 3d 3d 28 69 44 63 20 26 20 53 51 4c 49  ( 0==(iDc & SQLI
12910 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54  TE_IOCAP_UNDELET
12920 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 29 0a  ABLE_WHEN_OPEN).
12930 20 20 20 20 20 7c 7c 20 31 21 3d 28 70 50 61 67       || 1!=(pPag
12940 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
12950 26 20 35 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  & 5).    ){.    
12960 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
12970 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
12980 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
12990 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
129a0 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20  the ERROR state 
129b0 61 6e 64 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  and the call to 
129c0 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  unlock the datab
129d0 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ase.    ** file 
129e0 66 61 69 6c 73 2c 20 73 65 74 20 74 68 65 20 63  fails, set the c
129f0 75 72 72 65 6e 74 20 6c 6f 63 6b 20 74 6f 20 55  urrent lock to U
12a00 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65  NKNOWN_LOCK. See
12a10 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 20 20 20   the comment.   
12a20 20 2a 2a 20 61 62 6f 76 65 20 74 68 65 20 23 64   ** above the #d
12a30 65 66 69 6e 65 20 66 6f 72 20 55 4e 4b 4e 4f 57  efine for UNKNOW
12a40 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20 65 78  N_LOCK for an ex
12a50 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 77 68 79  planation of why
12a60 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20   this.    ** is 
12a70 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 2a  necessary..    *
12a80 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
12a90 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  UnlockDb(pPager,
12aa0 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69   NO_LOCK);.    i
12ab0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12ac0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
12ad0 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52 20  te==PAGER_ERROR 
12ae0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
12af0 3e 65 4c 6f 63 6b 20 3d 20 55 4e 4b 4e 4f 57 4e  >eLock = UNKNOWN
12b00 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  _LOCK;.    }..  
12b10 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 73    /* The pager s
12b20 74 61 74 65 20 6d 61 79 20 62 65 20 63 68 61 6e  tate may be chan
12b30 67 65 64 20 66 72 6f 6d 20 50 41 47 45 52 5f 45  ged from PAGER_E
12b40 52 52 4f 52 20 74 6f 20 50 41 47 45 52 5f 4f 50  RROR to PAGER_OP
12b50 45 4e 20 68 65 72 65 0a 20 20 20 20 2a 2a 20 77  EN here.    ** w
12b60 69 74 68 6f 75 74 20 63 6c 65 61 72 69 6e 67 20  ithout clearing 
12b70 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  the error code. 
12b80 54 68 69 73 20 69 73 20 69 6e 74 65 6e 74 69 6f  This is intentio
12b90 6e 61 6c 20 2d 20 74 68 65 20 65 72 72 6f 72 0a  nal - the error.
12ba0 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 63      ** code is c
12bb0 6c 65 61 72 65 64 20 61 6e 64 20 74 68 65 20 63  leared and the c
12bc0 61 63 68 65 20 72 65 73 65 74 20 69 6e 20 74 68  ache reset in th
12bd0 65 20 62 6c 6f 63 6b 20 62 65 6c 6f 77 2e 0a 20  e block below.. 
12be0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
12bf0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
12c00 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  e || pPager->eSt
12c10 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
12c20 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
12c30 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
12c40 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
12c50 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f  >eState = PAGER_
12c60 4f 50 45 4e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OPEN;.  }..  /* 
12c70 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  If Pager.errCode
12c80 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e   is set, the con
12c90 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
12ca0 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20  er cache cannot 
12cb0 62 65 0a 20 20 2a 2a 20 74 72 75 73 74 65 64 2e  be.  ** trusted.
12cc0 20 4e 6f 77 20 74 68 61 74 20 74 68 65 72 65 20   Now that there 
12cd0 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
12ce0 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
12cf0 20 74 68 65 20 70 61 67 65 72 2c 0a 20 20 2a 2a   the pager,.  **
12d00 20 69 74 20 63 61 6e 20 73 61 66 65 6c 79 20 6d   it can safely m
12d10 6f 76 65 20 62 61 63 6b 20 74 6f 20 50 41 47 45  ove back to PAGE
12d20 52 5f 4f 50 45 4e 20 73 74 61 74 65 2e 20 54 68  R_OPEN state. Th
12d30 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20 62 6f  is happens in bo
12d40 74 68 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 61  th.  ** normal a
12d50 6e 64 20 65 78 63 6c 75 73 69 76 65 2d 6c 6f 63  nd exclusive-loc
12d60 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 20 2a 2f 0a  king mode..  */.
12d70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
12d80 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
12d90 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29  E_OK || !MEMDB )
12da0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
12db0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 69  errCode ){.    i
12dc0 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
12dd0 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ile==0 ){.      
12de0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
12df0 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  er);.      pPage
12e00 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
12e10 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ne = 0;.      pP
12e20 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
12e30 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 20 20 7d  AGER_OPEN;.    }
12e40 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67  else{.      pPag
12e50 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 69 73  er->eState = (is
12e60 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
12e70 29 20 3f 20 50 41 47 45 52 5f 4f 50 45 4e 20 3a  ) ? PAGER_OPEN :
12e80 20 50 41 47 45 52 5f 52 45 41 44 45 52 29 3b 0a   PAGER_READER);.
12e90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 55 53      }.    if( US
12ea0 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29  EFETCH(pPager) )
12eb0 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63   sqlite3OsUnfetc
12ec0 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c  h(pPager->fd, 0,
12ed0 20 30 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d   0);.    pPager-
12ee0 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54  >errCode = SQLIT
12ef0 45 5f 4f 4b 3b 0a 20 20 20 20 73 65 74 47 65 74  E_OK;.    setGet
12f00 74 65 72 4d 65 74 68 6f 64 28 70 50 61 67 65 72  terMethod(pPager
12f10 29 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72  );.  }..  pPager
12f20 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
12f30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
12f40 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 70 50  nalHdr = 0;.  pP
12f50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
12f60 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  = 0;.}../*.** Th
12f70 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
12f80 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61  alled whenever a
12f90 6e 20 49 4f 45 52 52 20 6f 72 20 46 55 4c 4c 20  n IOERR or FULL 
12fa0 65 72 72 6f 72 20 74 68 61 74 20 72 65 71 75 69  error that requi
12fb0 72 65 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 72  res.** the pager
12fc0 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 20 69   to transition i
12fd0 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74  nto the ERROR st
12fe0 61 74 65 20 6d 61 79 20 61 68 76 65 20 6f 63 63  ate may ahve occ
12ff0 75 72 72 65 64 2e 0a 2a 2a 20 54 68 65 20 66 69  urred..** The fi
13000 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
13010 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
13020 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65   pager structure
13030 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  , the second .**
13040 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20   the error-code 
13050 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75  about to be retu
13060 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20  rned by a pager 
13070 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  API function. Th
13080 65 20 0a 2a 2a 20 76 61 6c 75 65 20 72 65 74 75  e .** value retu
13090 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f  rned is a copy o
130a0 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
130b0 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
130c0 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49  nction. .**.** I
130d0 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
130e0 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f  ument is SQLITE_
130f0 46 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45  FULL, SQLITE_IOE
13100 52 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  RR or one of the
13110 0a 2a 2a 20 49 4f 45 52 52 20 73 75 62 2d 63 6f  .** IOERR sub-co
13120 64 65 73 2c 20 74 68 65 20 70 61 67 65 72 20 65  des, the pager e
13130 6e 74 65 72 73 20 74 68 65 20 45 52 52 4f 52 20  nters the ERROR 
13140 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 65 72  state and the er
13150 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 73  ror code.** is s
13160 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 65  tored in Pager.e
13170 72 72 43 6f 64 65 2e 20 57 68 69 6c 65 20 74 68  rrCode. While th
13180 65 20 70 61 67 65 72 20 72 65 6d 61 69 6e 73 20  e pager remains 
13190 69 6e 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  in the ERROR sta
131a0 74 65 2c 0a 2a 2a 20 61 6c 6c 20 6d 61 6a 6f 72  te,.** all major
131b0 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68   API calls on th
131c0 65 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d  e Pager will imm
131d0 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20  ediately return 
131e0 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 0a 2a  Pager.errCode..*
131f0 2a 0a 2a 2a 20 54 68 65 20 45 52 52 4f 52 20 73  *.** The ERROR s
13200 74 61 74 65 20 69 6e 64 69 63 61 74 65 73 20 74  tate indicates t
13210 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
13220 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
13230 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  che .** cannot b
13240 65 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20  e trusted. This 
13250 73 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65  state can be cle
13260 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65  ared by complete
13270 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a  ly discarding .*
13280 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * the contents o
13290 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
132a0 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  e. If a transact
132b0 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77  ion was active w
132c0 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69  hen.** the persi
132d0 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75  stent error occu
132e0 72 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72  rred, then the r
132f0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
13300 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62  may need.** to b
13310 65 20 72 65 70 6c 61 79 65 64 20 74 6f 20 72 65  e replayed to re
13320 73 74 6f 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  store the conten
13330 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ts of the databa
13340 73 65 20 66 69 6c 65 20 28 61 73 20 69 66 0a 2a  se file (as if.*
13350 2a 20 69 74 20 77 65 72 65 20 61 20 68 6f 74 2d  * it were a hot-
13360 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61  journal)..*/.sta
13370 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72  tic int pager_er
13380 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ror(Pager *pPage
13390 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e  r, int rc){.  in
133a0 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66  t rc2 = rc & 0xf
133b0 66 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  f;.  assert( rc=
133c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d  =SQLITE_OK || !M
133d0 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
133e0 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  (.       pPager-
133f0 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
13400 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20  _FULL ||.       
13410 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
13420 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20  =SQLITE_OK ||.  
13430 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72       (pPager->er
13440 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53  rCode & 0xff)==S
13450 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b  QLITE_IOERR.  );
13460 0a 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49  .  if( rc2==SQLI
13470 54 45 5f 46 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d  TE_FULL || rc2==
13480 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
13490 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
134a0 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50  ode = rc;.    pP
134b0 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
134c0 41 47 45 52 5f 45 52 52 4f 52 3b 0a 20 20 20 20  AGER_ERROR;.    
134d0 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64 28  setGetterMethod(
134e0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
134f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
13500 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72  tic int pager_tr
13510 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
13520 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
13530 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 72  );../*.** The wr
13540 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
13550 6f 70 65 6e 20 6f 6e 20 70 50 61 67 65 72 20 69  open on pPager i
13560 73 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65  s being committe
13570 64 20 28 62 43 6f 6d 6d 69 74 3d 3d 31 29 0a 2a  d (bCommit==1).*
13580 2a 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  * or rolled back
13590 20 28 62 43 6f 6d 6d 69 74 3d 3d 30 29 2e 0a 2a   (bCommit==0)..*
135a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
135b0 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20   if and only if 
135c0 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
135d0 73 68 6f 75 6c 64 20 62 65 20 66 6c 75 73 68 65  should be flushe
135e0 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
135f0 20 52 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   Rules:.**.**   
13600 2a 20 20 46 6f 72 20 6e 6f 6e 2d 54 45 4d 50 20  *  For non-TEMP 
13610 64 61 74 61 62 61 73 65 73 2c 20 61 6c 77 61 79  databases, alway
13620 73 20 73 79 6e 63 20 74 6f 20 64 69 73 6b 2e 20  s sync to disk. 
13630 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
13640 72 79 0a 2a 2a 20 20 20 20 20 20 66 6f 72 20 74  ry.**      for t
13650 72 61 6e 73 61 63 74 69 6f 6e 73 20 74 6f 20 62  ransactions to b
13660 65 20 64 75 72 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  e durable..**.**
13670 20 20 20 2a 20 20 53 79 6e 63 20 54 45 4d 50 20     *  Sync TEMP 
13680 64 61 74 61 62 61 73 65 20 6f 6e 6c 79 20 6f 6e  database only on
13690 20 61 20 43 4f 4d 4d 49 54 20 28 6e 6f 74 20 61   a COMMIT (not a
136a0 20 52 4f 4c 4c 42 41 43 4b 29 20 77 68 65 6e 20   ROLLBACK) when 
136b0 74 68 65 20 62 61 63 6b 69 6e 67 0a 2a 2a 20 20  the backing.**  
136c0 20 20 20 20 66 69 6c 65 20 68 61 73 20 62 65 65      file has bee
136d0 6e 20 63 72 65 61 74 65 64 20 61 6c 72 65 61 64  n created alread
136e0 79 20 28 76 69 61 20 61 20 73 70 69 6c 6c 20 6f  y (via a spill o
136f0 6e 20 70 61 67 65 72 53 74 72 65 73 73 28 29 29  n pagerStress())
13700 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 77 68 65   and.**      whe
13710 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
13720 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 6d  dirty pages in m
13730 65 6d 6f 72 79 20 65 78 63 65 65 64 73 20 32 35  emory exceeds 25
13740 25 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 0a 2a  % of the total.*
13750 2a 20 20 20 20 20 20 63 61 63 68 65 20 73 69 7a  *      cache siz
13760 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
13770 20 70 61 67 65 72 46 6c 75 73 68 4f 6e 43 6f 6d   pagerFlushOnCom
13780 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
13790 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b  r, int bCommit){
137a0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  .  if( pPager->t
137b0 65 6d 70 46 69 6c 65 3d 3d 30 20 29 20 72 65 74  empFile==0 ) ret
137c0 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 21 62 43  urn 1;.  if( !bC
137d0 6f 6d 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30  ommit ) return 0
137e0 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  ;.  if( !isOpen(
137f0 70 50 61 67 65 72 2d 3e 66 64 29 20 29 20 72 65  pPager->fd) ) re
13800 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
13810 20 28 73 71 6c 69 74 65 33 50 43 61 63 68 65 50   (sqlite3PCacheP
13820 65 72 63 65 6e 74 44 69 72 74 79 28 70 50 61 67  ercentDirty(pPag
13830 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 3d 32 35  er->pPCache)>=25
13840 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
13850 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20   routine ends a 
13860 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74  transaction. A t
13870 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73  ransaction is us
13880 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a  ually ended by .
13890 2a 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d  ** either a COMM
138a0 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b  IT or a ROLLBACK
138b0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73   operation. This
138c0 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20   routine may be 
138d0 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72  called .** after
138e0 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68   rollback of a h
138f0 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69  ot-journal, or i
13900 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
13910 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a  s while opening.
13920 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
13930 69 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ile or writing t
13940 68 65 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f  he very first jo
13950 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20  urnal-header of 
13960 61 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72  a.** database tr
13970 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a  ansaction..** .*
13980 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
13990 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 69  s never called i
139a0 6e 20 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74  n PAGER_ERROR st
139b0 61 74 65 2e 20 49 66 20 69 74 20 69 73 20 63 61  ate. If it is ca
139c0 6c 6c 65 64 0a 2a 2a 20 69 6e 20 50 41 47 45 52  lled.** in PAGER
139d0 5f 4e 4f 4e 45 20 6f 72 20 50 41 47 45 52 5f 53  _NONE or PAGER_S
139e0 48 41 52 45 44 20 73 74 61 74 65 20 61 6e 64 20  HARED state and 
139f0 74 68 65 20 6c 6f 63 6b 20 68 65 6c 64 20 69 73  the lock held is
13a00 20 6c 65 73 73 0a 2a 2a 20 65 78 63 6c 75 73 69   less.** exclusi
13a10 76 65 20 74 68 61 6e 20 61 20 52 45 53 45 52 56  ve than a RESERV
13a20 45 44 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 61  ED lock, it is a
13a30 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4f 74   no-op..**.** Ot
13a40 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74  herwise, any act
13a50 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
13a60 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  re released..**.
13a70 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
13a80 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20  l file is open, 
13a90 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61  then it is "fina
13aa0 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a  lized". Once a j
13ab0 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20  ournal .** file 
13ac0 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
13ad0 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  ed it is not pos
13ae0 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20  sible to use it 
13af0 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a  to roll back a .
13b00 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
13b10 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63  Nor will it be c
13b20 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
13b30 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79  a hot-journal by
13b40 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20   this.** or any 
13b50 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
13b60 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74  onnection. Exact
13b70 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c  ly how a journal
13b80 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a   is finalized.**
13b90 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
13ba0 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70  her or not the p
13bb0 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
13bc0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
13bd0 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72  e and.** the cur
13be0 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64  rent journal-mod
13bf0 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  e (Pager.journal
13c00 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20  Mode value), as 
13c10 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
13c20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45   journalMode==ME
13c30 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  MORY.**     Jour
13c40 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
13c50 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c  tor is simply cl
13c60 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72  osed. This destr
13c70 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69  oys an .**     i
13c80 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
13c90 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
13ca0 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a  lMode==TRUNCATE.
13cb0 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
13cc0 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
13cd0 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
13ce0 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  n size..**.**   
13cf0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
13d00 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20  SIST.**     The 
13d10 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f  first 28 bytes o
13d20 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
13d30 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54  le are zeroed. T
13d40 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a  his invalidates.
13d50 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74  **     the first
13d60 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
13d70 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64  in the file, and
13d80 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72   hence the entir
13d90 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
13da0 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69   file. An invali
13db0 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  d journal file c
13dc0 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20  annot be rolled 
13dd0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  back..**.**   jo
13de0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54  urnalMode==DELET
13df0 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75  E.**     The jou
13e00 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  rnal file is clo
13e10 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20  sed and deleted 
13e20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
13e30 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20  elete()..**.**  
13e40 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20     If the pager 
13e50 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
13e60 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
13e70 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e  is method of fin
13e80 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74  alizing.**     t
13e90 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13ea0 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49  is never used. I
13eb0 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a  nstead, if the j
13ec0 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a  ournalMode is.**
13ed0 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20       DELETE and 
13ee0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
13ef0 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
13f00 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72  the method descr
13f10 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20  ibed under.**   
13f20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
13f30 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69  ERSIST is used i
13f40 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66  nstead..**.** Af
13f50 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
13f60 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 74 68  is finalized, th
13f70 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f  e pager moves to
13f80 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74   PAGER_READER st
13f90 61 74 65 2e 0a 2a 2a 20 49 66 20 72 75 6e 6e 69  ate..** If runni
13fa0 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73  ng in non-exclus
13fb0 69 76 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64  ive rollback mod
13fc0 65 2c 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  e, the lock on t
13fd0 68 65 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 64  he file is .** d
13fe0 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20 53  owngraded to a S
13ff0 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
14000 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
14010 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
14020 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61  ror occurs. If a
14030 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
14040 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20  uring.** any of 
14050 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e  the IO operation
14060 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  s to finalize th
14070 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
14080 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20  r unlock the.** 
14090 64 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68  database then th
140a0 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
140b0 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
140c0 68 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20  he user. If the 
140d0 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  .** operation to
140e0 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
140f0 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73  urnal file fails
14100 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20  , then the code 
14110 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74  still.** tries t
14120 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
14130 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f  abase file if no
14140 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  t in exclusive m
14150 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75  ode. If the.** u
14160 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
14170 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74  fails as well, t
14180 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72  hen the first er
14190 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64  ror code related
141a0 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74  .** to the first
141b0 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72   error encounter
141c0 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ed (the journal 
141d0 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65  finalization one
141e0 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  ) is.** returned
141f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14200 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
14210 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
14220 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74  ger, int hasMast
14230 65 72 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29  er, int bCommit)
14240 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
14250 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20  ITE_OK;      /* 
14260 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  Error code from 
14270 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61  journal finaliza
14280 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a  tion operation *
14290 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51  /.  int rc2 = SQ
142a0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20  LITE_OK;     /* 
142b0 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  Error code from 
142c0 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f  db file unlock o
142d0 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  peration */..  /
142e0 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20  * Do nothing if 
142f0 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e  the pager does n
14300 6f 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20  ot have an open 
14310 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
14320 6e 0a 20 20 2a 2a 20 6f 72 20 61 74 20 6c 65 61  n.  ** or at lea
14330 73 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  st a RESERVED lo
14340 63 6b 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ck. This functio
14350 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  n may be called 
14360 77 68 65 6e 20 74 68 65 72 65 0a 20 20 2a 2a 20  when there.  ** 
14370 69 73 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  is no write-tran
14380 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 20 62  saction active b
14390 75 74 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ut a RESERVED or
143a0 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73   greater lock is
143b0 0a 20 20 2a 2a 20 68 65 6c 64 20 75 6e 64 65 72  .  ** held under
143c0 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e 63   two circumstanc
143d0 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  es:.  **.  **   
143e0 31 2e 20 41 66 74 65 72 20 61 20 73 75 63 63 65  1. After a succe
143f0 73 73 66 75 6c 20 68 6f 74 2d 6a 6f 75 72 6e 61  ssful hot-journa
14400 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69  l rollback, it i
14410 73 20 63 61 6c 6c 65 64 20 77 69 74 68 0a 20 20  s called with.  
14420 2a 2a 20 20 20 20 20 20 65 53 74 61 74 65 3d 3d  **      eState==
14430 50 41 47 45 52 5f 4e 4f 4e 45 20 61 6e 64 20 65  PAGER_NONE and e
14440 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
14450 4c 4f 43 4b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  LOCK..  **.  ** 
14460 20 20 32 2e 20 49 66 20 61 20 63 6f 6e 6e 65 63    2. If a connec
14470 74 69 6f 6e 20 77 69 74 68 20 6c 6f 63 6b 69 6e  tion with lockin
14480 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65  g_mode=exclusive
14490 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c   holding an EXCL
144a0 55 53 49 56 45 20 0a 20 20 2a 2a 20 20 20 20 20  USIVE .  **     
144b0 20 6c 6f 63 6b 20 73 77 69 74 63 68 65 73 20 62   lock switches b
144c0 61 63 6b 20 74 6f 20 6c 6f 63 6b 69 6e 67 5f 6d  ack to locking_m
144d0 6f 64 65 3d 6e 6f 72 6d 61 6c 20 61 6e 64 20 74  ode=normal and t
144e0 68 65 6e 20 65 78 65 63 75 74 65 73 20 61 0a 20  hen executes a. 
144f0 20 2a 2a 20 20 20 20 20 20 72 65 61 64 2d 74 72   **      read-tr
14500 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20  ansaction, this 
14510 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
14520 65 64 20 77 69 74 68 20 65 53 74 61 74 65 3d 3d  ed with eState==
14530 50 41 47 45 52 5f 52 45 41 44 45 52 20 0a 20 20  PAGER_READER .  
14540 2a 2a 20 20 20 20 20 20 61 6e 64 20 65 4c 6f 63  **      and eLoc
14550 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
14560 4b 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 2d  K when the read-
14570 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
14580 6c 6f 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  losed..  */.  as
14590 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
145a0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
145b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
145c0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
145d0 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69  GER_ERROR );.  i
145e0 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
145f0 65 3c 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  e<PAGER_WRITER_L
14600 4f 43 4b 45 44 20 26 26 20 70 50 61 67 65 72 2d  OCKED && pPager-
14610 3e 65 4c 6f 63 6b 3c 52 45 53 45 52 56 45 44 5f  >eLock<RESERVED_
14620 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  LOCK ){.    retu
14630 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
14640 7d 0a 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53  }..  releaseAllS
14650 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72  avepoints(pPager
14660 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
14670 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
14680 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a   || pPager->pInJ
14690 6f 75 72 6e 61 6c 3d 3d 30 20 0a 20 20 20 20 20  ournal==0 .     
146a0 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
146b0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
146c0 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26  ics(pPager->fd)&
146d0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41 54  SQLITE_IOCAP_BAT
146e0 43 48 5f 41 54 4f 4d 49 43 29 0a 20 20 29 3b 0a  CH_ATOMIC).  );.
146f0 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
14700 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
14710 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
14720 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
14730 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a  ..    /* Finaliz
14740 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
14750 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  le. */.    if( s
14760 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49  qlite3JournalIsI
14770 6e 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e  nMemory(pPager->
14780 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  jfd) ){.      /*
14790 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
147a0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
147b0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
147c0 4d 45 4d 4f 52 59 20 29 3b 20 2a 2f 0a 20 20 20  MEMORY ); */.   
147d0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
147e0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
147f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
14800 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
14810 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
14820 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b  MODE_TRUNCATE ){
14830 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
14840 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
14850 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
14860 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
14870 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14880 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
14890 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
148a0 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  jfd, 0);.       
148b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
148c0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 66 75  OK && pPager->fu
148d0 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  llSync ){.      
148e0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
148f0 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 73 69   the new file si
14900 7a 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ze is written in
14910 74 6f 20 74 68 65 20 69 6e 6f 64 65 20 72 69 67  to the inode rig
14920 68 74 20 61 77 61 79 2e 0a 20 20 20 20 20 20 20  ht away..       
14930 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20     ** Otherwise 
14940 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
14950 74 20 72 65 73 75 72 72 65 63 74 20 66 6f 6c 6c  t resurrect foll
14960 6f 77 69 6e 67 20 61 20 70 6f 77 65 72 20 6c 6f  owing a power lo
14970 73 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20 20  ss and.         
14980 20 2a 2a 20 63 61 75 73 65 20 74 68 65 20 6c 61   ** cause the la
14990 73 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  st transaction t
149a0 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20 53 65  o roll back.  Se
149b0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68  e.          ** h
149c0 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e  ttps://bugzilla.
149d0 6d 6f 7a 69 6c 6c 61 2e 6f 72 67 2f 73 68 6f 77  mozilla.org/show
149e0 5f 62 75 67 2e 63 67 69 3f 69 64 3d 31 30 37 32  _bug.cgi?id=1072
149f0 37 37 33 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  773.          */
14a00 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
14a10 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
14a20 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
14a30 72 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20  r->syncFlags);. 
14a40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14a50 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
14a60 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
14a70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
14a80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
14a90 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
14aa0 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20  ODE_PERSIST.    
14ab0 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78    || (pPager->ex
14ac0 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70  clusiveMode && p
14ad0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
14ae0 64 65 3c 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  de<PAGER_JOURNAL
14af0 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20 20 29 7b  MODE_WAL).    ){
14b00 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72 6f  .      rc = zero
14b10 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
14b20 72 2c 20 68 61 73 4d 61 73 74 65 72 7c 7c 70 50  r, hasMaster||pP
14b30 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b  ager->tempFile);
14b40 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
14b50 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
14b60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14b70 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 6d  /* This branch m
14b80 61 79 20 62 65 20 65 78 65 63 75 74 65 64 20 77  ay be executed w
14b90 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ith Pager.journa
14ba0 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20 69 66  lMode==MEMORY if
14bb0 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f 74 2d  .      ** a hot-
14bc0 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75 73 74  journal was just
14bd0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 6e   rolled back. In
14be0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a   this case the j
14bf0 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
14c00 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 63  file should be c
14c10 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65  losed and delete
14c20 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e 6e 65  d. If this conne
14c30 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74 6f 0a  ction writes to.
14c40 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
14c50 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20 77  abase file, it w
14c60 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e 67 20  ill do so using 
14c70 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
14c80 72 6e 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  rnal..      */. 
14c90 20 20 20 20 20 69 6e 74 20 62 44 65 6c 65 74 65       int bDelete
14ca0 20 3d 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70   = !pPager->temp
14cb0 46 69 6c 65 3b 0a 20 20 20 20 20 20 61 73 73 65  File;.      asse
14cc0 72 74 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  rt( sqlite3Journ
14cd0 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61  alIsInMemory(pPa
14ce0 67 65 72 2d 3e 6a 66 64 29 3d 3d 30 20 29 3b 0a  ger->jfd)==0 );.
14cf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
14d00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
14d10 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
14d20 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20 20 20  MODE_DELETE .   
14d30 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65          || pPage
14d40 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
14d50 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
14d60 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20 20 20  E_MEMORY .      
14d70 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e       || pPager->
14d80 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
14d90 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
14da0 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  AL.           ||
14db0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14dc0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
14dd0 4e 41 4c 4d 4f 44 45 5f 57 41 4c 32 0a 20 20 20  NALMODE_WAL2.   
14de0 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69     );.      sqli
14df0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
14e00 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69  r->jfd);.      i
14e10 66 28 20 62 44 65 6c 65 74 65 20 29 7b 0a 20 20  f( bDelete ){.  
14e20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14e30 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
14e40 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
14e50 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
14e60 72 2d 3e 65 78 74 72 61 53 79 6e 63 29 3b 0a 20  r->extraSync);. 
14e70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
14e80 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
14e90 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 73 71  CHECK_PAGES.  sq
14ea0 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61  lite3PcacheItera
14eb0 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e  teDirty(pPager->
14ec0 70 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f 73  pPCache, pager_s
14ed0 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 20 20  et_pagehash);.  
14ee0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
14ef0 7a 65 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33  ze==0 && sqlite3
14f00 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
14f10 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e  Pager->pPCache)>
14f20 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  0 ){.    PgHdr *
14f30 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
14f40 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31  Lookup(pPager, 1
14f50 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  );.    if( p ){.
14f60 20 20 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73        p->pageHas
14f70 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  h = 0;.      sql
14f80 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f  ite3PagerUnrefNo
14f90 74 4e 75 6c 6c 28 70 29 3b 0a 20 20 20 20 7d 0a  tNull(p);.    }.
14fa0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71    }.#endif..  sq
14fb0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
14fc0 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
14fd0 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72  urnal);.  pPager
14fe0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
14ff0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  ;.  pPager->nRec
15000 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d   = 0;.  if( rc==
15010 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15020 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70 61   if( MEMDB || pa
15030 67 65 72 46 6c 75 73 68 4f 6e 43 6f 6d 6d 69 74  gerFlushOnCommit
15040 28 70 50 61 67 65 72 2c 20 62 43 6f 6d 6d 69 74  (pPager, bCommit
15050 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
15060 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
15070 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
15080 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
15090 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
150a0 65 43 6c 65 61 72 57 72 69 74 61 62 6c 65 28 70  eClearWritable(p
150b0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
150c0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
150d0 65 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65  e3PcacheTruncate
150e0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
150f0 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
15100 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61  );.  }..  if( pa
15110 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
15120 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70  ) ){.    /* Drop
15130 20 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d 6c   the WAL write-l
15140 6f 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73  ock, if any. Als
15150 6f 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63  o, if the connec
15160 74 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20 20  tion was in .   
15170 20 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   ** locking_mode
15180 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20  =exclusive mode 
15190 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  but is no longer
151a0 2c 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c 55  , drop the EXCLU
151b0 53 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63  SIVE .    ** loc
151c0 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  k held on the da
151d0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
151e0 20 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73 71   */.    rc2 = sq
151f0 6c 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65  lite3WalEndWrite
15200 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  Transaction(pPag
15210 65 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61  er->pWal);.    a
15220 73 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49  ssert( rc2==SQLI
15230 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c 73 65  TE_OK );.  }else
15240 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15250 4f 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26 26  OK && bCommit &&
15260 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
15270 69 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 53 69  ize>pPager->dbSi
15280 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  ze ){.    /* Thi
15290 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
152a0 6e 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  n when committin
152b0 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  g a transaction 
152c0 69 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72  in rollback-jour
152d0 6e 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20  nal.    ** mode 
152e0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
152f0 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
15300 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
15310 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a  database image..
15320 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70      ** At this p
15330 6f 69 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  oint the journal
15340 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69   has been finali
15350 7a 65 64 20 61 6e 64 20 74 68 65 20 74 72 61 6e  zed and the tran
15360 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20  saction .    ** 
15370 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d  successfully com
15380 6d 69 74 74 65 64 2c 20 62 75 74 20 74 68 65 20  mitted, but the 
15390 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69  EXCLUSIVE lock i
153a0 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20  s still held on 
153b0 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e  the.    ** file.
153c0 20 53 6f 20 69 74 20 69 73 20 73 61 66 65 20 74   So it is safe t
153d0 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 64  o truncate the d
153e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
153f0 69 74 73 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20  its minimum.    
15400 2a 2a 20 72 65 71 75 69 72 65 64 20 73 69 7a 65  ** required size
15410 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
15420 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d  ( pPager->eLock=
15430 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
15440 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
15450 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
15460 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  r, pPager->dbSiz
15470 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  e);.  }..  if( r
15480 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
15490 62 43 6f 6d 6d 69 74 20 26 26 20 69 73 4f 70 65  bCommit && isOpe
154a0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
154b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
154c0 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  3OsFileControl(p
154d0 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54  Pager->fd, SQLIT
154e0 45 5f 46 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 50  E_FCNTL_COMMIT_P
154f0 48 41 53 45 54 57 4f 2c 20 30 29 3b 0a 20 20 20  HASETWO, 0);.   
15500 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15510 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20  NOTFOUND ) rc = 
15520 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
15530 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
15540 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20  xclusiveMode .  
15550 20 26 26 20 28 21 70 61 67 65 72 55 73 65 57 61   && (!pagerUseWa
15560 6c 28 70 50 61 67 65 72 29 20 7c 7c 20 73 71 6c  l(pPager) || sql
15570 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65  ite3WalExclusive
15580 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61  Mode(pPager->pWa
15590 6c 2c 20 30 29 29 0a 20 20 29 7b 0a 20 20 20 20  l, 0)).  ){.    
155a0 72 63 32 20 3d 20 70 61 67 65 72 55 6e 6c 6f 63  rc2 = pagerUnloc
155b0 6b 44 62 28 70 50 61 67 65 72 2c 20 53 48 41 52  kDb(pPager, SHAR
155c0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50  ED_LOCK);.    pP
155d0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
155e0 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  tDone = 0;.  }. 
155f0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
15600 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a  = PAGER_READER;.
15610 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
15620 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75  ter = 0;..  retu
15630 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rn (rc==SQLITE_O
15640 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a  K?rc2:rc);.}../*
15650 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f  .** Execute a ro
15660 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e  llback if a tran
15670 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
15680 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  e and unlock the
15690 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69   .** database fi
156a0 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  le. .**.** If th
156b0 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65  e pager has alre
156c0 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
156d0 45 52 52 4f 52 20 73 74 61 74 65 2c 20 64 6f 20  ERROR state, do 
156e0 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20  not attempt .** 
156f0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20  the rollback at 
15700 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74 65  this time. Inste
15710 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  ad, pager_unlock
15720 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68  () is called. Th
15730 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67  e.** call to pag
15740 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c  er_unlock() will
15750 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d   discard all in-
15760 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75 6e  memory pages, un
15770 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74 61  lock.** the data
15780 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 6f  base file and mo
15790 76 65 20 74 68 65 20 70 61 67 65 72 20 62 61 63  ve the pager bac
157a0 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2e  k to OPEN state.
157b0 20 49 66 20 74 68 69 73 20 0a 2a 2a 20 6d 65 61   If this .** mea
157c0 6e 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ns that there is
157d0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c   a hot-journal l
157e0 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  eft in the file-
157f0 73 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74  system, the next
15800 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   .** connection 
15810 74 6f 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72  to obtain a shar
15820 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70  ed lock on the p
15830 61 67 65 72 20 28 77 68 69 63 68 20 6d 61 79 20  ager (which may 
15840 62 65 20 74 68 69 73 20 6f 6e 65 29 20 0a 2a 2a  be this one) .**
15850 20 77 69 6c 6c 20 72 6f 6c 6c 20 69 74 20 62 61   will roll it ba
15860 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
15870 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74 20 61   pager has not a
15880 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74  lready entered t
15890 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c 20  he ERROR state, 
158a0 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20  but an IO or.** 
158b0 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63  malloc error occ
158c0 75 72 73 20 64 75 72 69 6e 67 20 61 20 72 6f 6c  urs during a rol
158d0 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 69 73  lback, then this
158e0 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63 61 75   will itself cau
158f0 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 72  se .** the pager
15900 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52   to enter the ER
15910 52 4f 52 20 73 74 61 74 65 2e 20 57 68 69 63 68  ROR state. Which
15920 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64   will be cleared
15930 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20   by the.** call 
15940 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  to pager_unlock(
15950 29 2c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ), as described 
15960 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  above..*/.static
15970 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63   void pagerUnloc
15980 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67  kAndRollback(Pag
15990 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
159a0 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
159b0 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26  e!=PAGER_ERROR &
159c0 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  & pPager->eState
159d0 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a  !=PAGER_OPEN ){.
159e0 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65      assert( asse
159f0 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
15a00 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 69 66  Pager) );.    if
15a10 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
15a20 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  >=PAGER_WRITER_L
15a30 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 20 20 73  OCKED ){.      s
15a40 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
15a50 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
15a60 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
15a70 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
15a80 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
15a90 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
15aa0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50     }else if( !pP
15ab0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
15ac0 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ode ){.      ass
15ad0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
15ae0 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44 45  ate==PAGER_READE
15af0 52 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72  R );.      pager
15b00 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
15b10 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a  (pPager, 0, 0);.
15b20 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65      }.  }.  page
15b30 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
15b40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
15b50 65 74 65 72 20 61 44 61 74 61 20 6d 75 73 74 20  eter aData must 
15b60 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
15b70 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67  r of pPager->pag
15b80 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f  eSize bytes.** o
15b90 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20  f data. Compute 
15ba0 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65  and return a che
15bb0 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20  cksum based ont 
15bc0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
15bd0 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20  the .** page of 
15be0 64 61 74 61 20 61 6e 64 20 74 68 65 20 63 75 72  data and the cur
15bf0 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50  rent value of pP
15c00 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e  ager->cksumInit.
15c10 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
15c20 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73  ot a real checks
15c30 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79  um. It is really
15c40 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66   just the sum of
15c50 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20   the .** random 
15c60 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70  initial value (p
15c70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
15c80 29 20 61 6e 64 20 65 76 65 72 79 20 32 30 30 74  ) and every 200t
15c90 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65  h byte.** of the
15ca0 20 70 61 67 65 20 64 61 74 61 2c 20 73 74 61 72   page data, star
15cb0 74 69 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f  ting with byte o
15cc0 66 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70  ffset (pPager->p
15cd0 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a  ageSize%200)..**
15ce0 20 45 61 63 68 20 62 79 74 65 20 69 73 20 69 6e   Each byte is in
15cf0 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 20  terpreted as an 
15d00 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69  8-bit unsigned i
15d10 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68  nteger..**.** Ch
15d20 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75  anging the formu
15d30 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  la used to compu
15d40 74 65 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d  te this checksum
15d50 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a   results in an.*
15d60 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a  * incompatible j
15d70 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
15d80 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75  at..**.** If jou
15d90 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20  rnal corruption 
15da0 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20  occurs due to a 
15db0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74  power failure, t
15dc0 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a  he most likely .
15dd0 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74  ** scenario is t
15de0 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74  hat one end or t
15df0 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
15e00 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63  record will be c
15e10 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69  hanged. .** It i
15e20 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65  s much less like
15e30 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20  ly that the two 
15e40 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ends of the jour
15e50 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  nal record will 
15e60 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e  be.** correct an
15e70 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20  d the middle be 
15e80 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20  corrupt.  Thus, 
15e90 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20  this "checksum" 
15ea0 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67  scheme,.** thoug
15eb0 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c  h fast and simpl
15ec0 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d  e, catches the m
15ed0 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e  ostly likely kin
15ee0 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d of corruption.
15ef0 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
15f00 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72  ager_cksum(Pager
15f10 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
15f20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33  u8 *aData){.  u3
15f30 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72  2 cksum = pPager
15f40 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20  ->cksumInit;    
15f50 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
15f60 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   value to return
15f70 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50   */.  int i = pP
15f80 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32  ager->pageSize-2
15f90 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  00;          /* 
15fa0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
15fb0 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a    while( i>0 ){.
15fc0 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61      cksum += aDa
15fd0 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20  ta[i];.    i -= 
15fe0 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  200;.  }.  retur
15ff0 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a  n cksum;.}../*.*
16000 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75 72  * Report the cur
16010 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20 61  rent page size a
16020 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  nd number of res
16030 65 72 76 65 64 20 62 79 74 65 73 20 62 61 63 6b  erved bytes back
16040 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65 63  .** to the codec
16050 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
16060 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74 61  TE_HAS_CODEC.sta
16070 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52 65  tic void pagerRe
16080 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20 2a  portSize(Pager *
16090 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
160a0 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a  Pager->xCodecSiz
160b0 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50 61  eChng ){.    pPa
160c0 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43  ger->xCodecSizeC
160d0 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f 64  hng(pPager->pCod
160e0 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ec, pPager->page
160f0 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
16100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16110 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e 52   (int)pPager->nR
16120 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a 23  eserve);.  }.}.#
16130 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
16140 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58 29  gerReportSize(X)
16150 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69 66       /* No-op if
16160 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f   we do not suppo
16170 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23 65  rt a codec */.#e
16180 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
16190 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a  ITE_HAS_CODEC./*
161a0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
161b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
161c0 72 76 65 64 20 62 69 74 73 20 69 73 20 74 68 65  rved bits is the
161d0 20 73 61 6d 65 20 69 6e 20 74 68 65 20 64 65 73   same in the des
161e0 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 70 61 67 65  tination.** page
161f0 72 20 61 73 20 69 74 20 69 73 20 69 6e 20 74 68  r as it is in th
16200 65 20 73 6f 75 72 63 65 2e 20 20 54 68 69 73 20  e source.  This 
16210 63 6f 6d 65 73 20 75 70 20 77 68 65 6e 20 61 20  comes up when a 
16220 56 41 43 55 55 4d 20 63 68 61 6e 67 65 73 20 74  VACUUM changes t
16230 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
16240 72 65 73 65 72 76 65 64 20 62 69 74 73 20 74 6f  reserved bits to
16250 20 74 68 65 20 22 6f 70 74 69 6d 61 6c 22 20 61   the "optimal" a
16260 6d 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  mount..*/.void s
16270 71 6c 69 74 65 33 50 61 67 65 72 41 6c 69 67 6e  qlite3PagerAlign
16280 52 65 73 65 72 76 65 28 50 61 67 65 72 20 2a 70  Reserve(Pager *p
16290 44 65 73 74 2c 20 50 61 67 65 72 20 2a 70 53 72  Dest, Pager *pSr
162a0 63 29 7b 0a 20 20 69 66 28 20 70 44 65 73 74 2d  c){.  if( pDest-
162b0 3e 6e 52 65 73 65 72 76 65 21 3d 70 53 72 63 2d  >nReserve!=pSrc-
162c0 3e 6e 52 65 73 65 72 76 65 20 29 7b 0a 20 20 20  >nReserve ){.   
162d0 20 70 44 65 73 74 2d 3e 6e 52 65 73 65 72 76 65   pDest->nReserve
162e0 20 3d 20 70 53 72 63 2d 3e 6e 52 65 73 65 72 76   = pSrc->nReserv
162f0 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70 6f  e;.    pagerRepo
16300 72 74 53 69 7a 65 28 70 44 65 73 74 29 3b 0a 20  rtSize(pDest);. 
16310 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
16320 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  ** Read a single
16330 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65   page from eithe
16340 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  r the journal fi
16350 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e  le (if isMainJrn
16360 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d  l==1) or.** from
16370 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
16380 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d   (if isMainJrnl=
16390 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b  =0) and playback
163a0 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54   that page..** T
163b0 68 65 20 70 61 67 65 20 62 65 67 69 6e 73 20 61  he page begins a
163c0 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65  t offset *pOffse
163d0 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  t into the file.
163e0 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a   The *pOffset.**
163f0 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61   value is increa
16400 73 65 64 20 74 6f 20 74 68 65 20 73 74 61 72 74  sed to the start
16410 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
16420 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
16430 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e  ..**.** The main
16440 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
16450 6c 20 75 73 65 73 20 63 68 65 63 6b 73 75 6d 73  l uses checksums
16460 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74   - the statement
16470 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 0a 2a   journal does .*
16480 2a 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  * not..**.** If 
16490 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
164a0 6f 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f  of the page reco
164b0 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  rd read from the
164c0 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
164d0 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65  ile.** is greate
164e0 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
164f0 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  nt value of Page
16500 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70  r.dbSize, then p
16510 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b  layback is.** sk
16520 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45  ipped and SQLITE
16530 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
16540 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20  .**.** If pDone 
16550 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
16560 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f 72 64  n it is a record
16570 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68   of pages that h
16580 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62  ave already.** b
16590 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e  een played back.
165a0 20 20 49 66 20 74 68 65 20 70 61 67 65 20 61 74    If the page at
165b0 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c   *pOffset has al
165c0 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65  ready been playe
165d0 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68  d back.** (if th
165e0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
165f0 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74  pDone bit is set
16600 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20  ) then skip the 
16610 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b  playback..** Mak
16620 65 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65  e sure the pDone
16630 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69   bit correspondi
16640 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73  ng to the *pOffs
16650 65 74 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a  et page is set.*
16660 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72  * prior to retur
16670 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ning..**.** If t
16680 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 69  he page record i
16690 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72  s successfully r
166a0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ead from the (su
166b0 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  b-)journal file.
166c0 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61  ** and played ba
166d0 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  ck, then SQLITE_
166e0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
166f0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
16700 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72  ccurs.** while r
16710 65 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72  eading the recor
16720 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
16730 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72  )journal file or
16740 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a   while writing.*
16750 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
16760 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65  e file, then the
16770 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
16780 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64  s returned. If d
16790 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73  ata.** is succes
167a0 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  sfully read from
167b0 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
167c0 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70 65  al file but appe
167d0 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72  ars to be.** cor
167e0 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
167f0 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
16800 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65   Data is conside
16810 72 65 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e  red corrupted in
16820 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74  .** two circumst
16830 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20  ances:.** .**   
16840 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
16850 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69  page-number is i
16860 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47  llegal (0 or PAG
16870 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a  ER_MJ_PGNO), or.
16880 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65  **   * If the re
16890 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f  cord is being ro
168a0 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  lled back from t
168b0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
168c0 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20  file.**     and 
168d0 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65  the checksum fie
168e0 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ld does not matc
168f0 68 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e  h the record con
16900 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74  tent..**.** Neit
16910 68 65 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f  her of these two
16920 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70   scenarios are p
16930 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61  ossible during a
16940 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
16950 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
16960 69 73 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e  is is a savepoin
16970 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  t rollback, then
16980 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65   memory may have
16990 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c   to be dynamical
169a0 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  ly.** allocated 
169b0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
169c0 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
169d0 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c   case and an all
169e0 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a  ocation fails,.*
169f0 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
16a00 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
16a10 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
16a20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
16a30 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
16a40 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
16a50 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
16a60 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63  being played bac
16a70 6b 20 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66  k */.  i64 *pOff
16a80 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  set,            
16a90 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
16aa0 66 20 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79  f record to play
16ab0 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63  back */.  Bitvec
16ac0 20 2a 70 44 6f 6e 65 2c 20 20 20 20 20 20 20 20   *pDone,        
16ad0 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65          /* Bitve
16ae0 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61  c of pages alrea
16af0 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a  dy played back *
16b00 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72  /.  int isMainJr
16b10 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nl,             
16b20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20 6a    /* 1 -> main j
16b30 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75 62  ournal. 0 -> sub
16b40 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 69  -journal. */.  i
16b50 6e 74 20 69 73 53 61 76 65 70 6e 74 20 20 20 20  nt isSavepnt    
16b60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16b70 54 72 75 65 20 66 6f 72 20 61 20 73 61 76 65 70  True for a savep
16b80 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  oint rollback */
16b90 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
16ba0 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20  PgHdr *pPg;     
16bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16bc0 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67   An existing pag
16bd0 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a  e in the cache *
16be0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
16bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c00 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
16c10 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69  mber of a page i
16c20 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  n journal */.  u
16c30 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
16c40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16c50 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f  Checksum used fo
16c60 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  r sanity checkin
16c70 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 44 61  g */.  char *aDa
16c80 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
16c90 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
16ca0 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68  y storage for th
16cb0 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69  e page */.  sqli
16cc0 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20  te3_file *jfd;  
16cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16ce0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
16cf0 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
16d00 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69   file */.  int i
16d10 73 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20  sSynced;        
16d20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
16d30 20 69 66 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65   if journal page
16d40 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 23 69   is synced */.#i
16d50 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
16d60 43 4f 44 45 43 0a 20 20 2f 2a 20 54 68 65 20 6a  CODEC.  /* The j
16d70 72 6e 6c 45 6e 63 20 66 6c 61 67 20 69 73 20 74  rnlEnc flag is t
16d80 72 75 65 20 69 66 20 4a 6f 75 72 6e 61 6c 20 70  rue if Journal p
16d90 61 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20 70  ages should be p
16da0 61 73 73 65 64 20 74 68 72 6f 75 67 68 0a 20 20  assed through.  
16db0 2a 2a 20 74 68 65 20 63 6f 64 65 63 2e 20 20 49  ** the codec.  I
16dc0 74 20 69 73 20 66 61 6c 73 65 20 66 6f 72 20 70  t is false for p
16dd0 75 72 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f  ure in-memory jo
16de0 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20 63 6f 6e  urnals. */.  con
16df0 73 74 20 69 6e 74 20 6a 72 6e 6c 45 6e 63 20 3d  st int jrnlEnc =
16e00 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20   (isMainJrnl || 
16e10 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65  pPager->subjInMe
16e20 6d 6f 72 79 3d 3d 30 29 3b 0a 23 65 6e 64 69 66  mory==0);.#endif
16e30 0a 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 4d  ..  assert( (isM
16e40 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29  ainJrnl&~1)==0 )
16e50 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e  ;      /* isMain
16e60 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a  Jrnl is 0 or 1 *
16e70 2f 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 53  /.  assert( (isS
16e80 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b  avepnt&~1)==0 );
16e90 20 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65         /* isSave
16ea0 70 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f  pnt is 0 or 1 */
16eb0 0a 20 20 61 73 73 65 72 74 28 20 69 73 4d 61 69  .  assert( isMai
16ec0 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29  nJrnl || pDone )
16ed0 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61  ;     /* pDone a
16ee0 6c 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75  lways used on su
16ef0 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20  b-journals */.  
16f00 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e  assert( isSavepn
16f10 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b  t || pDone==0 );
16f20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65     /* pDone neve
16f30 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61  r used on non-sa
16f40 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44  vepoint */..  aD
16f50 61 74 61 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ata = pPager->pT
16f60 6d 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72  mpSpace;.  asser
16f70 74 28 20 61 44 61 74 61 20 29 3b 20 20 20 20 20  t( aData );     
16f80 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
16f90 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c  age must have al
16fa0 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
16fb0 61 74 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  ated */.  assert
16fc0 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50  ( pagerUseWal(pP
16fd0 61 67 65 72 29 3d 3d 30 20 7c 7c 20 28 21 69 73  ager)==0 || (!is
16fe0 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 69 73 53 61  MainJrnl && isSa
16ff0 76 65 70 6e 74 29 20 29 3b 0a 0a 20 20 2f 2a 20  vepnt) );..  /* 
17000 45 69 74 68 65 72 20 74 68 65 20 73 74 61 74 65  Either the state
17010 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
17020 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41   PAGER_WRITER_CA
17030 43 48 45 4d 4f 44 20 28 61 20 74 72 61 6e 73 61  CHEMOD (a transa
17040 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 72 20 73  ction .  ** or s
17050 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
17060 6b 20 64 6f 6e 65 20 61 74 20 74 68 65 20 72 65  k done at the re
17070 71 75 65 73 74 20 6f 66 20 74 68 65 20 63 61 6c  quest of the cal
17080 6c 65 72 29 20 6f 72 20 74 68 69 73 20 69 73 0a  ler) or this is.
17090 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e    ** a hot-journ
170a0 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 66 20  al rollback. If 
170b0 69 74 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72  it is a hot-jour
170c0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  nal rollback, th
170d0 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 69 73 20  e pager.  ** is 
170e0 69 6e 20 73 74 61 74 65 20 4f 50 45 4e 20 61 6e  in state OPEN an
170f0 64 20 68 6f 6c 64 73 20 61 6e 20 45 58 43 4c 55  d holds an EXCLU
17100 53 49 56 45 20 6c 6f 63 6b 2e 20 48 6f 74 2d 6a  SIVE lock. Hot-j
17110 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 0a  ournal rollback.
17120 20 20 2a 2a 20 6f 6e 6c 79 20 72 65 61 64 73 20    ** only reads 
17130 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
17140 75 72 6e 61 6c 2c 20 6e 6f 74 20 74 68 65 20 73  urnal, not the s
17150 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  ub-journal..  */
17160 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
17170 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
17180 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
17190 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67  .       || (pPag
171a0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
171b0 52 5f 4f 50 45 4e 20 26 26 20 70 50 61 67 65 72  R_OPEN && pPager
171c0 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ->eLock==EXCLUSI
171d0 56 45 5f 4c 4f 43 4b 29 0a 20 20 29 3b 0a 20 20  VE_LOCK).  );.  
171e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
171f0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
17200 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20 7c 7c  ITER_CACHEMOD ||
17210 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 3b 0a 0a   isMainJrnl );..
17220 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61    /* Read the pa
17230 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61  ge number and pa
17240 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ge data from the
17250 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d   journal or sub-
17260 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
17270 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  e. Return an err
17280 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63  or code to the c
17290 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65  aller if an IO e
172a0 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a  rror occurs..  *
172b0 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e  /.  jfd = isMain
172c0 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a  Jrnl ? pPager->j
172d0 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66  fd : pPager->sjf
172e0 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  d;.  rc = read32
172f0 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73  bits(jfd, *pOffs
17300 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66  et, &pgno);.  if
17310 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17320 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
17330 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
17340 64 28 6a 66 64 2c 20 28 75 38 2a 29 61 44 61 74  d(jfd, (u8*)aDat
17350 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
17360 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b  ize, (*pOffset)+
17370 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
17380 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
17390 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20   rc;.  *pOffset 
173a0 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
173b0 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e  ize + 4 + isMain
173c0 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61  Jrnl*4;..  /* Sa
173d0 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
173e0 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73   the page.  This
173f0 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61   is more importa
17400 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e  nt that I origin
17410 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68  ally.  ** though
17420 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66  t.  If a power f
17430 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
17440 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
17450 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
17460 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20  ,.  ** it could 
17470 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61  cause invalid da
17480 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ta to be written
17490 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
174a0 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20  l.  We need to. 
174b0 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20   ** detect this 
174c0 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69  invalid data (wi
174d0 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c  th high probabil
174e0 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20  ity) and ignore 
174f0 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  it..  */.  if( p
17500 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
17510 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
17520 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73  ager) ){.    ass
17530 65 72 74 28 20 21 69 73 53 61 76 65 70 6e 74 20  ert( !isSavepnt 
17540 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
17550 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
17560 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29   if( pgno>(Pgno)
17570 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c  pPager->dbSize |
17580 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  | sqlite3BitvecT
17590 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29  est(pDone, pgno)
175a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
175b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
175c0 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29  if( isMainJrnl )
175d0 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33  {.    rc = read3
175e0 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66  2bits(jfd, (*pOf
175f0 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29  fset)-4, &cksum)
17600 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
17610 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66  eturn rc;.    if
17620 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20  ( !isSavepnt && 
17630 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
17640 65 72 2c 20 28 75 38 2a 29 61 44 61 74 61 29 21  er, (u8*)aData)!
17650 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20  =cksum ){.      
17660 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
17670 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
17680 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65   /* If this page
17690 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
176a0 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 62 65  n played back be
176b0 66 6f 72 65 20 64 75 72 69 6e 67 20 74 68 65 20  fore during the 
176c0 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c  current.  ** rol
176d0 6c 62 61 63 6b 2c 20 74 68 65 6e 20 64 6f 6e 27  lback, then don'
176e0 74 20 62 6f 74 68 65 72 20 74 6f 20 70 6c 61 79  t bother to play
176f0 20 69 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a   it back again..
17700 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 6f 6e 65    */.  if( pDone
17710 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65   && (rc = sqlite
17720 33 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65  3BitvecSet(pDone
17730 2c 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45  , pgno))!=SQLITE
17740 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
17750 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
17760 57 68 65 6e 20 70 6c 61 79 69 6e 67 20 62 61 63  When playing bac
17770 6b 20 70 61 67 65 20 31 2c 20 72 65 73 74 6f 72  k page 1, restor
17780 65 20 74 68 65 20 6e 52 65 73 65 72 76 65 20 73  e the nReserve s
17790 65 74 74 69 6e 67 0a 20 20 2a 2f 0a 20 20 69 66  etting.  */.  if
177a0 28 20 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61  ( pgno==1 && pPa
177b0 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 21 3d 28  ger->nReserve!=(
177c0 28 75 38 2a 29 61 44 61 74 61 29 5b 32 30 5d 20  (u8*)aData)[20] 
177d0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
177e0 52 65 73 65 72 76 65 20 3d 20 28 28 75 38 2a 29  Reserve = ((u8*)
177f0 61 44 61 74 61 29 5b 32 30 5d 3b 0a 20 20 20 20  aData)[20];.    
17800 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
17810 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
17820 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
17830 69 73 20 69 6e 20 43 41 43 48 45 4d 4f 44 20 73  is in CACHEMOD s
17840 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65  tate, then there
17850 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20   must be a copy 
17860 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67  of this.  ** pag
17870 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
17880 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61  ache. In this ca
17890 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74  se just update t
178a0 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a  he pager cache,.
178b0 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74    ** not the dat
178c0 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
178d0 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72  page is left mar
178e0 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69  ked dirty in thi
178f0 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s case..  **.  *
17900 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74  * An exception t
17910 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65  o the above rule
17920 3a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  : If the databas
17930 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  e is in no-sync 
17940 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20  mode.  ** and a 
17950 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75  page is moved du
17960 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ring an incremen
17970 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20  tal vacuum then 
17980 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a  the page may.  *
17990 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  * not be in the 
179a0 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74  pager cache. Lat
179b0 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  er: if a malloc(
179c0 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63  ) or IO error oc
179d0 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67  curs.  ** during
179e0 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61   a Movepage() ca
179f0 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ll, then the pag
17a00 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20  e may not be in 
17a10 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65  the cache.  ** e
17a20 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f  ither. So the co
17a30 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ndition describe
17a40 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70  d in the above p
17a50 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a  aragraph is not.
17a60 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c    ** assert()abl
17a70 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e..  **.  ** If 
17a80 69 6e 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 2c  in WRITER_DBMOD,
17a90 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44   WRITER_FINISHED
17aa0 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   or OPEN state, 
17ab0 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74  then we update t
17ac0 68 65 0a 20 20 2a 2a 20 70 61 67 65 72 20 63 61  he.  ** pager ca
17ad0 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73  che if it exists
17ae0 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69   and the main fi
17af0 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
17b00 74 68 65 6e 20 6d 61 72 6b 65 64 20 0a 20 20 2a  then marked .  *
17b10 2a 20 6e 6f 74 20 64 69 72 74 79 2e 20 53 69 6e  * not dirty. Sin
17b20 63 65 20 74 68 69 73 20 63 6f 64 65 20 69 73 20  ce this code is 
17b30 6f 6e 6c 79 20 65 78 65 63 75 74 65 64 20 69 6e  only executed in
17b40 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74 61 74   PAGER_OPEN stat
17b50 65 20 66 6f 72 0a 20 20 2a 2a 20 61 20 68 6f 74  e for.  ** a hot
17b60 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
17b70 6b 2c 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  k, it is guarant
17b80 65 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  eed that the pag
17b90 65 2d 63 61 63 68 65 20 69 73 20 65 6d 70 74 79  e-cache is empty
17ba0 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67  .  ** if the pag
17bb0 65 72 20 69 73 20 69 6e 20 4f 50 45 4e 20 73 74  er is in OPEN st
17bc0 61 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ate..  **.  ** T
17bd0 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68  icket #1171:  Th
17be0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
17bf0 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  nal might contai
17c00 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74  n page content t
17c10 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66  hat is.  ** diff
17c20 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70  erent from the p
17c30 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74  age content at t
17c40 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
17c50 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
17c60 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68  * This occurs wh
17c70 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61  en a page is cha
17c80 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nged prior to th
17c90 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61  e start of a sta
17ca0 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e  tement.  ** then
17cb0 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77   changed again w
17cc0 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
17cd0 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69  ent.  When rolli
17ce0 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20  ng back such a. 
17cf0 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65   ** statement we
17d00 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20   must not write 
17d10 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
17d20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20  database unless 
17d30 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72  we know.  ** for
17d40 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72   certain that or
17d50 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
17d60 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64 20  ents are synced 
17d70 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f  into the main ro
17d80 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
17d90 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  nal.  Otherwise,
17da0 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69   a power loss mi
17db0 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69  ght leave modifi
17dc0 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20  ed data in the. 
17dd0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
17de0 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74  e without an ent
17df0 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ry in the rollba
17e00 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  ck journal that 
17e10 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65  can.  ** restore
17e20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
17e30 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f   its original fo
17e40 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69  rm.  Two conditi
17e50 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ons must be.  **
17e60 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74   met before writ
17e70 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
17e80 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74  ase files. (1) t
17e90 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
17ea0 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e   be.  ** locked.
17eb0 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68    (2) we know th
17ec0 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
17ed0 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20  page content is 
17ee0 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a  fully synced.  *
17ef0 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * in the main jo
17f00 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63  urnal either bec
17f10 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73  ause the page is
17f20 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
17f30 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70   else.  ** the p
17f40 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
17f50 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20   needSync==0..  
17f60 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d  **.  ** 2008-04-
17f70 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70  14:  When attemp
17f80 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61  ting to vacuum a
17f90 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
17fa0 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20  e file, it.  ** 
17fb0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66  is possible to f
17fc0 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ail a statement 
17fd0 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68  on a database th
17fe0 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20  at does not yet 
17ff0 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e  exist..  ** Do n
18000 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  ot attempt to wr
18010 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65 20  ite if database 
18020 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62  file has never b
18030 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f  een opened..  */
18040 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57  .  if( pagerUseW
18050 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
18060 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c    pPg = 0;.  }el
18070 73 65 7b 0a 20 20 20 20 70 50 67 20 3d 20 73 71  se{.    pPg = sq
18080 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
18090 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
180a0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
180b0 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20  g || !MEMDB );. 
180c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
180d0 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52 5f 4f  >eState!=PAGER_O
180e0 50 45 4e 20 7c 7c 20 70 50 67 3d 3d 30 20 7c 7c  PEN || pPg==0 ||
180f0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
18100 65 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  e );.  PAGERTRAC
18110 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20  E(("PLAYBACK %d 
18120 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
18130 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  x) %s\n",.      
18140 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
18150 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
18160 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
18170 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 38  r->pageSize, (u8
18180 2a 29 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20  *)aData),.      
18190 20 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c       (isMainJrnl
181a0 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a  ?"main-journal":
181b0 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20  "sub-journal"). 
181c0 20 29 29 3b 0a 20 20 69 66 28 20 69 73 4d 61 69   ));.  if( isMai
181d0 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73 53  nJrnl ){.    isS
181e0 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e  ynced = pPager->
181f0 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66 66  noSync || (*pOff
18200 73 65 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  set <= pPager->j
18210 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 65  ournalHdr);.  }e
18220 6c 73 65 7b 0a 20 20 20 20 69 73 53 79 6e 63 65  lse{.    isSynce
18230 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30  d = (pPg==0 || 0
18240 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20  ==(pPg->flags & 
18250 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
18260 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4f  );.  }.  if( isO
18270 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a  pen(pPager->fd).
18280 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
18290 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52 49  State>=PAGER_WRI
182a0 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70 50 61  TER_DBMOD || pPa
182b0 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
182c0 45 52 5f 4f 50 45 4e 29 0a 20 20 20 26 26 20 69  ER_OPEN).   && i
182d0 73 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20  sSynced.  ){.   
182e0 20 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e   i64 ofst = (pgn
182f0 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
18300 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
18310 74 65 73 74 63 61 73 65 28 20 21 69 73 53 61 76  testcase( !isSav
18320 65 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26  epnt && pPg!=0 &
18330 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  & (pPg->flags&PG
18340 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d  HDR_NEED_SYNC)!=
18350 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
18360 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50   !pagerUseWal(pP
18370 61 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  ager) );..    /*
18380 20 57 72 69 74 65 20 74 68 65 20 64 61 74 61 20   Write the data 
18390 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
183a0 75 72 6e 61 6c 20 62 61 63 6b 20 69 6e 74 6f 20  urnal back into 
183b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
183c0 65 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  e..    ** This i
183d0 73 20 75 73 75 61 6c 6c 79 20 73 61 66 65 20 65  s usually safe e
183e0 76 65 6e 20 66 6f 72 20 61 6e 20 65 6e 63 72 79  ven for an encry
183f0 70 74 65 64 20 64 61 74 61 62 61 73 65 20 2d 20  pted database - 
18400 61 73 20 74 68 65 20 64 61 74 61 0a 20 20 20 20  as the data.    
18410 2a 2a 20 77 61 73 20 65 6e 63 72 79 70 74 65 64  ** was encrypted
18420 20 62 65 66 6f 72 65 20 69 74 20 77 61 73 20 77   before it was w
18430 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
18440 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
18450 65 78 63 65 70 74 69 6f 6e 0a 20 20 20 20 2a 2a  exception.    **
18460 20 69 73 20 69 66 20 74 68 65 20 64 61 74 61 20   is if the data 
18470 77 61 73 20 6a 75 73 74 20 72 65 61 64 20 66 72  was just read fr
18480 6f 6d 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  om an in-memory 
18490 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20  sub-journal. In 
184a0 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 61 73 65  that.    ** case
184b0 20 69 74 20 6d 75 73 74 20 62 65 20 65 6e 63 72   it must be encr
184c0 79 70 74 65 64 20 68 65 72 65 20 62 65 66 6f 72  ypted here befor
184d0 65 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 69  e it is copied i
184e0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
184f0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 20 2a  .    ** file.  *
18500 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
18510 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 69 66  HAS_CODEC.    if
18520 28 20 21 6a 72 6e 6c 45 6e 63 20 29 7b 0a 20 20  ( !jrnlEnc ){.  
18530 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
18540 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20  r, aData, pgno, 
18550 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d  7, rc=SQLITE_NOM
18560 45 4d 5f 42 4b 50 54 2c 20 61 44 61 74 61 29 3b  EM_BKPT, aData);
18570 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
18580 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
18590 72 2d 3e 66 64 2c 20 28 75 38 20 2a 29 61 44 61  r->fd, (u8 *)aDa
185a0 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
185b0 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20  Size, ofst);.   
185c0 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72     CODEC1(pPager
185d0 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33  , aData, pgno, 3
185e0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  , rc=SQLITE_NOME
185f0 4d 5f 42 4b 50 54 29 3b 0a 20 20 20 20 7d 65 6c  M_BKPT);.    }el
18600 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63  se.#endif.    rc
18610 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
18620 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75  e(pPager->fd, (u
18630 38 20 2a 29 61 44 61 74 61 2c 20 70 50 61 67 65  8 *)aData, pPage
18640 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73  r->pageSize, ofs
18650 74 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 67 6e  t);..    if( pgn
18660 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
18670 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Size ){.      pP
18680 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
18690 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20   = pgno;.    }. 
186a0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
186b0 42 61 63 6b 75 70 20 29 7b 0a 23 69 66 64 65 66  Backup ){.#ifdef
186c0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
186d0 43 0a 20 20 20 20 20 20 69 66 28 20 6a 72 6e 6c  C.      if( jrnl
186e0 45 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 43  Enc ){.        C
186f0 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 61 44  ODEC1(pPager, aD
18700 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63  ata, pgno, 3, rc
18710 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b  =SQLITE_NOMEM_BK
18720 50 54 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  PT);.        sql
18730 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
18740 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70  (pPager->pBackup
18750 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61  , pgno, (u8*)aDa
18760 74 61 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44  ta);.        COD
18770 45 43 32 28 70 50 61 67 65 72 2c 20 61 44 61 74  EC2(pPager, aDat
18780 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53  a, pgno, 7, rc=S
18790 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
187a0 2c 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d  ,aData);.      }
187b0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
187c0 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55    sqlite3BackupU
187d0 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42  pdate(pPager->pB
187e0 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38  ackup, pgno, (u8
187f0 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  *)aData);.    }.
18800 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d    }else if( !isM
18810 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d  ainJrnl && pPg==
18820 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  0 ){.    /* If t
18830 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63  his is a rollbac
18840 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74  k of a savepoint
18850 20 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f   and data was no
18860 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20  t written to.   
18870 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
18880 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
18890 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20   not in-memory, 
188a0 74 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e  there is a poten
188b0 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62  tial.    ** prob
188c0 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61  lem. When the pa
188d0 67 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68  ge is next fetch
188e0 65 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65  ed by the b-tree
188f0 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20   layer, it .    
18900 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20  ** will be read 
18910 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
18920 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61  e file, which ma
18930 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
18940 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e  .    ** current.
18950 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
18960 54 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70  There are a coup
18970 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20  le of different 
18980 77 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61  ways this can ha
18990 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75  ppen. All are qu
189a0 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75  ite.    ** obscu
189b0 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67  re. When running
189c0 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   in synchronous 
189d0 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f  mode, this can o
189e0 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20  nly happen .    
189f0 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ** if the page i
18a00 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  s on the free-li
18a10 73 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  st at the start 
18a20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
18a30 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
18a40 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20  populated, then 
18a50 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69  moved using sqli
18a60 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
18a70 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
18a80 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69  * The solution i
18a90 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d  s to add an in-m
18aa0 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68  emory page to th
18ab0 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69  e cache containi
18ac0 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  ng.    ** the da
18ad0 74 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ta just read fro
18ae0 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
18af0 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  l. Mark the page
18b00 20 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a   as dirty .    *
18b10 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67  * and if the pag
18b20 65 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f  er requires a jo
18b30 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e  urnal-sync, then
18b40 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
18b50 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  s .    ** requir
18b60 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79  ing a journal-sy
18b70 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20  nc before it is 
18b80 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a  written..    */.
18b90 20 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61      assert( isSa
18ba0 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 61 73 73  vepnt );.    ass
18bb0 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 64 6f  ert( (pPager->do
18bc0 4e 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c  NotSpill & SPILL
18bd0 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 29 3d 3d  FLAG_ROLLBACK)==
18be0 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
18bf0 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 7c 3d 20 53  >doNotSpill |= S
18c00 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
18c10 4b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  K;.    rc = sqli
18c20 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
18c30 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20  er, pgno, &pPg, 
18c40 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
18c50 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70  (pPager->doNotSp
18c60 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f  ill & SPILLFLAG_
18c70 52 4f 4c 4c 42 41 43 4b 29 21 3d 30 20 29 3b 0a  ROLLBACK)!=0 );.
18c80 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
18c90 74 53 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c  tSpill &= ~SPILL
18ca0 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  FLAG_ROLLBACK;. 
18cb0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18cc0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
18cd0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
18ce0 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
18cf0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  );.  }.  if( pPg
18d00 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
18d10 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
18d20 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
18d30 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
18d40 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
18d50 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
18d60 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
18d70 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
18d80 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
18d90 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
18da0 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
18db0 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
18dc0 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
18dd0 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
18de0 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
18df0 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
18e00 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
18e10 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
18e20 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
18e30 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
18e40 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
18e50 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74  *pData;.    pDat
18e60 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
18e70 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
18e80 2c 20 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50  , (u8*)aData, pP
18e90 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
18ea0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65  .    pPager->xRe
18eb0 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20  initer(pPg);.   
18ec0 20 2f 2a 20 49 74 20 75 73 65 64 20 74 6f 20 62   /* It used to b
18ed0 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 50 63  e that sqlite3Pc
18ee0 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50  acheMakeClean(pP
18ef0 67 29 20 77 61 73 20 63 61 6c 6c 65 64 20 68 65  g) was called he
18f00 72 65 2e 20 20 42 75 74 0a 20 20 20 20 2a 2a 20  re.  But.    ** 
18f10 74 68 61 74 20 63 61 6c 6c 20 77 61 73 20 64 61  that call was da
18f20 6e 67 65 72 6f 75 73 20 61 6e 64 20 68 61 64 20  ngerous and had 
18f30 6e 6f 20 64 65 74 65 63 74 61 62 6c 65 20 62 65  no detectable be
18f40 6e 65 66 69 74 20 73 69 6e 63 65 20 74 68 65 20  nefit since the 
18f50 63 61 63 68 65 0a 20 20 20 20 2a 2a 20 69 73 20  cache.    ** is 
18f60 6e 6f 72 6d 61 6c 6c 79 20 63 6c 65 61 6e 65 64  normally cleaned
18f70 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68   by sqlite3Pcach
18f80 65 43 6c 65 61 6e 41 6c 6c 28 29 20 61 66 74 65  eCleanAll() afte
18f90 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73  r rollback and s
18fa0 6f 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65  o.    ** has bee
18fb0 6e 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20  n removed. */.  
18fc0 20 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65    pager_set_page
18fd0 68 61 73 68 28 70 50 67 29 3b 0a 0a 20 20 20 20  hash(pPg);..    
18fe0 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70  /* If this was p
18ff0 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74  age 1, then rest
19000 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ore the value of
19010 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
19020 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69  s..    ** Do thi
19030 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63  s before any dec
19040 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66  oding. */.    if
19050 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
19060 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
19070 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
19080 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d  ((u8*)pData)[24]
19090 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  ,sizeof(pPager->
190a0 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
190b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f    }..    /* Deco
190c0 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74  de the page just
190d0 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20   read from disk 
190e0 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41  */.#if SQLITE_HA
190f0 53 5f 43 4f 44 45 43 0a 20 20 20 20 69 66 28 20  S_CODEC.    if( 
19100 6a 72 6e 6c 45 6e 63 20 29 7b 20 43 4f 44 45 43  jrnlEnc ){ CODEC
19110 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  1(pPager, pData,
19120 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72   pPg->pgno, 3, r
19130 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  c=SQLITE_NOMEM_B
19140 4b 50 54 29 3b 20 7d 0a 23 65 6e 64 69 66 0a 20  KPT); }.#endif. 
19150 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
19160 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
19170 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
19180 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
19190 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65  r zMaster is the
191a0 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
191b0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
191c0 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c  A single journal
191d0 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65  .** file that re
191e0 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61  ferred to the ma
191f0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19200 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
19210 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
19220 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
19230 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73  cks if it is pos
19240 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
19250 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
19260 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20  al file,.** and 
19270 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73  does so if it is
19280 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
19290 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69   zMaster may poi
192a0 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70  nt to Pager.pTmp
192b0 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62  Space. So that b
192c0 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a  uffer is not .**
192d0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
192e0 73 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  se within this f
192f0 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57  unction..**.** W
19300 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  hen a master jou
19310 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65  rnal file is cre
19320 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75  ated, it is popu
19330 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  lated with the n
19340 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20  ames .** of all 
19350 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75  of its child jou
19360 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72  rnals, one after
19370 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74   another, format
19380 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a  ted as utf-8 .**
19390 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54   encoded text. T
193a0 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63  he end of each c
193b0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild journal fil
193c0 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  e is marked with
193d0 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69   a .** nul-termi
193e0 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30  nator byte (0x00
193f0 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69  ). i.e. the enti
19400 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  re contents of a
19410 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
19420 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72  ** file for a tr
19430 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76  ansaction involv
19440 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65  ing two database
19450 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a  s might be:.**.*
19460 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  *   "/home/bill/
19470 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  a.db-journal\x00
19480 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d  /home/bill/b.db-
19490 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a  journal\x00".**.
194a0 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72  ** A master jour
194b0 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c  nal file may onl
194c0 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63  y be deleted onc
194d0 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  e all of its chi
194e0 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20  ld .** journals 
194f0 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64  have been rolled
19500 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   back..**.** Thi
19510 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73  s function reads
19520 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
19530 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
19540 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a  nal file into .*
19550 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f  * memory and loo
19560 70 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  ps through each 
19570 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  of the child jou
19580 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a  rnal names. For.
19590 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  ** each child jo
195a0 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73  urnal, it checks
195b0 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69   if:.**.**   * i
195c0 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
195d0 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20  nal exists, and 
195e0 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20  if so.**   * if 
195f0 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
19600 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66  l contains a ref
19610 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72  erence to master
19620 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20   journal .**    
19630 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a   file zMaster.**
19640 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a  .** If a child j
19650 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
19660 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73  und that matches
19670 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69   both of the cri
19680 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20  teria.** above, 
19690 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
196a0 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f  turns without do
196b0 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74  ing anything. Ot
196c0 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e  herwise, if.** n
196d0 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75  o such child jou
196e0 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
196f0 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20  d, file zMaster 
19700 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a  is deleted from.
19710 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
19720 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  em using sqlite3
19730 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a  OsDelete()..**.*
19740 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
19750 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
19760 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20  ction, an error 
19770 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
19780 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
19790 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d  on allocates mem
197a0 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73  ory by calling s
197b0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20  qlite3Malloc(). 
197c0 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  If an allocation
197d0 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
197e0 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
197f0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
19800 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c  if no IO or mall
19810 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63  oc errors .** oc
19820 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  cur, SQLITE_OK i
19830 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
19840 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e  * TODO: This fun
19850 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
19860 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f  a single block o
19870 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64  f memory to load
19880 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63  .** the entire c
19890 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
198a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
198b0 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62  le. This could b
198c0 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66  e.** a couple of
198d0 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f   kilobytes or so
198e0 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c   - potentially l
198f0 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70  arger than the p
19900 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f  age .** size..*/
19910 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
19920 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65  r_delmaster(Page
19930 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
19940 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
19950 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
19960 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
19970 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Vfs;.  int rc;  
19980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19990 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
199a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
199b0 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f  e *pMaster;    /
199c0 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65  * Malloc'd maste
199d0 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  r-journal file d
199e0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73  escriptor */.  s
199f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f  qlite3_file *pJo
19a00 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c  urnal;   /* Mall
19a10 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e  oc'd child-journ
19a20 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
19a30 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  or */.  char *zM
19a40 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30  asterJournal = 0
19a50 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66  ; /* Contents of
19a60 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19a70 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d  file */.  i64 nM
19a80 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20  asterJournal;   
19a90 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
19aa0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
19ab0 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a  le */.  char *zJ
19ac0 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
19ad0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
19ae0 6f 6e 65 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68  one journal with
19af0 69 6e 20 4d 4a 20 66 69 6c 65 20 2a 2f 0a 20 20  in MJ file */.  
19b00 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72  char *zMasterPtr
19b10 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61  ;         /* Spa
19b20 63 65 20 74 6f 20 68 6f 6c 64 20 4d 4a 20 66 69  ce to hold MJ fi
19b30 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 61 20 6a 6f  lename from a jo
19b40 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
19b50 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 3b 20  int nMasterPtr; 
19b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6d 6f            /* Amo
19b70 75 6e 74 20 6f 66 20 73 70 61 63 65 20 61 6c 6c  unt of space all
19b80 6f 63 61 74 65 64 20 74 6f 20 7a 4d 61 73 74 65  ocated to zMaste
19b90 72 50 74 72 5b 5d 20 2a 2f 0a 0a 20 20 2f 2a 20  rPtr[] */..  /* 
19ba0 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
19bb0 6f 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75  or both the pJou
19bc0 72 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72  rnal and pMaster
19bd0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
19be0 73 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65  s..  ** If succe
19bf0 73 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20  ssful, open the 
19c00 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
19c10 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  ile for reading.
19c20 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20  .  */.  pMaster 
19c30 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
19c40 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
19c50 65 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ero(pVfs->szOsFi
19c60 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72  le * 2);.  pJour
19c70 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  nal = (sqlite3_f
19c80 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d  ile *)(((u8 *)pM
19c90 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73  aster) + pVfs->s
19ca0 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  zOsFile);.  if( 
19cb0 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  !pMaster ){.    
19cc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
19cd0 4d 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b  M_BKPT;.  }else{
19ce0 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66  .    const int f
19cf0 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
19d00 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
19d10 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
19d20 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63  JOURNAL);.    rc
19d30 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
19d40 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
19d50 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20  pMaster, flags, 
19d60 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
19d70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
19d80 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
19d90 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  ;..  /* Load the
19da0 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
19db0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
19dc0 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
19dd0 66 72 6f 6d 0a 20 20 2a 2a 20 73 71 6c 69 74 65  from.  ** sqlite
19de0 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  3_malloc() and p
19df0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
19e00 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 20 20 41  sterJournal.   A
19e10 6c 73 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20  lso obtain.  ** 
19e20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
19e30 20 28 69 6e 20 7a 4d 61 73 74 65 72 50 74 72 29   (in zMasterPtr)
19e40 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d   to hold the nam
19e50 65 73 20 6f 66 20 6d 61 73 74 65 72 0a 20 20 2a  es of master.  *
19e60 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  * journal files 
19e70 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72  extracted from r
19e80 65 67 75 6c 61 72 20 72 6f 6c 6c 62 61 63 6b 2d  egular rollback-
19e90 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20  journals..  */. 
19ea0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
19eb0 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c  ileSize(pMaster,
19ec0 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &nMasterJournal
19ed0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
19ee0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
19ef0 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6e  lmaster_out;.  n
19f00 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56 66 73  MasterPtr = pVfs
19f10 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
19f20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
19f30 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
19f40 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  (nMasterJournal 
19f50 2b 20 6e 4d 61 73 74 65 72 50 74 72 20 2b 20 31  + nMasterPtr + 1
19f60 29 3b 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65  );.  if( !zMaste
19f70 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
19f80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
19f90 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  M_BKPT;.    goto
19fa0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
19fb0 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 50 74 72    }.  zMasterPtr
19fc0 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   = &zMasterJourn
19fd0 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al[nMasterJourna
19fe0 6c 2b 31 5d 3b 0a 20 20 72 63 20 3d 20 73 71 6c  l+1];.  rc = sql
19ff0 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74  ite3OsRead(pMast
1a000 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  er, zMasterJourn
1a010 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72  al, (int)nMaster
1a020 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 69  Journal, 0);.  i
1a030 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a040 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
1a050 72 5f 6f 75 74 3b 0a 20 20 7a 4d 61 73 74 65 72  r_out;.  zMaster
1a060 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
1a070 6f 75 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20  ournal] = 0;..  
1a080 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74  zJournal = zMast
1a090 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 77 68 69  erJournal;.  whi
1a0a0 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d  le( (zJournal-zM
1a0b0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d  asterJournal)<nM
1a0c0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
1a0d0 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a      int exists;.
1a0e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a0f0 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
1a100 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
1a110 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
1a120 65 78 69 73 74 73 29 3b 0a 20 20 20 20 69 66 28  exists);.    if(
1a130 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a140 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c  {.      goto del
1a150 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
1a160 7d 0a 20 20 20 20 69 66 28 20 65 78 69 73 74 73  }.    if( exists
1a170 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 65   ){.      /* One
1a180 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
1a190 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
1a1a0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
1a1b0 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20  l exists..      
1a1c0 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63  ** Open it and c
1a1d0 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74  heck if it point
1a1e0 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  s at the master 
1a1f0 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
1a200 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20    ** so, return 
1a210 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67  without deleting
1a220 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
1a230 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
1a240 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 3b 0a  */.      int c;.
1a250 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20        int flags 
1a260 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
1a270 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
1a280 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
1a290 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
1a2a0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
1a2b0 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75  , zJournal, pJou
1a2c0 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b  rnal, flags, 0);
1a2d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1a2e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a2f0 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
1a300 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
1a310 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
1a320 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a  MasterJournal(pJ
1a330 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50  ournal, zMasterP
1a340 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b  tr, nMasterPtr);
1a350 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
1a360 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b  Close(pJournal);
1a370 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1a380 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a390 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
1a3a0 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
1a3b0 0a 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74  .      c = zMast
1a3c0 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73  erPtr[0]!=0 && s
1a3d0 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
1a3e0 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
1a3f0 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20       if( c ){.  
1a400 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
1a410 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74   a match. Do not
1a420 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
1a430 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
1a440 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   */.        goto
1a450 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
1a460 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a470 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73    zJournal += (s
1a480 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1a490 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 7d  Journal)+1);.  }
1a4a0 0a 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  . .  sqlite3OsCl
1a4b0 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ose(pMaster);.  
1a4c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
1a4d0 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
1a4e0 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74  er, 0);..delmast
1a4f0 65 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  er_out:.  sqlite
1a500 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f  3_free(zMasterJo
1a510 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 4d  urnal);.  if( pM
1a520 61 73 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  aster ){.    sql
1a530 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73  ite3OsClose(pMas
1a540 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ter);.    assert
1a550 28 20 21 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e  ( !isOpen(pJourn
1a560 61 6c 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  al) );.    sqlit
1a570 65 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29  e3_free(pMaster)
1a580 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1a590 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
1a5a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
1a5b0 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ed to change the
1a5c0 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20   actual size of 
1a5d0 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
1a5e0 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69 6c   file in the fil
1a5f0 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73 20 6f  e-system. This o
1a600 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68 65 6e  nly happens when
1a610 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
1a620 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 6f 72  ansaction,.** or
1a630 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
1a640 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 6e 63  transaction (inc
1a650 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67 20 62  luding rolling b
1a660 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ack a hot-journa
1a670 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  l)..**.** If the
1a680 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
1a690 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c  ile is not open,
1a6a0 20 6f 72 20 74 68 65 20 70 61 67 65 72 20 69 73   or the pager is
1a6b0 20 6e 6f 74 20 69 6e 20 65 69 74 68 65 72 0a 2a   not in either.*
1a6c0 2a 20 44 42 4d 4f 44 20 6f 72 20 4f 50 45 4e 20  * DBMOD or OPEN 
1a6d0 73 74 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63  state, this func
1a6e0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
1a6f0 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
1a700 73 69 7a 65 20 0a 2a 2a 20 6f 66 20 74 68 65 20  size .** of the 
1a710 66 69 6c 65 20 69 73 20 63 68 61 6e 67 65 64 20  file is changed 
1a720 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20 28  to nPage pages (
1a730 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61  nPage*pPager->pa
1a740 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20 0a  geSize bytes). .
1a750 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  ** If the file o
1a760 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e  n disk is curren
1a770 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20  tly larger than 
1a780 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68 65  nPage pages, the
1a790 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a  n use the VFS.**
1a7a0 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74   xTruncate() met
1a7b0 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20  hod to truncate 
1a7c0 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74  it..**.** Or, it
1a7d0 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
1a7e0 73 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  se that the file
1a7f0 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c   on disk is smal
1a800 6c 65 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61  ler than .** nPa
1a810 67 65 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f  ge pages. Some o
1a820 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
1a830 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
1a840 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64  can get confused
1a850 20 69 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20   if .** you try 
1a860 74 6f 20 74 72 75 6e 63 61 74 65 20 61 20 66 69  to truncate a fi
1a870 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20  le to some size 
1a880 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74  that is larger t
1a890 68 61 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65  han it .** curre
1a8a0 6e 74 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65  ntly is, so dete
1a8b0 63 74 20 74 68 69 73 20 63 61 73 65 20 61 6e 64  ct this case and
1a8c0 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20   write a single 
1a8d0 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a  zero byte to .**
1a8e0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1a8f0 6e 65 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64  new file instead
1a900 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
1a910 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51  ssful, return SQ
1a920 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49  LITE_OK. If an I
1a930 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
1a940 68 69 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a  hile modifying.*
1a950 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
1a960 69 6c 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  ile, return the 
1a970 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
1a980 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61  e caller..*/.sta
1a990 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72  tic int pager_tr
1a9a0 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
1a9b0 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
1a9c0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1a9d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
1a9e0 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
1a9f0 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29  e!=PAGER_ERROR )
1aa00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1aa10 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
1aa20 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 0a 20  R_READER );.  . 
1aa30 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
1aa40 65 72 2d 3e 66 64 29 20 0a 20 20 20 26 26 20 28  er->fd) .   && (
1aa50 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
1aa60 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
1aa70 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OD || pPager->eS
1aa80 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
1aa90 29 20 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  ) .  ){.    i64 
1aaa0 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77  currentSize, new
1aab0 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 73 7a  Size;.    int sz
1aac0 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Page = pPager->p
1aad0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73  ageSize;.    ass
1aae0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f  ert( pPager->eLo
1aaf0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
1ab00 43 4b 20 29 3b 0a 20 20 20 20 2f 2a 20 54 4f 44  CK );.    /* TOD
1ab10 4f 3a 20 49 73 20 69 74 20 73 61 66 65 20 74 6f  O: Is it safe to
1ab20 20 75 73 65 20 50 61 67 65 72 2e 64 62 46 69 6c   use Pager.dbFil
1ab30 65 53 69 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20  eSize here? */. 
1ab40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1ab50 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
1ab60 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69  ->fd, &currentSi
1ab70 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65  ze);.    newSize
1ab80 20 3d 20 73 7a 50 61 67 65 2a 28 69 36 34 29 6e   = szPage*(i64)n
1ab90 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63  Page;.    if( rc
1aba0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
1abb0 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53  urrentSize!=newS
1abc0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ize ){.      if(
1abd0 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77   currentSize>new
1abe0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1abf0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
1ac00 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66  uncate(pPager->f
1ac10 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20  d, newSize);.   
1ac20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 75     }else if( (cu
1ac30 72 72 65 6e 74 53 69 7a 65 2b 73 7a 50 61 67 65  rrentSize+szPage
1ac40 29 3c 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  )<=newSize ){.  
1ac50 20 20 20 20 20 20 63 68 61 72 20 2a 70 54 6d 70        char *pTmp
1ac60 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
1ac70 70 61 63 65 3b 0a 20 20 20 20 20 20 20 20 6d 65  pace;.        me
1ac80 6d 73 65 74 28 70 54 6d 70 2c 20 30 2c 20 73 7a  mset(pTmp, 0, sz
1ac90 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 74  Page);.        t
1aca0 65 73 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a  estcase( (newSiz
1acb0 65 2d 73 7a 50 61 67 65 29 20 3d 3d 20 63 75 72  e-szPage) == cur
1acc0 72 65 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20  rentSize );.    
1acd0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 6e      testcase( (n
1ace0 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 20 3e  ewSize-szPage) >
1acf0 20 20 63 75 72 72 65 6e 74 53 69 7a 65 20 29 3b    currentSize );
1ad00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1ad10 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
1ad20 67 65 72 2d 3e 66 64 2c 20 70 54 6d 70 2c 20 73  ger->fd, pTmp, s
1ad30 7a 50 61 67 65 2c 20 6e 65 77 53 69 7a 65 2d 73  zPage, newSize-s
1ad40 7a 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zPage);.      }.
1ad50 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1ad60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ad70 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
1ad80 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  eSize = nPage;. 
1ad90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1ada0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1adb0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1adc0 73 61 6e 69 74 69 7a 65 64 20 76 65 72 73 69 6f  sanitized versio
1add0 6e 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 2d  n of the sector-
1ade0 73 69 7a 65 20 6f 66 20 4f 53 20 66 69 6c 65 20  size of OS file 
1adf0 70 46 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 72 65  pFile. The.** re
1ae00 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 67 75  turn value is gu
1ae10 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 69 65 20  aranteed to lie 
1ae20 62 65 74 77 65 65 6e 20 33 32 20 61 6e 64 20 4d  between 32 and M
1ae30 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 2e 0a  AX_SECTOR_SIZE..
1ae40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
1ae50 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33  ctorSize(sqlite3
1ae60 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  _file *pFile){. 
1ae70 20 69 6e 74 20 69 52 65 74 20 3d 20 73 71 6c 69   int iRet = sqli
1ae80 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
1ae90 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 69 52  pFile);.  if( iR
1aea0 65 74 3c 33 32 20 29 7b 0a 20 20 20 20 69 52 65  et<32 ){.    iRe
1aeb0 74 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73 65  t = 512;.  }else
1aec0 20 69 66 28 20 69 52 65 74 3e 4d 41 58 5f 53 45   if( iRet>MAX_SE
1aed0 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20  CTOR_SIZE ){.   
1aee0 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43   assert( MAX_SEC
1aef0 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b  TOR_SIZE>=512 );
1af00 0a 20 20 20 20 69 52 65 74 20 3d 20 4d 41 58 5f  .    iRet = MAX_
1af10 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d  SECTOR_SIZE;.  }
1af20 0a 20 20 72 65 74 75 72 6e 20 69 52 65 74 3b 0a  .  return iRet;.
1af30 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
1af40 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 61   value of the Pa
1af50 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
1af60 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68 65 20  ariable for the 
1af70 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62  given.** pager b
1af80 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61 6c 75  ased on the valu
1af90 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
1afa0 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20 6d 65  e xSectorSize me
1afb0 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f  thod.** of the o
1afc0 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
1afd0 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20 73 69  e. The sector si
1afe0 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ze will be used 
1aff0 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  .** to determine
1b000 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c   the size and al
1b010 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e  ignment of journ
1b020 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a  al header and .*
1b030 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
1b040 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e   pointers within
1b050 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c   created journal
1b060 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f   files..**.** Fo
1b070 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
1b080 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  s the effective 
1b090 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61  sector size is a
1b0a0 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2e  lways 512 bytes.
1b0b0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
1b0c0 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72  , for non-tempor
1b0d0 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65  ary files, the e
1b0e0 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20  ffective sector 
1b0f0 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76  size is.** the v
1b100 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
1b110 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65   the xSectorSize
1b120 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65  () method rounde
1b130 64 20 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a  d up to 32 if.**
1b140 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e   it is less than
1b150 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20   32, or rounded 
1b160 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54  down to MAX_SECT
1b170 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a  OR_SIZE if it.**
1b180 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1b190 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
1b1a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
1b1b0 69 6c 65 20 68 61 73 20 74 68 65 20 53 51 4c 49  ile has the SQLI
1b1c0 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
1b1d0 46 45 5f 4f 56 45 52 57 52 49 54 45 20 70 72 6f  FE_OVERWRITE pro
1b1e0 70 65 72 74 79 2c 20 74 68 65 6e 20 73 65 74 0a  perty, then set.
1b1f0 2a 2a 20 74 68 65 20 65 66 66 65 63 74 69 76 65  ** the effective
1b200 20 73 65 63 74 6f 72 20 73 69 7a 65 20 74 6f 20   sector size to 
1b210 69 74 73 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75  its minimum valu
1b220 65 20 28 35 31 32 29 2e 20 20 54 68 65 20 70 75  e (512).  The pu
1b230 72 70 6f 73 65 20 6f 66 0a 2a 2a 20 70 50 61 67  rpose of.** pPag
1b240 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69  er->sectorSize i
1b250 73 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20  s to define the 
1b260 22 62 6c 61 73 74 20 72 61 64 69 75 73 22 20 6f  "blast radius" o
1b270 66 20 62 79 74 65 73 20 74 68 61 74 0a 2a 2a 20  f bytes that.** 
1b280 6d 69 67 68 74 20 63 68 61 6e 67 65 20 69 66 20  might change if 
1b290 61 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 77  a crash occurs w
1b2a0 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20  hile writing to 
1b2b0 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e  a single byte in
1b2c0 0a 2a 2a 20 74 68 61 74 20 72 61 6e 67 65 2e 20  .** that range. 
1b2d0 20 42 75 74 20 77 69 74 68 20 50 4f 57 45 52 53   But with POWERS
1b2e0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 2c 20 74  AFE_OVERWRITE, t
1b2f0 68 65 20 62 6c 61 73 74 20 72 61 64 69 75 73 20  he blast radius 
1b300 69 73 20 7a 65 72 6f 0a 2a 2a 20 28 74 68 61 74  is zero.** (that
1b310 20 69 73 20 77 68 61 74 20 50 4f 57 45 52 53 41   is what POWERSA
1b320 46 45 5f 4f 56 45 52 57 52 49 54 45 20 6d 65 61  FE_OVERWRITE mea
1b330 6e 73 29 2c 20 73 6f 20 77 65 20 6d 69 6e 69 6d  ns), so we minim
1b340 69 7a 65 20 74 68 65 20 73 65 63 74 6f 72 0a 2a  ize the sector.*
1b350 2a 20 73 69 7a 65 2e 20 20 46 6f 72 20 62 61 63  * size.  For bac
1b360 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
1b370 6c 69 74 79 20 6f 66 20 74 68 65 20 72 6f 6c 6c  lity of the roll
1b380 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  back journal fil
1b390 65 20 66 6f 72 6d 61 74 2c 0a 2a 2a 20 77 65 20  e format,.** we 
1b3a0 63 61 6e 6e 6f 74 20 72 65 64 75 63 65 20 74 68  cannot reduce th
1b3b0 65 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74  e effective sect
1b3c0 6f 72 20 73 69 7a 65 20 62 65 6c 6f 77 20 35 31  or size below 51
1b3d0 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  2..*/.static voi
1b3e0 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28  d setSectorSize(
1b3f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1b400 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
1b410 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
1b420 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1b430 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65   );..  if( pPage
1b440 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20 7c  r->tempFile.   |
1b450 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69  | (sqlite3OsDevi
1b460 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1b470 73 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26 20  s(pPager->fd) & 
1b480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  .              S
1b490 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45  QLITE_IOCAP_POWE
1b4a0 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29  RSAFE_OVERWRITE)
1b4b0 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  !=0.  ){.    /* 
1b4c0 53 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73  Sector size does
1b4d0 6e 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74  n't matter for t
1b4e0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
1b4f0 41 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20  Also, the file. 
1b500 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61     ** may not ha
1b510 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79  ve been opened y
1b520 65 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73  et, in which cas
1b530 65 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69  e the OsSectorSi
1b540 7a 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  ze().    ** call
1b550 20 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 20   will segfault. 
1b560 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  */.    pPager->s
1b570 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b  ectorSize = 512;
1b580 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
1b590 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
1b5a0 20 3d 20 73 71 6c 69 74 65 33 53 65 63 74 6f 72   = sqlite3Sector
1b5b0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29  Size(pPager->fd)
1b5c0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
1b5d0 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  layback the jour
1b5e0 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73  nal and thus res
1b5f0 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
1b600 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65  e file to.** the
1b610 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
1b620 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74   before we start
1b630 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ed making change
1b640 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  s.  .**.** The j
1b650 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
1b660 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  at is as follows
1b670 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38  : .**.**  (1)  8
1b680 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41   byte prefix.  A
1b690 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61   copy of aJourna
1b6a0 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32  lMagic[]..**  (2
1b6b0 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
1b6c0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
1b6d0 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
1b6e0 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72   of valid page r
1b6f0 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20  ecords.**       
1b700 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
1b710 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
1b720 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
1b730 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  en compute the.*
1b740 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f  *       number o
1b750 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  f page records f
1b760 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
1b770 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34  size..**  (3)  4
1b780 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
1b790 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
1b7a0 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  s the initial va
1b7b0 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  lue for the .** 
1b7c0 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65        sanity che
1b7d0 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20  cksum..**  (4)  
1b7e0 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
1b7f0 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
1b800 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74  er of pages to t
1b810 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20  runcate the.**  
1b820 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f       database to
1b830 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
1b840 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62  ck..**  (5)  4 b
1b850 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
1b860 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
1b870 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  the sector size.
1b880 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20    The header.** 
1b890 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d 61        is this ma
1b8a0 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ny bytes in size
1b8b0 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74  ..**  (6)  4 byt
1b8c0 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
1b8d0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
1b8e0 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20  e page size..** 
1b8f0 20 28 37 29 20 20 7a 65 72 6f 20 70 61 64 64 69   (7)  zero paddi
1b900 6e 67 20 6f 75 74 20 74 6f 20 74 68 65 20 6e 65  ng out to the ne
1b910 78 74 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 0a  xt sector size..
1b920 2a 2a 20 20 28 38 29 20 20 5a 65 72 6f 20 6f 72  **  (8)  Zero or
1b930 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74   more pages inst
1b940 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66  ances, each as f
1b950 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20  ollows:.**      
1b960 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65    +  4 byte page
1b970 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20   number..**     
1b980 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61     +  pPager->pa
1b990 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
1b9a0 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20  data..**        
1b9b0 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73  +  4 byte checks
1b9c0 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65  um.**.** When we
1b9d0 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f   speak of the jo
1b9e0 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65  urnal header, we
1b9f0 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20   mean the first 
1ba00 37 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a  7 items above..*
1ba10 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  * Each entry in 
1ba20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
1ba30 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
1ba40 65 20 38 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a  e 8th item..**.*
1ba50 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65  * Call the value
1ba60 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
1ba70 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20   bullet "nRec". 
1ba80 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d   nRec is the num
1ba90 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20  ber of.** valid 
1baa0 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  page entries in 
1bab0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
1bac0 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75   most cases, you
1bad0 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
1bae0 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  .** value of nRe
1baf0 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  c from the size 
1bb00 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1bb10 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70  ile.  But if a p
1bb20 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20  ower.** failure 
1bb30 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74  occurred while t
1bb40 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
1bb50 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74  eing written, it
1bb60 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a   could be the.**
1bb70 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73   case that the s
1bb80 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
1bb90 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65  al file had alre
1bba0 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73  ady been increas
1bbb0 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78  ed but.** the ex
1bbc0 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20  tra entries had 
1bbd0 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20  not yet made it 
1bbe0 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20  safely to disk. 
1bbf0 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c   In such a case,
1bc00 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
1bc10 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
1bc20 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
1bc30 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c  e would be too l
1bc40 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  arge.  For.** th
1bc50 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c  at reason, we al
1bc60 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65  ways use the nRe
1bc70 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  c value in the h
1bc80 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eader..**.** If 
1bc90 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
1bca0 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20  s 0xffffffff it 
1bcb0 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20  means that nRec 
1bcc0 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
1bcd0 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ed.** from the f
1bce0 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ile size.  This 
1bcf0 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68  value is used wh
1bd00 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65  en the user sele
1bd10 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79  cts the.** no-sy
1bd20 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68  nc option for th
1bd30 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f  e journal.  A po
1bd40 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
1bd50 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70  d lead to corrup
1bd60 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20  tion.** in this 
1bd70 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74  case.  But for t
1bd80 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f  hings like tempo
1bd90 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63  rary table (whic
1bda0 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c  h will be.** del
1bdb0 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f  eted when the po
1bdc0 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29  wer is restored)
1bdd0 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20   we don't care. 
1bde0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
1bdf0 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
1be00 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1be10 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
1be20 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
1be30 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  ile then all pag
1be40 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72  es up to the fir
1be50 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67  st corrupted pag
1be60 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  e are rolled.** 
1be70 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65  back (or no page
1be80 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s if the journal
1be90 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75   header is corru
1bea0 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e  pted). The journ
1beb0 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68  al file.** is th
1bec0 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  en deleted and S
1bed0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
1bee0 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f  d, just as if no
1bef0 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a   corruption had.
1bf00 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  ** been encounte
1bf10 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
1bf20 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29   I/O or malloc()
1bf30 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
1bf40 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
1bf50 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a  is not deleted.*
1bf60 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
1bf70 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
1bf80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74  .**.** The isHot
1bf90 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63   parameter indic
1bfa0 61 74 65 73 20 74 68 61 74 20 77 65 20 61 72 65  ates that we are
1bfb0 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62   trying to rollb
1bfc0 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ack a journal.**
1bfd0 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 61   that might be a
1bfe0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f   hot journal.  O
1bff0 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74  r, it could be t
1c000 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
1c010 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76 65 64  is .** preserved
1c020 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f 55 52   because of JOUR
1c030 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20  NALMODE_PERSIST 
1c040 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  or JOURNALMODE_T
1c050 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74  RUNCATE..** If t
1c060 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c  he journal reall
1c070 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65 74 20  y is hot, reset 
1c080 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
1c090 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a  prior rolling.**
1c0a0 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e   back any conten
1c0b0 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  t.  If the journ
1c0c0 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70 65 72  al is merely per
1c0d0 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65  sistent, no rese
1c0e0 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a  t is.** needed..
1c0f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1c100 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  ger_playback(Pag
1c110 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
1c120 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65  isHot){.  sqlite
1c130 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
1c140 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36  ager->pVfs;.  i6
1c150 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
1c160 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1c170 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1c180 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
1c190 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20   u32 nRec;      
1c1a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1c1b0 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69  ber of Records i
1c1c0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
1c1d0 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20  .  u32 u;       
1c1e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1c1f0 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
1c200 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d  nter */.  Pgno m
1c210 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  xPg = 0;        
1c220 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1c230 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20  e original file 
1c240 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  in pages */.  in
1c250 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1c260 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
1c270 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f   code of a subro
1c280 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
1c290 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  es = 1;         
1c2a0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
1c2b0 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
1c2c0 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20 20  OsAccess() */.  
1c2d0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20  char *zMaster = 
1c2e0 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  0;       /* Name
1c2f0 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
1c300 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a  al file if any *
1c310 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61 67 65  /.  int needPage
1c320 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  rReset;      /* 
1c330 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 70 61  True to reset pa
1c340 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69 72 73  ge prior to firs
1c350 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20  t page rollback 
1c360 2a 2f 0a 20 20 69 6e 74 20 6e 50 6c 61 79 62 61  */.  int nPlayba
1c370 63 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  ck = 0;       /*
1c380 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
1c390 20 70 61 67 65 73 20 72 65 73 74 6f 72 65 64 20   pages restored 
1c3a0 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  from journal */.
1c3b0 20 20 75 33 32 20 73 61 76 65 64 50 61 67 65 53    u32 savedPageS
1c3c0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
1c3d0 67 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69  geSize;..  /* Fi
1c3e0 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
1c3f0 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e  y records are in
1c400 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
1c410 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20  bort early if.  
1c420 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
1c430 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20  s empty..  */.  
1c440 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
1c450 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
1c460 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1c470 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
1c480 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  jfd, &szJ);.  if
1c490 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c4a0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
1c4b0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
1c4c0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73   /* Read the mas
1c4d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
1c4e0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
1c4f0 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73  l, if it is pres
1c500 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d  ent..  ** If a m
1c510 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1c520 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69  le name is speci
1c530 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69  fied, but the fi
1c540 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70  le is not.  ** p
1c550 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20  resent on disk, 
1c560 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1c570 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20   is not hot and 
1c580 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
1c590 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20   be.  ** played 
1c5a0 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  back..  **.  ** 
1c5b0 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c  TODO: Technicall
1c5c0 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
1c5d0 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61  is an error beca
1c5e0 75 73 65 20 69 74 20 61 73 73 75 6d 65 73 20 74  use it assumes t
1c5f0 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  hat.  ** buffer 
1c600 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
1c610 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31  is (mxPathname+1
1c620 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65  ) bytes or large
1c630 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a  r. i.e. that.  *
1c640 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  * (pPager->pageS
1c650 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70  ize >= pPager->p
1c660 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
1c670 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69  1). Using os_uni
1c680 78 2e 63 2c 0a 20 20 2a 2a 20 6d 78 50 61 74 68  x.c,.  ** mxPath
1c690 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69  name is 512, whi
1c6a0 63 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ch is the same a
1c6b0 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c  s the minimum al
1c6c0 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20  lowable value.  
1c6d0 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e  ** for pageSize.
1c6e0 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20  .  */.  zMaster 
1c6f0 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
1c700 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64  ace;.  rc = read
1c710 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
1c720 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
1c730 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
1c740 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
1c750 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1c760 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b  E_OK && zMaster[
1c770 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  0] ){.    rc = s
1c780 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
1c790 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51  Vfs, zMaster, SQ
1c7a0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
1c7b0 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20  TS, &res);.  }. 
1c7c0 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
1c7d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c7e0 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20  K || !res ){.   
1c7f0 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1c800 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  ck;.  }.  pPager
1c810 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
1c820 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73  ;.  needPagerRes
1c830 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f  et = isHot;..  /
1c840 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d  * This loop term
1c850 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68  inates either wh
1c860 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c  en a readJournal
1c870 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70  Hdr() or .  ** p
1c880 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
1c890 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65  e_page() call re
1c8a0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
1c8b0 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  E or an IO error
1c8c0 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a   .  ** occurs. .
1c8d0 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20    */.  while( 1 
1c8e0 29 7b 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ){.    /* Read t
1c8f0 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20  he next journal 
1c900 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20  header from the 
1c910 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49  journal file.  I
1c920 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20  f there are.    
1c930 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79  ** not enough by
1c940 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20  tes left in the 
1c950 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
1c960 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64   a complete head
1c970 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74  er, or.    ** it
1c980 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74   is corrupted, t
1c990 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75  hen a process mu
1c9a0 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 77  st have failed w
1c9b0 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e  hile writing it.
1c9c0 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64  .    ** This ind
1c9d0 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d  icates nothing m
1c9e0 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ore needs to be 
1c9f0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20  rolled back..   
1ca00 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61   */.    rc = rea
1ca10 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
1ca20 65 72 2c 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20  er, isHot, szJ, 
1ca30 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20  &nRec, &mxPg);. 
1ca40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ca50 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69  E_OK ){ .      i
1ca60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
1ca70 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  NE ){.        rc
1ca80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1ca90 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
1caa0 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
1cab0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1cac0 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66  nRec is 0xffffff
1cad0 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f  ff, then this jo
1cae0 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65  urnal was create
1caf0 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20  d by a process. 
1cb00 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e     ** working in
1cb10 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54   no-sync mode. T
1cb20 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  his means that t
1cb30 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a  he rest of the j
1cb40 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
1cb50 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70  le consists of p
1cb60 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20  ages, there are 
1cb70 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20  no more journal 
1cb80 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65  headers. Compute
1cb90 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  .    ** the valu
1cba0 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20  e of nRec based 
1cbb0 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69  on this assumpti
1cbc0 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
1cbd0 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66  f( nRec==0xfffff
1cbe0 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73  fff ){.      ass
1cbf0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
1cc00 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
1cc10 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
1cc20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  );.      nRec = 
1cc30 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55  (int)((szJ - JOU
1cc40 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
1cc50 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  er))/JOURNAL_PG_
1cc60 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  SZ(pPager));.   
1cc70 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
1cc80 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73  ec is 0 and this
1cc90 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20   rollback is of 
1cca0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72  a transaction cr
1ccb0 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20  eated by this.  
1ccc0 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64    ** process and
1ccd0 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
1cce0 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20  final header in 
1ccf0 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  the journal, the
1cd00 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a  n it means.    *
1cd10 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72 74  * that this part
1cd20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1cd30 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64  was being filled
1cd40 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74   but has not yet
1cd50 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e   been.    ** syn
1cd60 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f  ced to disk.  Co
1cd70 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72  mpute the number
1cd80 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64 20   of pages based 
1cd90 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67  on the remaining
1cda0 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20  .    ** size of 
1cdb0 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  the file..    **
1cdc0 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72  .    ** The thir
1cdd0 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65  d term of the te
1cde0 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f 20  st was added to 
1cdf0 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36 35  fix ticket #2565
1ce00 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f  ..    ** When ro
1ce10 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74  lling back a hot
1ce20 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d   journal, nRec==
1ce30 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74  0 always means t
1ce40 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20  hat the next.   
1ce50 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65   ** chunk of the
1ce60 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e   journal contain
1ce70 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20  s zero pages to 
1ce80 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
1ce90 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e   But.    ** when
1cea0 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43   doing a ROLLBAC
1ceb0 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d  K and the nRec==
1cec0 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c  0 chunk is the l
1ced0 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20  ast chunk in.   
1cee0 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   ** the journal,
1cef0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
1cf00 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
1cf10 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f   contain additio
1cf20 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73  nal.    ** pages
1cf30 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
1cf40 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64   rolled back and
1cf50 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72   that the number
1cf60 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a   of pages .    *
1cf70 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  * should be comp
1cf80 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68  uted based on th
1cf90 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  e journal file s
1cfa0 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
1cfb0 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21  if( nRec==0 && !
1cfc0 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20  isHot &&.       
1cfd0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1cfe0 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
1cff0 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
1d000 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
1d010 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  {.      nRec = (
1d020 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61 67  int)((szJ - pPag
1d030 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
1d040 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  / JOURNAL_PG_SZ(
1d050 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
1d060 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
1d070 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61  is the first hea
1d080 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68  der read from th
1d090 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63  e journal, trunc
1d0a0 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ate the.    ** d
1d0b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63  atabase file bac
1d0c0 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
1d0d0 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  l size..    */. 
1d0e0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
1d0f0 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
1d100 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
1d110 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
1d120 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
1d130 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20  Pager, mxPg);.  
1d140 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1d150 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1d160 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
1d170 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ck;.      }.    
1d180 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1d190 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a   = mxPg;.    }..
1d1a0 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67      /* Copy orig
1d1b0 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
1d1c0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  f the journal an
1d1d0 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
1d1e0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
1d1f0 20 66 69 6c 65 20 61 6e 64 2f 6f 72 20 70 61 67   file and/or pag
1d200 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a  e cache..    */.
1d210 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e      for(u=0; u<n
1d220 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20  Rec; u++){.     
1d230 20 69 66 28 20 6e 65 65 64 50 61 67 65 72 52 65   if( needPagerRe
1d240 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  set ){.        p
1d250 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
1d260 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 65 64  r);.        need
1d270 50 61 67 65 72 52 65 73 65 74 20 3d 20 30 3b 0a  PagerReset = 0;.
1d280 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
1d290 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
1d2a0 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
1d2b0 72 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r,&pPager->journ
1d2c0 61 6c 4f 66 66 2c 30 2c 31 2c 30 29 3b 0a 20 20  alOff,0,1,0);.  
1d2d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1d2e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1d2f0 20 6e 50 6c 61 79 62 61 63 6b 2b 2b 3b 0a 20 20   nPlayback++;.  
1d300 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d310 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d320 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
1d330 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1d340 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
1d350 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1d360 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1d370 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
1d380 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
1d390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1d3a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
1d3b0 62 65 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20  been truncated, 
1d3c0 73 69 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64  simply stop read
1d3d0 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ing and.        
1d3e0 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20    ** processing 
1d3f0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69  the journal. Thi
1d400 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69  s might happen i
1d410 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  f the journal wa
1d420 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e  s.          ** n
1d430 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72  ot completely wr
1d440 69 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64  itten and synced
1d450 20 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73   prior to a cras
1d460 68 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20  h.  In that.    
1d470 20 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74        ** case, t
1d480 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  he database shou
1d490 6c 64 20 68 61 76 65 20 6e 65 76 65 72 20 62 65  ld have never be
1d4a0 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68  en written in th
1d4b0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  e.          ** f
1d4c0 69 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74  irst place so it
1d4d0 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79   is OK to simply
1d4e0 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c   abandon the rol
1d4f0 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20  lback. */.      
1d500 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d510 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  OK;.          go
1d520 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
1d530 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1d540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1d550 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
1d560 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20   rollback, quit 
1d570 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65  and return the e
1d580 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a  rror.          *
1d590 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69  * code.  This wi
1d5a0 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70 61 67  ll cause the pag
1d5b0 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
1d5c0 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20  error state.    
1d5d0 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74        ** so that
1d5e0 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d   no further harm
1d5f0 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20   will be done.  
1d600 50 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74  Perhaps the next
1d610 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
1d620 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c  ocess to come al
1d630 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65  ong will be able
1d640 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
1d650 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
1d660 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1d670 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
1d680 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ack;.        }. 
1d690 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1d6a0 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a  .  /*NOTREACHED*
1d6b0 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b  /.  assert( 0 );
1d6c0 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a  ..end_playback:.
1d6d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d6e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1d6f0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
1d700 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20  agesize(pPager, 
1d710 26 73 61 76 65 64 50 61 67 65 53 69 7a 65 2c 20  &savedPageSize, 
1d720 2d 31 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 6f  -1);.  }.  /* Fo
1d730 6c 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61  llowing a rollba
1d740 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ck, the database
1d750 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
1d760 62 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67  back in its orig
1d770 69 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20  inal.  ** state 
1d780 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61  prior to the sta
1d790 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
1d7a0 63 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65  ction, so invoke
1d7b0 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45   the.  ** SQLITE
1d7c0 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e  _FCNTL_DB_UNCHAN
1d7d0 47 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  GED file-control
1d7e0 20 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62   method to disab
1d7f0 6c 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65  le the.  ** asse
1d800 72 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74  rtion that the t
1d810 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1d820 65 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e  er was modified.
1d830 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
1d840 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20  ITE_DEBUG.  if( 
1d850 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
1d860 68 6f 64 73 20 29 7b 0a 20 20 20 20 73 71 6c 69  hods ){.    sqli
1d870 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
1d880 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c  Hint(pPager->fd,
1d890 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
1d8a0 55 4e 43 48 41 4e 47 45 44 2c 30 29 3b 0a 20 20  UNCHANGED,0);.  
1d8b0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
1d8c0 66 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20  f this playback 
1d8d0 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74  is happening aut
1d8e0 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20  omatically as a 
1d8f0 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20  result of an IO 
1d900 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20  or .  ** malloc 
1d910 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72  error that occur
1d920 72 65 64 20 61 66 74 65 72 20 74 68 65 20 63 68  red after the ch
1d930 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73  ange-counter was
1d940 20 75 70 64 61 74 65 64 20 62 75 74 20 0a 20 20   updated but .  
1d950 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  ** before the tr
1d960 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f  ansaction was co
1d970 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68  mmitted, then th
1d980 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1d990 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74   .  ** modificat
1d9a0 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76  ion may just hav
1d9b0 65 20 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e  e been reverted.
1d9c0 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
1d9d0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20   in exclusive . 
1d9e0 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73   ** mode, then s
1d9f0 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61  ubsequent transa
1da00 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64  ctions performed
1da10 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   by the connecti
1da20 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a  on will not.  **
1da30 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
1da40 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c  ge-counter at al
1da50 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64  l. This may lead
1da60 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73   to cache incons
1da70 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f  istency.  ** pro
1da80 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20  blems for other 
1da90 70 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d  processes at som
1daa0 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  e point in the f
1dab0 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a  uture. So, just.
1dac0 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69    ** in case thi
1dad0 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20  s has happened, 
1dae0 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67 65  clear the change
1daf0 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e  CountDone flag n
1db00 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  ow..  */.  pPage
1db10 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
1db20 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
1db30 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63  pFile;..  if( rc
1db40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1db50 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61     zMaster = pPa
1db60 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
1db70 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
1db80 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
1db90 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
1dba0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
1dbb0 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
1dbc0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
1dbd0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
1dbe0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1dbf0 45 5f 4f 4b 0a 20 20 20 26 26 20 28 70 50 61 67  E_OK.   && (pPag
1dc00 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
1dc10 52 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c  R_WRITER_DBMOD |
1dc20 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  | pPager->eState
1dc30 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 29 0a 20 20  ==PAGER_OPEN).  
1dc40 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1dc50 74 65 33 50 61 67 65 72 53 79 6e 63 28 70 50 61  te3PagerSync(pPa
1dc60 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  ger, 0);.  }.  i
1dc70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1dc80 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
1dc90 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
1dca0 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  on(pPager, zMast
1dcb0 65 72 5b 30 5d 21 3d 27 5c 30 27 2c 20 30 29 3b  er[0]!='\0', 0);
1dcc0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1dcd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1dce0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1dcf0 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
1dd00 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a  er[0] && res ){.
1dd10 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1dd20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  was a master jou
1dd30 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f  rnal and this ro
1dd40 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
1dd50 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a  n success,.    *
1dd60 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70  * see if it is p
1dd70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
1dd80 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
1dd90 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rnal..    */.   
1dda0 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d   rc = pager_delm
1ddb0 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d  aster(pPager, zM
1ddc0 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73 74  aster);.    test
1ddd0 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
1dde0 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  _OK );.  }.  if(
1ddf0 20 69 73 48 6f 74 20 26 26 20 6e 50 6c 61 79 62   isHot && nPlayb
1de00 61 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ack ){.    sqlit
1de10 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
1de20 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c  TICE_RECOVER_ROL
1de30 4c 42 41 43 4b 2c 20 22 72 65 63 6f 76 65 72 65  LBACK, "recovere
1de40 64 20 25 64 20 70 61 67 65 73 20 66 72 6f 6d 20  d %d pages from 
1de50 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
1de60 20 20 20 20 20 6e 50 6c 61 79 62 61 63 6b 2c 20       nPlayback, 
1de70 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1de80 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
1de90 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
1dea0 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68  e variable may h
1deb0 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64  ave been updated
1dec0 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20   while rolling. 
1ded0 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e   ** back a journ
1dee0 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20  al created by a 
1def0 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64  process with a d
1df00 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20  ifferent sector 
1df10 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  size.  ** value.
1df20 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65   Reset it to the
1df30 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66   correct value f
1df40 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  or this process.
1df50 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f  .  */.  setSecto
1df60 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
1df70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1df80 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63  /*.** Read the c
1df90 6f 6e 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20  ontent for page 
1dfa0 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64  pPg out of the d
1dfb0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6f 72  atabase file (or
1dfc0 20 6f 75 74 20 6f 66 0a 2a 2a 20 74 68 65 20 57   out of.** the W
1dfd0 41 4c 20 69 66 20 74 68 61 74 20 69 73 20 77 68  AL if that is wh
1dfe0 65 72 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63  ere the most rec
1dff0 65 6e 74 20 63 6f 70 79 20 69 66 20 66 6f 75 6e  ent copy if foun
1e000 64 29 20 69 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d  d) into .** pPg-
1e010 3e 70 44 61 74 61 2e 20 41 20 73 68 61 72 65 64  >pData. A shared
1e020 20 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72   lock or greater
1e030 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 6e   must be held on
1e040 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
1e050 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 69   file before thi
1e060 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1e070 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  lled..**.** If p
1e080 61 67 65 20 31 20 69 73 20 72 65 61 64 2c 20 74  age 1 is read, t
1e090 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hen the value of
1e0a0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
1e0b0 73 5b 5d 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a  s[] is set to.**
1e0c0 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
1e0d0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1e0e0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
1e0f0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
1e100 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  urs, then the IO
1e110 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
1e120 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
1e130 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
1e140 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1e150 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1e160 20 69 6e 74 20 72 65 61 64 44 62 50 61 67 65 28   int readDbPage(
1e170 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
1e180 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1e190 50 67 2d 3e 70 50 61 67 65 72 3b 20 2f 2a 20 50  Pg->pPager; /* P
1e1a0 61 67 65 72 20 6f 62 6a 65 63 74 20 61 73 73 6f  ager object asso
1e1b0 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65  ciated with page
1e1c0 20 70 50 67 20 2a 2f 0a 20 20 69 6e 74 20 72 63   pPg */.  int rc
1e1d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
1e1e0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1e1f0 20 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 6e 64 65   code */..#ifnde
1e200 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1e210 4c 0a 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d  L.  u32 iFrame =
1e220 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1e230 20 2f 2a 20 46 72 61 6d 65 20 6f 66 20 57 41 4c   /* Frame of WAL
1e240 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 67 6e 6f   containing pgno
1e250 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1e260 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50  Pager->eState>=P
1e270 41 47 45 52 5f 52 45 41 44 45 52 20 26 26 20 21  AGER_READER && !
1e280 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
1e290 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
1e2a0 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 69 66 28 20  ->fd) );..  if( 
1e2b0 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
1e2c0 65 72 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  er) ){.    rc = 
1e2d0 73 71 6c 69 74 65 33 57 61 6c 46 69 6e 64 46 72  sqlite3WalFindFr
1e2e0 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ame(pPager->pWal
1e2f0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 26 69 46  , pPg->pgno, &iF
1e300 72 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72  rame);.    if( r
1e310 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1e320 20 7d 0a 20 20 69 66 28 20 69 46 72 61 6d 65 20   }.  if( iFrame 
1e330 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1e340 74 65 33 57 61 6c 52 65 61 64 46 72 61 6d 65 28  te3WalReadFrame(
1e350 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 69 46  pPager->pWal, iF
1e360 72 61 6d 65 2c 70 50 61 67 65 72 2d 3e 70 61 67  rame,pPager->pag
1e370 65 53 69 7a 65 2c 70 50 67 2d 3e 70 44 61 74 61  eSize,pPg->pData
1e380 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
1e390 66 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 69 4f  f.  {.    i64 iO
1e3a0 66 66 73 65 74 20 3d 20 28 70 50 67 2d 3e 70 67  ffset = (pPg->pg
1e3b0 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
1e3c0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
1e3d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
1e3e0 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
1e3f0 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50 61 67  pPg->pData, pPag
1e400 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 69 4f  er->pageSize, iO
1e410 66 66 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20  ffset);.    if( 
1e420 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
1e430 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
1e440 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1e450 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  _OK;.    }.  }..
1e460 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d    if( pPg->pgno=
1e470 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  =1 ){.    if( rc
1e480 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
1e490 74 68 65 20 72 65 61 64 20 69 73 20 75 6e 73 75  the read is unsu
1e4a0 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
1e4b0 65 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 74  e dbFileVers[] t
1e4c0 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20  o something.    
1e4d0 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e    ** that will n
1e4e0 65 76 65 72 20 62 65 20 61 20 76 61 6c 69 64 20  ever be a valid 
1e4f0 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20 64  file version.  d
1e500 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 61  bFileVers[] is a
1e510 20 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f   copy.      ** o
1e520 66 20 62 79 74 65 73 20 32 34 2e 2e 33 39 20 6f  f bytes 24..39 o
1e530 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
1e540 20 42 79 74 65 73 20 32 38 2e 2e 33 31 20 73 68   Bytes 28..31 sh
1e550 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 0a 20  ould always be. 
1e560 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 6f 72 20       ** zero or 
1e570 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1e580 64 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65  database in page
1e590 2e 20 42 79 74 65 73 20 33 32 2e 2e 33 35 20 61  . Bytes 32..35 a
1e5a0 6e 64 20 33 35 2e 2e 33 39 0a 20 20 20 20 20 20  nd 35..39.      
1e5b0 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 70 61 67  ** should be pag
1e5c0 65 20 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20  e numbers which 
1e5d0 61 72 65 20 6e 65 76 65 72 20 30 78 66 66 66 66  are never 0xffff
1e5e0 66 66 66 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e  ffff.  So fillin
1e5f0 67 0a 20 20 20 20 20 20 2a 2a 20 70 50 61 67 65  g.      ** pPage
1e600 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  r->dbFileVers[] 
1e610 77 69 74 68 20 61 6c 6c 20 30 78 66 66 20 62 79  with all 0xff by
1e620 74 65 73 20 73 68 6f 75 6c 64 20 73 75 66 66 69  tes should suffi
1e630 63 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ce..      **.   
1e640 20 20 20 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63     ** For an enc
1e650 72 79 70 74 65 64 20 64 61 74 61 62 61 73 65 2c  rypted database,
1e660 20 74 68 65 20 73 69 74 75 61 74 69 6f 6e 20 69   the situation i
1e670 73 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20  s more complex: 
1e680 20 62 79 74 65 73 0a 20 20 20 20 20 20 2a 2a 20   bytes.      ** 
1e690 32 34 2e 2e 33 39 20 6f 66 20 74 68 65 20 64 61  24..39 of the da
1e6a0 74 61 62 61 73 65 20 61 72 65 20 77 68 69 74 65  tabase are white
1e6b0 20 6e 6f 69 73 65 2e 20 20 42 75 74 20 74 68 65   noise.  But the
1e6c0 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a   probability of.
1e6d0 20 20 20 20 20 20 2a 2a 20 77 68 69 74 65 20 6e        ** white n
1e6e0 6f 69 73 65 20 65 71 75 61 6c 69 6e 67 20 31 36  oise equaling 16
1e6f0 20 62 79 74 65 73 20 6f 66 20 30 78 66 66 20 69   bytes of 0xff i
1e700 73 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  s vanishingly sm
1e710 61 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20  all so.      ** 
1e720 77 65 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20  we should still 
1e730 62 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a  be ok..      */.
1e740 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
1e750 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
1e760 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50   0xff, sizeof(pP
1e770 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1e780 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
1e790 20 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56       u8 *dbFileV
1e7a0 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67  ers = &((u8*)pPg
1e7b0 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20  ->pData)[24];.  
1e7c0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
1e7d0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
1e7e0 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
1e7f0 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
1e800 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20  eVers));.    }. 
1e810 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67   }.  CODEC1(pPag
1e820 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20  er, pPg->pData, 
1e830 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20 72 63  pPg->pgno, 3, rc
1e840 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
1e850 42 4b 50 54 29 3b 0a 0a 20 20 50 41 47 45 52 5f  BKPT);..  PAGER_
1e860 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
1e870 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29  er_readdb_count)
1e880 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70  ;.  PAGER_INCR(p
1e890 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20  Pager->nRead);. 
1e8a0 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20   IOTRACE(("PGIN 
1e8b0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
1e8c0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
1e8d0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45   PAGERTRACE(("FE
1e8e0 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68  TCH %d page %d h
1e8f0 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
1e900 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
1e910 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
1e920 67 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  g->pgno, pager_p
1e930 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a  agehash(pPg)));.
1e940 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e950 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68  ./*.** Update th
1e960 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63  e value of the c
1e970 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74  hange-counter at
1e980 20 6f 66 66 73 65 74 73 20 32 34 20 61 6e 64 20   offsets 24 and 
1e990 39 32 20 69 6e 0a 2a 2a 20 74 68 65 20 68 65 61  92 in.** the hea
1e9a0 64 65 72 20 61 6e 64 20 74 68 65 20 73 71 6c 69  der and the sqli
1e9b0 74 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  te version numbe
1e9c0 72 20 61 74 20 6f 66 66 73 65 74 20 39 36 2e 0a  r at offset 96..
1e9d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e  **.** This is an
1e9e0 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 75   unconditional u
1e9f0 70 64 61 74 65 2e 20 20 53 65 65 20 61 6c 73 6f  pdate.  See also
1ea00 20 74 68 65 20 70 61 67 65 72 5f 69 6e 63 72 5f   the pager_incr_
1ea10 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 0a  changecounter().
1ea20 2a 2a 20 72 6f 75 74 69 6e 65 20 77 68 69 63 68  ** routine which
1ea30 20 6f 6e 6c 79 20 75 70 64 61 74 65 73 20 74 68   only updates th
1ea40 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1ea50 20 69 66 20 74 68 65 20 75 70 64 61 74 65 20 69   if the update i
1ea60 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6e 65  s actually.** ne
1ea70 65 64 65 64 2c 20 61 73 20 64 65 74 65 72 6d 69  eded, as determi
1ea80 6e 65 64 20 62 79 20 74 68 65 20 70 50 61 67 65  ned by the pPage
1ea90 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
1eaa0 6e 65 20 73 74 61 74 65 20 76 61 72 69 61 62 6c  ne state variabl
1eab0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1eac0 64 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68  d pager_write_ch
1ead0 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 67 48 64  angecounter(PgHd
1eae0 72 20 2a 70 50 67 29 7b 0a 20 20 75 33 32 20 63  r *pPg){.  u32 c
1eaf0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 0a  hange_counter;..
1eb00 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
1eb10 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65  he value just re
1eb20 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20  ad and write it 
1eb30 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e  back to byte 24.
1eb40 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75   */.  change_cou
1eb50 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65  nter = sqlite3Ge
1eb60 74 34 62 79 74 65 28 28 75 38 2a 29 70 50 67 2d  t4byte((u8*)pPg-
1eb70 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  >pPager->dbFileV
1eb80 65 72 73 29 2b 31 3b 0a 20 20 70 75 74 33 32 62  ers)+1;.  put32b
1eb90 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 2d  its(((char*)pPg-
1eba0 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e  >pData)+24, chan
1ebb0 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20  ge_counter);..  
1ebc0 2f 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68  /* Also store th
1ebd0 65 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e  e SQLite version
1ebe0 20 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73   number in bytes
1ebf0 20 39 36 2e 2e 39 39 20 61 6e 64 20 69 6e 0a 20   96..99 and in. 
1ec00 20 2a 2a 20 62 79 74 65 73 20 39 32 2e 2e 39 35   ** bytes 92..95
1ec10 20 73 74 6f 72 65 20 74 68 65 20 63 68 61 6e 67   store the chang
1ec20 65 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 77 68  e counter for wh
1ec30 69 63 68 20 74 68 65 20 76 65 72 73 69 6f 6e 20  ich the version 
1ec40 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 69 73 20 76  number.  ** is v
1ec50 61 6c 69 64 2e 20 2a 2f 0a 20 20 70 75 74 33 32  alid. */.  put32
1ec60 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67  bits(((char*)pPg
1ec70 2d 3e 70 44 61 74 61 29 2b 39 32 2c 20 63 68 61  ->pData)+92, cha
1ec80 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20  nge_counter);.  
1ec90 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
1eca0 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 36  *)pPg->pData)+96
1ecb0 2c 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e  , SQLITE_VERSION
1ecc0 5f 4e 55 4d 42 45 52 29 3b 0a 7d 0a 0a 23 69 66  _NUMBER);.}..#if
1ecd0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1ece0 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  _WAL./*.** This 
1ecf0 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f  function is invo
1ed00 6b 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ked once for eac
1ed10 68 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  h page that has 
1ed20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a  already been .**
1ed30 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1ed40 65 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20  e log file when 
1ed50 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f  a WAL transactio
1ed60 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1ed70 2e 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69  ..** Parameter i
1ed80 50 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e  Pg is the page n
1ed90 75 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61  umber of said pa
1eda0 67 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67  ge. The pCtx arg
1edb0 75 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74  ument .** is act
1edc0 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  ually a pointer 
1edd0 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72  to the Pager str
1ede0 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
1edf0 20 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65   page iPg is pre
1ee00 73 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68  sent in the cach
1ee10 65 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75  e, and has no ou
1ee20 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
1ee30 6e 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64  nces,.** it is d
1ee40 69 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77  iscarded. Otherw
1ee50 69 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72  ise, if there ar
1ee60 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75  e one or more ou
1ee70 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66  tstanding.** ref
1ee80 65 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67  erences, the pag
1ee90 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c  e content is rel
1eea0 6f 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64  oaded from the d
1eeb0 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a  atabase. If the.
1eec0 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65  ** attempt to re
1eed0 6c 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f  load content fro
1eee0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  m the database i
1eef0 73 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66  s required and f
1ef00 61 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e  ails, .** return
1ef10 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1ef20 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65   code. Otherwise
1ef30 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  , SQLITE_OK..*/.
1ef40 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1ef50 55 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69  UndoCallback(voi
1ef60 64 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50  d *pCtx, Pgno iP
1ef70 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
1ef80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1ef90 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67  r *pPager = (Pag
1efa0 65 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48  er *)pCtx;.  PgH
1efb0 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65  dr *pPg;..  asse
1efc0 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
1efd0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 67  pPager) );.  pPg
1efe0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
1eff0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50  ookup(pPager, iP
1f000 67 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b  g);.  if( pPg ){
1f010 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1f020 50 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75  PcachePageRefcou
1f030 6e 74 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20  nt(pPg)==1 ){.  
1f040 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
1f050 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20  eDrop(pPg);.    
1f060 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1f070 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67  = readDbPage(pPg
1f080 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1f090 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f0a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52        pPager->xR
1f0b0 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20  einiter(pPg);.  
1f0c0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1f0d0 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74  te3PagerUnrefNot
1f0e0 4e 75 6c 6c 28 70 50 67 29 3b 0a 20 20 20 20 7d  Null(pPg);.    }
1f0f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61  .  }..  /* Norma
1f100 6c 6c 79 2c 20 69 66 20 61 20 74 72 61 6e 73 61  lly, if a transa
1f110 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
1f120 62 61 63 6b 2c 20 61 6e 79 20 62 61 63 6b 75 70  back, any backup
1f130 20 70 72 6f 63 65 73 73 65 73 20 61 72 65 0a 20   processes are. 
1f140 20 2a 2a 20 75 70 64 61 74 65 64 20 61 73 20 64   ** updated as d
1f150 61 74 61 20 69 73 20 63 6f 70 69 65 64 20 6f 75  ata is copied ou
1f160 74 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63  t of the rollbac
1f170 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 6e  k journal and in
1f180 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  to the.  ** data
1f190 62 61 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f  base. This is no
1f1a0 74 20 67 65 6e 65 72 61 6c 6c 79 20 70 6f 73 73  t generally poss
1f1b0 69 62 6c 65 20 77 69 74 68 20 61 20 57 41 4c 20  ible with a WAL 
1f1c0 64 61 74 61 62 61 73 65 2c 20 61 73 0a 20 20 2a  database, as.  *
1f1d0 2a 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 76 6f 6c  * rollback invol
1f1e0 76 65 73 20 73 69 6d 70 6c 79 20 74 72 75 6e 63  ves simply trunc
1f1f0 61 74 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69  ating the log fi
1f200 6c 65 2e 20 54 68 65 72 65 66 6f 72 65 2c 20 69  le. Therefore, i
1f210 66 20 6f 6e 65 0a 20 20 2a 2a 20 6f 72 20 6d 6f  f one.  ** or mo
1f220 72 65 20 66 72 61 6d 65 73 20 68 61 76 65 20 61  re frames have a
1f230 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
1f240 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 28  ten to the log (
1f250 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 0a 20  and therefore . 
1f260 20 2a 2a 20 61 6c 73 6f 20 63 6f 70 69 65 64 20   ** also copied 
1f270 69 6e 74 6f 20 74 68 65 20 62 61 63 6b 75 70 20  into the backup 
1f280 64 61 74 61 62 61 73 65 73 29 20 61 73 20 70 61  databases) as pa
1f290 72 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73  rt of this trans
1f2a0 61 63 74 69 6f 6e 2c 0a 20 20 2a 2a 20 74 68 65  action,.  ** the
1f2b0 20 62 61 63 6b 75 70 73 20 6d 75 73 74 20 62 65   backups must be
1f2c0 20 72 65 73 74 61 72 74 65 64 2e 0a 20 20 2a 2f   restarted..  */
1f2d0 0a 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70  .  sqlite3Backup
1f2e0 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e  Restart(pPager->
1f2f0 70 42 61 63 6b 75 70 29 3b 0a 0a 20 20 72 65 74  pBackup);..  ret
1f300 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1f310 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1f320 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c  s called to roll
1f330 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69  back a transacti
1f340 6f 6e 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61  on on a WAL data
1f350 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
1f360 69 6e 74 20 70 61 67 65 72 52 6f 6c 6c 62 61 63  int pagerRollbac
1f370 6b 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  kWal(Pager *pPag
1f380 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
1f390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3a0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1f3b0 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 48 64 72   Code */.  PgHdr
1f3c0 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20   *pList;        
1f3d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
1f3e0 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65  st of dirty page
1f3f0 73 20 74 6f 20 72 65 76 65 72 74 20 2a 2f 0a 0a  s to revert */..
1f400 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 70 61 67    /* For all pag
1f410 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  es in the cache 
1f420 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74  that are current
1f430 6c 79 20 64 69 72 74 79 20 6f 72 20 68 61 76 65  ly dirty or have
1f440 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65   already.  ** be
1f450 65 6e 20 77 72 69 74 74 65 6e 20 28 62 75 74 20  en written (but 
1f460 6e 6f 74 20 63 6f 6d 6d 69 74 74 65 64 29 20 74  not committed) t
1f470 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2c 20  o the log file, 
1f480 64 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 0a 20  do one of the . 
1f490 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20   ** following:. 
1f4a0 20 2a 2a 0a 20 20 2a 2a 20 20 20 2b 20 44 69 73   **.  **   + Dis
1f4b0 63 61 72 64 20 74 68 65 20 63 61 63 68 65 64 20  card the cached 
1f4c0 70 61 67 65 20 28 69 66 20 72 65 66 63 6f 75 6e  page (if refcoun
1f4d0 74 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a 20 20  t==0), or.  **  
1f4e0 20 2b 20 52 65 6c 6f 61 64 20 70 61 67 65 20 63   + Reload page c
1f4f0 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ontent from the 
1f500 64 61 74 61 62 61 73 65 20 28 69 66 20 72 65 66  database (if ref
1f510 63 6f 75 6e 74 3e 30 29 2e 0a 20 20 2a 2f 0a 20  count>0)..  */. 
1f520 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1f530 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  = pPager->dbOrig
1f540 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Size;.  rc = sql
1f550 69 74 65 33 57 61 6c 55 6e 64 6f 28 70 50 61 67  ite3WalUndo(pPag
1f560 65 72 2d 3e 70 57 61 6c 2c 20 70 61 67 65 72 55  er->pWal, pagerU
1f570 6e 64 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  ndoCallback, (vo
1f580 69 64 20 2a 29 70 50 61 67 65 72 29 3b 0a 20 20  id *)pPager);.  
1f590 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50  pList = sqlite3P
1f5a0 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
1f5b0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
1f5c0 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20  .  while( pList 
1f5d0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1f5e0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
1f5f0 4e 65 78 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44  Next = pList->pD
1f600 69 72 74 79 3b 0a 20 20 20 20 72 63 20 3d 20 70  irty;.    rc = p
1f610 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b  agerUndoCallback
1f620 28 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c  ((void *)pPager,
1f630 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20   pList->pgno);. 
1f640 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 78 74     pList = pNext
1f650 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1f660 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1f670 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1f680 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73  wrapper around s
1f690 71 6c 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28  qlite3WalFrames(
1f6a0 29 2e 20 41 73 20 77 65 6c 6c 20 61 73 20 6c 6f  ). As well as lo
1f6b0 67 67 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 6e  gging.** the con
1f6c0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6c 69 73  tents of the lis
1f6d0 74 20 6f 66 20 70 61 67 65 73 20 68 65 61 64 65  t of pages heade
1f6e0 64 20 62 79 20 70 4c 69 73 74 20 28 63 6f 6e 6e  d by pList (conn
1f6f0 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79 29  ected by pDirty)
1f700 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  ,.** this functi
1f710 6f 6e 20 6e 6f 74 69 66 69 65 73 20 61 6e 79 20  on notifies any 
1f720 61 63 74 69 76 65 20 62 61 63 6b 75 70 20 70 72  active backup pr
1f730 6f 63 65 73 73 65 73 20 74 68 61 74 20 74 68 65  ocesses that the
1f740 20 70 61 67 65 73 20 68 61 76 65 0a 2a 2a 20 63   pages have.** c
1f750 68 61 6e 67 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  hanged. .**.** T
1f760 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73  he list of pages
1f770 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 69   passed into thi
1f780 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6c 77  s routine is alw
1f790 61 79 73 20 73 6f 72 74 65 64 20 62 79 20 70 61  ays sorted by pa
1f7a0 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 48 65  ge number..** He
1f7b0 6e 63 65 2c 20 69 66 20 70 61 67 65 20 31 20 61  nce, if page 1 a
1f7c0 70 70 65 61 72 73 20 61 6e 79 77 68 65 72 65 20  ppears anywhere 
1f7d0 6f 6e 20 74 68 65 20 6c 69 73 74 2c 20 69 74 20  on the list, it 
1f7e0 77 69 6c 6c 20 62 65 20 74 68 65 20 66 69 72 73  will be the firs
1f7f0 74 20 70 61 67 65 2e 0a 2a 2f 20 0a 73 74 61 74  t page..*/ .stat
1f800 69 63 20 69 6e 74 20 70 61 67 65 72 57 61 6c 46  ic int pagerWalF
1f810 72 61 6d 65 73 28 0a 20 20 50 61 67 65 72 20 2a  rames(.  Pager *
1f820 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
1f830 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
1f840 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 50 67  r object */.  Pg
1f850 48 64 72 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  Hdr *pList,     
1f860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f870 20 4c 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20   List of frames 
1f880 74 6f 20 6c 6f 67 20 2a 2f 0a 20 20 50 67 6e 6f  to log */.  Pgno
1f890 20 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20   nTruncate,     
1f8a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1f8b0 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 66 74  atabase size aft
1f8c0 65 72 20 74 68 69 73 20 63 6f 6d 6d 69 74 20 2a  er this commit *
1f8d0 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74  /.  int isCommit
1f8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8f0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
1f900 68 69 73 20 69 73 20 61 20 63 6f 6d 6d 69 74 20  his is a commit 
1f910 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
1f920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f930 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1f940 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
1f950 6e 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  nList;          
1f960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1f970 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1f980 6e 20 70 4c 69 73 74 20 2a 2f 0a 20 20 50 67 48  n pList */.  PgH
1f990 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  dr *p;          
1f9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f9b0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
1f9c0 20 70 61 67 65 73 20 2a 2f 0a 0a 20 20 61 73 73   pages */..  ass
1f9d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57 61  ert( pPager->pWa
1f9e0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
1f9f0 4c 69 73 74 20 29 3b 0a 23 69 66 64 65 66 20 53  List );.#ifdef S
1fa00 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
1fa10 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
1fa20 20 70 61 67 65 20 6c 69 73 74 20 69 73 20 69 6e   page list is in
1fa30 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   accending order
1fa40 20 2a 2f 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73   */.  for(p=pLis
1fa50 74 3b 20 70 20 26 26 20 70 2d 3e 70 44 69 72 74  t; p && p->pDirt
1fa60 79 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  y; p=p->pDirty){
1fa70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
1fa80 70 67 6e 6f 20 3c 20 70 2d 3e 70 44 69 72 74 79  pgno < p->pDirty
1fa90 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 7d 0a 23 65  ->pgno );.  }.#e
1faa0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
1fab0 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3d 3d 30  pList->pDirty==0
1fac0 20 7c 7c 20 69 73 43 6f 6d 6d 69 74 20 29 3b 0a   || isCommit );.
1fad0 20 20 69 66 28 20 69 73 43 6f 6d 6d 69 74 20 29    if( isCommit )
1fae0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 57 41  {.    /* If a WA
1faf0 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  L transaction is
1fb00 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64   being committed
1fb10 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f  , there is no po
1fb20 69 6e 74 20 69 6e 20 77 72 69 74 69 6e 67 0a 20  int in writing. 
1fb30 20 20 20 2a 2a 20 61 6e 79 20 70 61 67 65 73 20     ** any pages 
1fb40 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
1fb50 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6e  s greater than n
1fb60 54 72 75 6e 63 61 74 65 20 69 6e 74 6f 20 74 68  Truncate into th
1fb70 65 20 57 41 4c 20 66 69 6c 65 2e 0a 20 20 20 20  e WAL file..    
1fb80 2a 2a 20 54 68 65 79 20 77 69 6c 6c 20 6e 65 76  ** They will nev
1fb90 65 72 20 62 65 20 72 65 61 64 20 62 79 20 61 6e  er be read by an
1fba0 79 20 63 6c 69 65 6e 74 2e 20 53 6f 20 72 65 6d  y client. So rem
1fbb0 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68  ove them from th
1fbc0 65 20 70 44 69 72 74 79 0a 20 20 20 20 2a 2a 20  e pDirty.    ** 
1fbd0 6c 69 73 74 20 68 65 72 65 2e 20 2a 2f 0a 20 20  list here. */.  
1fbe0 20 20 50 67 48 64 72 20 2a 2a 70 70 4e 65 78 74    PgHdr **ppNext
1fbf0 20 3d 20 26 70 4c 69 73 74 3b 0a 20 20 20 20 6e   = &pList;.    n
1fc00 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f  List = 0;.    fo
1fc10 72 28 70 3d 70 4c 69 73 74 3b 20 28 2a 70 70 4e  r(p=pList; (*ppN
1fc20 65 78 74 20 3d 20 70 29 21 3d 30 3b 20 70 3d 70  ext = p)!=0; p=p
1fc30 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20  ->pDirty){.     
1fc40 20 69 66 28 20 70 2d 3e 70 67 6e 6f 3c 3d 6e 54   if( p->pgno<=nT
1fc50 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20  runcate ){.     
1fc60 20 20 20 70 70 4e 65 78 74 20 3d 20 26 70 2d 3e     ppNext = &p->
1fc70 70 44 69 72 74 79 3b 0a 20 20 20 20 20 20 20 20  pDirty;.        
1fc80 6e 4c 69 73 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  nList++;.      }
1fc90 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1fca0 74 28 20 70 4c 69 73 74 20 29 3b 0a 20 20 7d 65  t( pList );.  }e
1fcb0 6c 73 65 7b 0a 20 20 20 20 6e 4c 69 73 74 20 3d  lse{.    nList =
1fcc0 20 31 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   1;.  }.  pPager
1fcd0 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54  ->aStat[PAGER_ST
1fce0 41 54 5f 57 52 49 54 45 5d 20 2b 3d 20 6e 4c 69  AT_WRITE] += nLi
1fcf0 73 74 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74  st;..  if( pList
1fd00 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61 67 65  ->pgno==1 ) page
1fd10 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65 63 6f  r_write_changeco
1fd20 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a 20 20  unter(pList);.  
1fd30 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
1fd40 72 61 6d 65 73 28 70 50 61 67 65 72 2d 3e 70 57  rames(pPager->pW
1fd50 61 6c 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65  al, .      pPage
1fd60 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 4c 69  r->pageSize, pLi
1fd70 73 74 2c 20 6e 54 72 75 6e 63 61 74 65 2c 20 69  st, nTruncate, i
1fd80 73 43 6f 6d 6d 69 74 2c 20 70 50 61 67 65 72 2d  sCommit, pPager-
1fd90 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a 20 20  >walSyncFlags.  
1fda0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1fdb0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
1fdc0 2d 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20  ->pBackup ){.   
1fdd0 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b   for(p=pList; p;
1fde0 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20   p=p->pDirty){. 
1fdf0 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b       sqlite3Back
1fe00 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d  upUpdate(pPager-
1fe10 3e 70 42 61 63 6b 75 70 2c 20 70 2d 3e 70 67 6e  >pBackup, p->pgn
1fe20 6f 2c 20 28 75 38 20 2a 29 70 2d 3e 70 44 61 74  o, (u8 *)p->pDat
1fe30 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  a);.    }.  }..#
1fe40 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
1fe50 43 4b 5f 50 41 47 45 53 0a 20 20 70 4c 69 73 74  CK_PAGES.  pList
1fe60 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
1fe70 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
1fe80 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 66 6f  ->pPCache);.  fo
1fe90 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d  r(p=pList; p; p=
1fea0 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
1feb0 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
1fec0 73 68 28 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  sh(p);.  }.#endi
1fed0 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
1fee0 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
1fef0 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
1ff00 6e 20 6f 6e 20 74 68 65 20 57 41 4c 2e 0a 2a 2a  n on the WAL..**
1ff10 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1ff20 20 75 73 65 64 20 74 6f 20 62 65 20 63 61 6c 6c   used to be call
1ff30 65 64 20 22 70 61 67 65 72 4f 70 65 6e 53 6e 61  ed "pagerOpenSna
1ff40 70 73 68 6f 74 28 29 22 20 62 65 63 61 75 73 65  pshot()" because
1ff50 20 69 74 20 65 73 73 65 6e 74 69 61 6c 6c 79 0a   it essentially.
1ff60 2a 2a 20 6d 61 6b 65 73 20 61 20 73 6e 61 70 73  ** makes a snaps
1ff70 68 6f 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  hot of the datab
1ff80 61 73 65 20 61 74 20 74 68 65 20 63 75 72 72 65  ase at the curre
1ff90 6e 74 20 70 6f 69 6e 74 20 69 6e 20 74 69 6d 65  nt point in time
1ffa0 20 61 6e 64 20 70 72 65 73 65 72 76 65 73 0a 2a   and preserves.*
1ffb0 2a 20 74 68 61 74 20 73 6e 61 70 73 68 6f 74 20  * that snapshot 
1ffc0 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 72  for use by the r
1ffd0 65 61 64 65 72 20 69 6e 20 73 70 69 74 65 20 6f  eader in spite o
1ffe0 66 20 63 6f 6e 63 75 72 72 65 6e 74 6c 79 20 63  f concurrently c
1fff0 68 61 6e 67 65 73 20 62 79 0a 2a 2a 20 6f 74 68  hanges by.** oth
20000 65 72 20 77 72 69 74 65 72 73 20 6f 72 20 63 68  er writers or ch
20010 65 63 6b 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a  eckpointers..*/.
20020 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
20030 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
20040 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67  tion(Pager *pPag
20050 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
20060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20070 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
20080 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63   code */.  int c
20090 68 61 6e 67 65 64 20 3d 20 30 3b 20 20 20 20 20  hanged = 0;     
200a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
200b0 75 65 20 69 66 20 63 61 63 68 65 20 6d 75 73 74  ue if cache must
200c0 20 62 65 20 72 65 73 65 74 20 2a 2f 0a 0a 20 20   be reset */..  
200d0 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
200e0 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20  Wal(pPager) );. 
200f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20100 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f  >eState==PAGER_O
20110 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  PEN || pPager->e
20120 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
20130 44 45 52 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c  DER );..  /* sql
20140 69 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72  ite3WalEndReadTr
20150 61 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20  ansaction() was 
20160 6e 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74  not called for t
20170 68 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a  he previous.  **
20180 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
20190 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43  locking_mode=EXC
201a0 4c 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c  LUSIVE.  So call
201b0 20 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a   it now.  If we.
201c0 20 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b    ** are in lock
201d0 69 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20  ing_mode=NORMAL 
201e0 61 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77 61  and EndRead() wa
201f0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c  s previously cal
20200 6c 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75  led,.  ** the du
20210 70 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20  plicate call is 
20220 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20  harmless..  */. 
20230 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65   sqlite3WalEndRe
20240 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  adTransaction(pP
20250 61 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20  ager->pWal);..  
20260 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42  rc = sqlite3WalB
20270 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74  eginReadTransact
20280 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
20290 2c 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69  , &changed);.  i
202a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
202b0 20 7c 7c 20 63 68 61 6e 67 65 64 20 29 7b 0a 20   || changed ){. 
202c0 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
202d0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
202e0 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29  USEFETCH(pPager)
202f0 20 29 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65   ) sqlite3OsUnfe
20300 74 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  tch(pPager->fd, 
20310 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  0, 0);.  }..  re
20320 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
20330 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
20340 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
20350 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
20360 74 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20  transition from 
20370 50 41 47 45 52 5f 4f 50 45 4e 0a 2a 2a 20 74 6f  PAGER_OPEN.** to
20380 20 50 41 47 45 52 5f 52 45 41 44 45 52 20 73 74   PAGER_READER st
20390 61 74 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ate to determine
203a0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
203b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a   database file.*
203c0 2a 20 69 6e 20 70 61 67 65 73 20 28 61 73 73 75  * in pages (assu
203d0 6d 69 6e 67 20 74 68 65 20 70 61 67 65 20 73 69  ming the page si
203e0 7a 65 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  ze currently sto
203f0 72 65 64 20 69 6e 20 50 61 67 65 72 2e 70 61 67  red in Pager.pag
20400 65 53 69 7a 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  eSize)..**.** If
20410 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
20420 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
20430 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
20440 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
20450 62 61 73 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73  base.** in pages
20460 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 2a 70   is stored in *p
20470 6e 50 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65  nPage. Otherwise
20480 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
20490 28 70 65 72 68 61 70 73 0a 2a 2a 20 53 51 4c 49  (perhaps.** SQLI
204a0 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 20  TE_IOERR_FSTAT) 
204b0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
204c0 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20  *pnPage is left 
204d0 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73  unmodified..*/.s
204e0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50  tatic int pagerP
204f0 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
20500 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 2a 70 6e  pPager, Pgno *pn
20510 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50  Page){.  Pgno nP
20520 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
20530 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
20540 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20  e to return via 
20550 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a  *pnPage */..  /*
20560 20 51 75 65 72 79 20 74 68 65 20 57 41 4c 20 73   Query the WAL s
20570 75 62 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68  ub-system for th
20580 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 2e  e database size.
20590 20 54 68 65 20 57 61 6c 44 62 73 69 7a 65 28 29   The WalDbsize()
205a0 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  .  ** function r
205b0 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 74  eturns zero if t
205c0 68 65 20 57 41 4c 20 69 73 20 6e 6f 74 20 6f 70  he WAL is not op
205d0 65 6e 20 28 69 2e 65 2e 20 50 61 67 65 72 2e 70  en (i.e. Pager.p
205e0 57 61 6c 3d 3d 30 29 2c 20 6f 72 0a 20 20 2a 2a  Wal==0), or.  **
205f0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
20600 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 76 61   size is not ava
20610 69 6c 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61  ilable. The data
20620 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  base size is not
20630 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  .  ** available 
20640 66 72 6f 6d 20 74 68 65 20 57 41 4c 20 73 75 62  from the WAL sub
20650 2d 73 79 73 74 65 6d 20 69 66 20 74 68 65 20 6c  -system if the l
20660 6f 67 20 66 69 6c 65 20 69 73 20 65 6d 70 74 79  og file is empty
20670 20 6f 72 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e   or.  ** contain
20680 73 20 6e 6f 20 76 61 6c 69 64 20 63 6f 6d 6d 69  s no valid commi
20690 74 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  tted transaction
206a0 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  s..  */.  assert
206b0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
206c0 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
206d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
206e0 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f  ->eLock>=SHARED_
206f0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
20700 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
20710 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74  >fd) );.  assert
20720 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
20730 6c 65 3d 3d 30 20 29 3b 0a 20 20 6e 50 61 67 65  le==0 );.  nPage
20740 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 44 62 73   = sqlite3WalDbs
20750 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ize(pPager->pWal
20760 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
20770 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
20780 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
20790 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
207a0 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 57   from the.  ** W
207b0 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 2c 20 64  AL sub-system, d
207c0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 70 61 67  etermine the pag
207d0 65 20 63 6f 75 6e 74 20 62 61 73 65 64 20 6f 6e  e count based on
207e0 20 74 68 65 20 73 69 7a 65 20 6f 66 0a 20 20 2a   the size of.  *
207f0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
20800 69 6c 65 2e 20 20 49 66 20 74 68 65 20 73 69 7a  ile.  If the siz
20810 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
20820 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6e  e file is not an
20830 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6d 75  .  ** integer mu
20840 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
20850 67 65 2d 73 69 7a 65 2c 20 72 6f 75 6e 64 20 75  ge-size, round u
20860 70 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20 20  p the result..  
20870 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  */.  if( nPage==
20880 30 20 26 26 20 41 4c 57 41 59 53 28 69 73 4f 70  0 && ALWAYS(isOp
20890 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 29 20  en(pPager->fd)) 
208a0 29 7b 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30  ){.    i64 n = 0
208b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
208c0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
208d0 64 62 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  db file in bytes
208e0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   */.    int rc =
208f0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
20900 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
20910 6e 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  n);.    if( rc!=
20920 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20930 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
20940 20 20 7d 0a 20 20 20 20 6e 50 61 67 65 20 3d 20    }.    nPage = 
20950 28 50 67 6e 6f 29 28 28 6e 2b 70 50 61 67 65 72  (Pgno)((n+pPager
20960 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 20 2f 20  ->pageSize-1) / 
20970 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
20980 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
20990 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62  the current numb
209a0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
209b0 68 65 20 66 69 6c 65 20 69 73 20 67 72 65 61 74  he file is great
209c0 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 2a 2a  er than the.  **
209d0 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69   configured maxi
209e0 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72  mum pager number
209f0 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 61  , increase the a
20a00 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a  llowed limit so.
20a10 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69    ** that the fi
20a20 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a  le can be read..
20a30 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65    */.  if( nPage
20a40 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
20a50 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
20a60 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50  xPgno = (Pgno)nP
20a70 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2a 70 6e 50  age;.  }..  *pnP
20a80 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72  age = nPage;.  r
20a90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20aa0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
20ab0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
20ac0 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 2a  * Check if the *
20ad0 2d 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63  -wal file that c
20ae0 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
20af0 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  e database opene
20b00 64 20 62 79 20 70 50 61 67 65 72 0a 2a 2a 20 65  d by pPager.** e
20b10 78 69 73 74 73 20 69 66 20 74 68 65 20 64 61 74  xists if the dat
20b20 61 62 61 73 65 20 69 73 20 6e 6f 74 20 65 6d 70  abase is not emp
20b30 79 2c 20 6f 72 20 76 65 72 69 66 79 20 74 68 61  y, or verify tha
20b40 74 20 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65  t the *-wal file
20b50 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69   does.** not exi
20b60 73 74 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20  st (by deleting 
20b70 69 74 29 20 69 66 20 74 68 65 20 64 61 74 61 62  it) if the datab
20b80 61 73 65 20 66 69 6c 65 20 69 73 20 65 6d 70 74  ase file is empt
20b90 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
20ba0 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
20bb0 65 6d 70 74 79 20 61 6e 64 20 74 68 65 20 2a 2d  empty and the *-
20bc0 77 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  wal file exists,
20bd0 20 6f 70 65 6e 20 74 68 65 20 70 61 67 65 72 0a   open the pager.
20be0 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20  ** in WAL mode. 
20bf0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
20c00 20 69 73 20 65 6d 70 74 79 20 6f 72 20 69 66 20   is empty or if 
20c10 6e 6f 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78  no *-wal file ex
20c20 69 73 74 73 20 61 6e 64 0a 2a 2a 20 69 66 20 6e  ists and.** if n
20c30 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  o error occurs, 
20c40 6d 61 6b 65 20 73 75 72 65 20 50 61 67 65 72 2e  make sure Pager.
20c50 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 20 6e  journalMode is n
20c60 6f 74 20 73 65 74 20 74 6f 0a 2a 2a 20 50 41 47  ot set to.** PAG
20c70 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
20c80 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  AL..**.** Return
20c90 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 61 6e   SQLITE_OK or an
20ca0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
20cb0 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
20cc0 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44  st hold a SHARED
20cd0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
20ce0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61  abase file to ca
20cf0 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ll this.** funct
20d00 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20  ion. Because an 
20d10 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
20d20 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 73  n the db file is
20d30 20 72 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c   required to del
20d40 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 20 6f 6e  ete .** a WAL on
20d50 20 61 20 6e 6f 6e 65 2d 65 6d 70 74 79 20 64 61   a none-empty da
20d60 74 61 62 61 73 65 2c 20 74 68 69 73 20 65 6e 73  tabase, this ens
20d70 75 72 65 73 20 74 68 65 72 65 20 69 73 20 6e 6f  ures there is no
20d80 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20   race condition 
20d90 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20  .** between the 
20da0 78 41 63 63 65 73 73 28 29 20 62 65 6c 6f 77 20  xAccess() below 
20db0 61 6e 64 20 61 6e 20 78 44 65 6c 65 74 65 28 29  and an xDelete()
20dc0 20 62 65 69 6e 67 20 65 78 65 63 75 74 65 64 20   being executed 
20dd0 62 79 20 73 6f 6d 65 20 0a 2a 2a 20 6f 74 68 65  by some .** othe
20de0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  r connection..*/
20df0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
20e00 72 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e  rOpenWalIfPresen
20e10 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
20e20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
20e30 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
20e40 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
20e50 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
20e60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20e70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45 44 5f  ->eLock>=SHARED_
20e80 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 21  LOCK );..  if( !
20e90 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
20ea0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 57 61   ){.    int isWa
20eb0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
20ec0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
20ed0 20 57 41 4c 20 66 69 6c 65 20 65 78 69 73 74 73   WAL file exists
20ee0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
20ef0 69 74 65 33 4f 73 41 63 63 65 73 73 28 0a 20 20  ite3OsAccess(.  
20f00 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 56        pPager->pV
20f10 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c  fs, pPager->zWal
20f20 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
20f30 45 58 49 53 54 53 2c 20 26 69 73 57 61 6c 0a 20  EXISTS, &isWal. 
20f40 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63     );.    if( rc
20f50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20f60 20 20 20 20 20 69 66 28 20 69 73 57 61 6c 20 29       if( isWal )
20f70 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6e  {.        Pgno n
20f80 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
20f90 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
20fa0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
20fb0 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20  file */..       
20fc0 20 72 63 20 3d 20 70 61 67 65 72 50 61 67 65 63   rc = pagerPagec
20fd0 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
20fe0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
20ff0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
21000 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 50  ;.        if( nP
21010 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
21020 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21030 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
21040 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  >pVfs, pPager->z
21050 57 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Wal, 0);.       
21060 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21070 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
21080 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75  te3PcachePagecou
21090 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
210a0 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  he)==0 );.      
210b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
210c0 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 50 61  PagerOpenWal(pPa
210d0 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ger, 0, 0);.    
210e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
210f0 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
21100 75 72 6e 61 6c 4d 6f 64 65 3e 3d 50 41 47 45 52  urnalMode>=PAGER
21110 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
21120 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
21130 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
21140 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  = PAGER_JOURNALM
21150 4f 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20  ODE_DELETE;.    
21160 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
21170 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
21180 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  dif../*.** Playb
21190 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53  ack savepoint pS
211a0 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66  avepoint. Or, if
211b0 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
211c0 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b  L, then playback
211d0 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d  .** the entire m
211e0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
211f0 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70 53 61  le. The case pSa
21200 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63  vepoint==NULL oc
21210 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20  curs when .** a 
21220 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d  ROLLBACK TO comm
21230 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f  and is invoked o
21240 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68  n a SAVEPOINT th
21250 61 74 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  at is a transact
21260 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  ion .** savepoin
21270 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53  t..**.** When pS
21280 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20  avepoint is not 
21290 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20  NULL (meaning a 
212a0 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  non-transaction 
212b0 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a  savepoint is .**
212c0 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
212d0 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  ck), then the ro
212e0 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20  llback consists 
212f0 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65 20 73  of up to three s
21300 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72  tages,.** perfor
21310 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72  med in the order
21320 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a   specified:.**.*
21330 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20  *   * Pages are 
21340 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
21350 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
21360 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 79  l starting at by
21370 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74  te.**     offset
21380 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
21390 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74  iOffset and cont
213a0 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20  inuing to .**   
213b0 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
213c0 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20  .iHdrOffset, or 
213d0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
213e0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a  e main journal.*
213f0 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20 50 61  *     file if Pa
21400 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
21410 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e  rOffset is zero.
21420 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61  .**.**   * If Pa
21430 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
21440 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a  rOffset is not z
21450 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20  ero, then pages 
21460 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20  are played.**   
21470 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20    back starting 
21480 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
21490 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74   header immediat
214a0 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a  ely following .*
214b0 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
214c0 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20  oint.iHdrOffset 
214d0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
214e0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
214f0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50  ile..**.**   * P
21500 61 67 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c  ages are then pl
21510 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
21520 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
21530 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a  ile, starting.**
21540 20 20 20 20 20 77 69 74 68 20 74 68 65 20 50 61       with the Pa
21550 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75  gerSavepoint.iSu
21560 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75  bRec and continu
21570 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ing to the end o
21580 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75  f.**     the jou
21590 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rnal file..**.**
215a0 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20   Throughout the 
215b0 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73  rollback process
215c0 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20 70 61  , each time a pa
215d0 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  ge is rolled bac
215e0 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  k, the.** corres
215f0 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73  ponding bit is s
21600 65 74 20 69 6e 20 61 20 62 69 74 76 65 63 20 73  et in a bitvec s
21610 74 72 75 63 74 75 72 65 20 28 76 61 72 69 61 62  tructure (variab
21620 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a  le pDone in the.
21630 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
21640 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69  n below). This i
21650 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65  s used to ensure
21660 20 74 68 61 74 20 61 20 70 61 67 65 20 69 73 20   that a page is 
21670 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  only.** rolled b
21680 61 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ack the first ti
21690 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74  me it is encount
216a0 65 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a  ered in either j
216b0 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
216c0 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e   pSavepoint is N
216d0 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20  ULL, then pages 
216e0 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20  are only played 
216f0 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61  back from the ma
21700 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  in.** journal fi
21710 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  le. There is no 
21720 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74 76 65  need for a bitve
21730 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  c in this case..
21740 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20  **.** In either 
21750 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61  case, before pla
21760 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20  yback commences 
21770 74 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65  the Pager.dbSize
21780 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20   variable.** is 
21790 72 65 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  reset to the val
217a0 75 65 20 74 68 61 74 20 69 74 20 68 65 6c 64 20  ue that it held 
217b0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
217c0 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a  the savepoint .*
217d0 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  * (or transactio
217e0 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68  n). No page with
217f0 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67   a page-number g
21800 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73  reater than this
21810 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61   value.** is pla
21820 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65  yed back. If one
21830 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
21840 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69  it is simply ski
21850 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pped..*/.static 
21860 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61 63  int pagerPlaybac
21870 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72  kSavepoint(Pager
21880 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72 53   *pPager, PagerS
21890 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70  avepoint *pSavep
218a0 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a  oint){.  i64 szJ
218b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
218c0 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73    /* Effective s
218d0 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ize of the main 
218e0 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
218f0 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
21900 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
21910 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66  first segment of
21920 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65   main-journal re
21930 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72  cords */.  int r
21940 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
21950 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
21960 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  de */.  Bitvec *
21970 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20  pDone = 0;      
21980 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e   /* Bitvec to en
21990 73 75 72 65 20 70 61 67 65 73 20 70 6c 61 79 65  sure pages playe
219a0 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65  d back only once
219b0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
219c0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50  Pager->eState!=P
219d0 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
219e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
219f0 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57 52  eState>=PAGER_WR
21a00 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 0a  ITER_LOCKED );..
21a10 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
21a20 62 69 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f  bitvec to use to
21a30 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f   store the set o
21a40 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62  f pages rolled b
21a50 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ack */.  if( pSa
21a60 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70  vepoint ){.    p
21a70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69  Done = sqlite3Bi
21a80 74 76 65 63 43 72 65 61 74 65 28 70 53 61 76 65  tvecCreate(pSave
21a90 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20  point->nOrig);. 
21aa0 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b     if( !pDone ){
21ab0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
21ac0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
21ad0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
21ae0 20 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73   Set the databas
21af0 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74  e size back to t
21b00 68 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20  he value it was 
21b10 62 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70  before the savep
21b20 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67  oint .  ** being
21b30 20 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70   reverted was op
21b40 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  ened..  */.  pPa
21b50 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53  ger->dbSize = pS
21b60 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65  avepoint ? pSave
21b70 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70  point->nOrig : p
21b80 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
21b90 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  e;.  pPager->cha
21ba0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
21bb0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
21bc0 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65 70 6f  ..  if( !pSavepo
21bd0 69 6e 74 20 26 26 20 70 61 67 65 72 55 73 65 57  int && pagerUseW
21be0 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
21bf0 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 52 6f    return pagerRo
21c00 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65 72  llbackWal(pPager
21c10 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73 65  );.  }..  /* Use
21c20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21c30 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65 63  Off as the effec
21c40 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65  tive size of the
21c50 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
21c60 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68   ** journal.  Th
21c70 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69  e actual file mi
21c80 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68  ght be larger th
21c90 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20  an this in.  ** 
21ca0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
21cb0 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41  E_TRUNCATE or PA
21cc0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
21cd0 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e  PERSIST.  But an
21ce0 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74  ything.  ** past
21cf0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21d00 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74  Off is off-limit
21d10 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20  s to us..  */.  
21d20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ = pPager->jo
21d30 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73 65  urnalOff;.  asse
21d40 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  rt( pagerUseWal(
21d50 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73 7a  pPager)==0 || sz
21d60 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65  J==0 );..  /* Be
21d70 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62  gin by rolling b
21d80 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  ack records from
21d90 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
21da0 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
21db0 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  ** PagerSavepoin
21dc0 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f  t.iOffset and co
21dd0 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
21de0 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  next journal hea
21df0 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20  der..  ** There 
21e00 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64 73  might be records
21e10 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   in the main jou
21e20 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20 61  rnal that have a
21e30 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
21e40 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  * greater than t
21e50 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 62  he current datab
21e60 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65 72  ase size (pPager
21e70 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74 68  ->dbSize) but th
21e80 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ose.  ** will be
21e90 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61 74   skipped automat
21ea0 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20 61  ically.  Pages a
21eb0 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f 6e  re added to pDon
21ec0 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20 61  e as they.  ** a
21ed0 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  re played back..
21ee0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65    */.  if( pSave
21ef0 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72 55  point && !pagerU
21f00 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
21f10 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70  .    iHdrOff = p
21f20 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f  Savepoint->iHdrO
21f30 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69  ffset ? pSavepoi
21f40 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a  nt->iHdrOffset :
21f50 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72   szJ;.    pPager
21f60 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70  ->journalOff = p
21f70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73  Savepoint->iOffs
21f80 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72  et;.    while( r
21f90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
21fa0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21fb0 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20  ff<iHdrOff ){.  
21fc0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
21fd0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
21fe0 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
21ff0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 44  ->journalOff, pD
22000 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  one, 1, 1);.    
22010 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
22020 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
22030 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
22040 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
22050 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
22060 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67  Continue rolling
22070 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75   back records ou
22080 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  t of the main jo
22090 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
220a0 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  t.  ** the first
220b0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
220c0 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75  seen and continu
220d0 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66  ing until the ef
220e0 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a  fective end.  **
220f0 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   of the main jou
22100 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74  rnal file.  Cont
22110 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74  inue to skip out
22120 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
22130 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75  and.  ** continu
22140 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20 72  e adding pages r
22150 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44  olled back to pD
22160 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  one..  */.  whil
22170 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
22180 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
22190 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20  nalOff<szJ ){.  
221a0 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
221b0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
221c0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32 20  nter */.    u32 
221d0 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20 2f  nJRec = 0;     /
221e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72  * Number of Jour
221f0 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20  nal Records */. 
22200 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
22210 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
22220 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30 2c  alHdr(pPager, 0,
22230 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64   szJ, &nJRec, &d
22240 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72  ummy);.    asser
22250 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
22260 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  NE );..    /*.  
22270 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72    ** The "pPager
22280 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
22290 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
222a0 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
222b0 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20  rnalOff".    ** 
222c0 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20  test is related 
222d0 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e  to ticket #2565.
222e0 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73    See the discus
222f0 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  sion in the.    
22300 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  ** pager_playbac
22310 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  k() function for
22320 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
22330 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  rmation..    */.
22340 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30      if( nJRec==0
22350 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72   .     && pPager
22360 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
22370 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
22380 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
22390 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20  rnalOff.    ){. 
223a0 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33       nJRec = (u3
223b0 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72  2)((szJ - pPager
223c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f  ->journalOff)/JO
223d0 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
223e0 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  er));.    }.    
223f0 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51  for(ii=0; rc==SQ
22400 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a  LITE_OK && ii<nJ
22410 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  Rec && pPager->j
22420 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69  ournalOff<szJ; i
22430 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
22440 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
22450 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
22460 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
22470 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c 20  lOff, pDone, 1, 
22480 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
22490 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
224a0 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61  _DONE );.  }.  a
224b0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
224c0 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
224d0 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a 4a 20  journalOff>=szJ 
224e0 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79  );..  /* Finally
224f0 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65  ,  rollback page
22500 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  s from the sub-j
22510 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68  ournal.  Page th
22520 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65  at were.  ** pre
22530 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62  viously rolled b
22540 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  ack out of the m
22550 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64  ain journal (and
22560 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44   are hence in pD
22570 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  one).  ** will b
22580 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d  e skipped.  Out-
22590 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61  of-range pages a
225a0 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e  re also skipped.
225b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  .  */.  if( pSav
225c0 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33  epoint ){.    u3
225d0 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  2 ii;           
225e0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
225f0 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73   */.    i64 offs
22600 65 74 20 3d 20 28 69 36 34 29 70 53 61 76 65 70  et = (i64)pSavep
22610 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34  oint->iSubRec*(4
22620 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
22630 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67  e);..    if( pag
22640 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
22650 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
22660 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70 6f 69  qlite3WalSavepoi
22670 6e 74 55 6e 64 6f 28 70 50 61 67 65 72 2d 3e 70  ntUndo(pPager->p
22680 57 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e 74 2d  Wal, pSavepoint-
22690 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20 20 20 20  >aWalData);.    
226a0 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61  }.    for(ii=pSa
226b0 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63  vepoint->iSubRec
226c0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
226d0 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  && ii<pPager->nS
226e0 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20  ubRec; ii++){.  
226f0 20 20 20 20 61 73 73 65 72 74 28 20 6f 66 66 73      assert( offs
22700 65 74 3d 3d 28 69 36 34 29 69 69 2a 28 34 2b 70  et==(i64)ii*(4+p
22710 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
22720 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
22730 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
22740 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
22750 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c 20 30  offset, pDone, 0
22760 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
22770 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
22780 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a  TE_DONE );.  }..
22790 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
227a0 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20  estroy(pDone);. 
227b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
227c0 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
227d0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
227e0 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  zJ;.  }..  retur
227f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
22800 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
22810 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
22820 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
22830 20 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   are allowed.** 
22840 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
22850 67 20 74 6f 20 72 65 63 79 63 6c 65 20 63 6c 65  g to recycle cle
22860 61 6e 20 61 6e 64 20 75 6e 75 73 65 64 20 70 61  an and unused pa
22870 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ges..*/.void sql
22880 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
22890 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
228a0 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
228b0 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
228c0 65 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 50  eSetCachesize(pP
228d0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d  ager->pPCache, m
228e0 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  xPage);.}../*.**
228f0 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   Change the maxi
22900 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  mum number of in
22910 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68  -memory pages th
22920 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a  at are allowed.*
22930 2a 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  * before attempt
22940 69 6e 67 20 74 6f 20 73 70 69 6c 6c 20 70 61 67  ing to spill pag
22950 65 73 20 74 6f 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  es to journal..*
22960 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
22970 65 72 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 50  erSetSpillsize(P
22980 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
22990 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 72 65 74  t mxPage){.  ret
229a0 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68  urn sqlite3Pcach
229b0 65 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 70 50  eSetSpillsize(pP
229c0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d  ager->pPCache, m
229d0 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  xPage);.}../*.**
229e0 20 49 6e 76 6f 6b 65 20 53 51 4c 49 54 45 5f 46   Invoke SQLITE_F
229f0 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 62  CNTL_MMAP_SIZE b
22a00 61 73 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72  ased on the curr
22a10 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 73 7a 4d  ent value of szM
22a20 6d 61 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  map..*/.static v
22a30 6f 69 64 20 70 61 67 65 72 46 69 78 4d 61 70 6c  oid pagerFixMapl
22a40 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  imit(Pager *pPag
22a50 65 72 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  er){.#if SQLITE_
22a60 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
22a70 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
22a80 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b  fd = pPager->fd;
22a90 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 66 64  .  if( isOpen(fd
22aa0 29 20 26 26 20 66 64 2d 3e 70 4d 65 74 68 6f 64  ) && fd->pMethod
22ab0 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29  s->iVersion>=3 )
22ac0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
22ad0 74 36 34 20 73 7a 3b 0a 20 20 20 20 73 7a 20 3d  t64 sz;.    sz =
22ae0 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61 70 3b   pPager->szMmap;
22af0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 62 55 73  .    pPager->bUs
22b00 65 46 65 74 63 68 20 3d 20 28 73 7a 3e 30 29 3b  eFetch = (sz>0);
22b10 0a 20 20 20 20 73 65 74 47 65 74 74 65 72 4d 65  .    setGetterMe
22b20 74 68 6f 64 28 70 50 61 67 65 72 29 3b 0a 20 20  thod(pPager);.  
22b30 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
22b40 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65  ontrolHint(pPage
22b50 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43  r->fd, SQLITE_FC
22b60 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 26  NTL_MMAP_SIZE, &
22b70 73 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  sz);.  }.#endif.
22b80 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
22b90 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65  the maximum size
22ba0 20 6f 66 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6d   of any memory m
22bb0 61 70 70 69 6e 67 20 6d 61 64 65 20 6f 66 20 74  apping made of t
22bc0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22bd0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22be0 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d  3PagerSetMmapLim
22bf0 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
22c00 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
22c10 73 7a 4d 6d 61 70 29 7b 0a 20 20 70 50 61 67 65  szMmap){.  pPage
22c20 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d  r->szMmap = szMm
22c30 61 70 3b 0a 20 20 70 61 67 65 72 46 69 78 4d 61  ap;.  pagerFixMa
22c40 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a  plimit(pPager);.
22c50 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 73  }../*.** Free as
22c60 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
22c70 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20 74 68  possible from th
22c80 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64  e pager..*/.void
22c90 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 72   sqlite3PagerShr
22ca0 69 6e 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ink(Pager *pPage
22cb0 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  r){.  sqlite3Pca
22cc0 63 68 65 53 68 72 69 6e 6b 28 70 50 61 67 65 72  cheShrink(pPager
22cd0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f  ->pPCache);.}../
22ce0 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 73 65 74 74  *.** Adjust sett
22cf0 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67 65  ings of the page
22d00 72 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69  r to those speci
22d10 66 69 65 64 20 69 6e 20 74 68 65 20 70 67 46 6c  fied in the pgFl
22d20 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ags parameter..*
22d30 2a 0a 2a 2a 20 54 68 65 20 22 6c 65 76 65 6c 22  *.** The "level"
22d40 20 69 6e 20 70 67 46 6c 61 67 73 20 26 20 50 41   in pgFlags & PA
22d50 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f  GER_SYNCHRONOUS_
22d60 4d 41 53 4b 20 73 65 74 73 20 74 68 65 20 72 6f  MASK sets the ro
22d70 62 75 73 74 6e 65 73 73 0a 2a 2a 20 6f 66 20 74  bustness.** of t
22d80 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64  he database to d
22d90 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
22da0 63 72 61 73 68 65 73 20 6f 72 20 70 6f 77 65 72  crashes or power
22db0 20 66 61 69 6c 75 72 65 73 20 62 79 0a 2a 2a 20   failures by.** 
22dc0 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d  changing the num
22dd0 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20  ber of syncs()s 
22de0 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65  when writing the
22df0 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68   journals..** Th
22e00 65 72 65 20 61 72 65 20 66 6f 75 72 20 6c 65 76  ere are four lev
22e10 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46  els:.**.**    OF
22e20 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  F       sqlite3O
22e30 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72  sSync() is never
22e40 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69   called.  This i
22e50 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a  s the default.**
22e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
22e70 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20  r temporary and 
22e80 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e  transient files.
22e90 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c  .**.**    NORMAL
22ea0 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
22eb0 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62  is synced once b
22ec0 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
22ed0 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
22ee0 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
22ef0 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  se.  This is nor
22f00 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70  mally adequate p
22f10 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a  rotection, but.*
22f20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
22f30 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c  t is theoretical
22f40 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f  ly possible, tho
22f50 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c  ugh very unlikel
22f60 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  y,.**           
22f70 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65     that an inope
22f80 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c  rtune power fail
22f90 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20  ure could leave 
22fa0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  the journal.**  
22fb0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61              in a
22fc0 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75   state which wou
22fd0 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20  ld cause damage 
22fe0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
22ff0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
23000 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65  when it is rolle
23010 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
23020 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a   FULL      The j
23030 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
23040 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72   twice before wr
23050 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
23060 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
23070 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68    database (with
23080 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   some additional
23090 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74   information - t
230a0 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a  he nRec field.**
230b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
230c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
230d0 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74  der - being writ
230e0 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74  ten in between t
230f0 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20  he two.**       
23100 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20         syncs).  
23110 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61  If we assume tha
23120 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20  t writing a.**  
23130 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67              sing
23140 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69  le disk sector i
23150 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74  s atomic, then t
23160 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65  his mode provide
23170 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
23180 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74    assurance that
23190 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c   the journal wil
231a0 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  l not be corrupt
231b0 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  ed to the.**    
231c0 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20            point 
231d0 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67  of causing damag
231e0 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
231f0 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
23200 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 58 54 52  k..**.**    EXTR
23210 41 20 20 20 20 20 54 68 69 73 20 69 73 20 6c 69  A     This is li
23220 6b 65 20 46 55 4c 4c 20 65 78 63 65 70 74 20 74  ke FULL except t
23230 68 61 74 20 69 73 20 61 6c 73 6f 20 73 79 6e 63  hat is also sync
23240 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a  s the directory.
23250 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
23260 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
23270 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
23280 61 6c 20 61 66 74 65 72 20 74 68 65 20 72 6f 6c  al after the rol
23290 6c 62 61 63 6b 0a 2a 2a 20 20 20 20 20 20 20 20  lback.**        
232a0 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 69 73        journal is
232b0 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2a 0a 2a 2a   unlinked..**.**
232c0 20 54 68 65 20 61 62 6f 76 65 20 69 73 20 66 6f   The above is fo
232d0 72 20 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75  r a rollback-jou
232e0 72 6e 61 6c 20 6d 6f 64 65 2e 20 20 46 6f 72 20  rnal mode.  For 
232f0 57 41 4c 20 6d 6f 64 65 2c 20 4f 46 46 20 63 6f  WAL mode, OFF co
23300 6e 74 69 6e 75 65 73 0a 2a 2a 20 74 6f 20 6d 65  ntinues.** to me
23310 61 6e 20 74 68 61 74 20 6e 6f 20 73 79 6e 63 73  an that no syncs
23320 20 65 76 65 72 20 6f 63 63 75 72 2e 20 20 4e 4f   ever occur.  NO
23330 52 4d 41 4c 20 6d 65 61 6e 73 20 74 68 61 74 20  RMAL means that 
23340 74 68 65 20 57 41 4c 20 69 73 20 73 79 6e 63 65  the WAL is synce
23350 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 74 68  d.** prior to th
23360 65 20 73 74 61 72 74 20 6f 66 20 63 68 65 63 6b  e start of check
23370 70 6f 69 6e 74 20 61 6e 64 20 74 68 61 74 20 74  point and that t
23380 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
23390 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20 61 74   is synced.** at
233a0 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20   the conclusion 
233b0 6f 66 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  of the checkpoin
233c0 74 20 69 66 20 74 68 65 20 65 6e 74 69 72 65 20  t if the entire 
233d0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 57  content of the W
233e0 41 4c 0a 2a 2a 20 77 61 73 20 77 72 69 74 74 65  AL.** was writte
233f0 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  n back into the 
23400 64 61 74 61 62 61 73 65 2e 20 20 42 75 74 20 6e  database.  But n
23410 6f 20 73 79 6e 63 20 6f 70 65 72 61 74 69 6f 6e  o sync operation
23420 73 20 6f 63 63 75 72 20 66 6f 72 0a 2a 2a 20 61  s occur for.** a
23430 6e 20 6f 72 64 69 6e 61 72 79 20 63 6f 6d 6d 69  n ordinary commi
23440 74 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f 64 65  t in NORMAL mode
23450 20 77 69 74 68 20 57 41 4c 2e 20 20 46 55 4c 4c   with WAL.  FULL
23460 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
23470 57 41 4c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73  WAL.** file is s
23480 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20  ynced following 
23490 65 61 63 68 20 63 6f 6d 6d 69 74 20 6f 70 65 72  each commit oper
234a0 61 74 69 6f 6e 2c 20 69 6e 20 61 64 64 69 74 69  ation, in additi
234b0 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 73 79 6e  on to the.** syn
234c0 63 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  cs associated wi
234d0 74 68 20 4e 4f 52 4d 41 4c 2e 20 20 54 68 65 72  th NORMAL.  Ther
234e0 65 20 69 73 20 6e 6f 20 64 69 66 66 65 72 65 6e  e is no differen
234f0 63 65 20 62 65 74 77 65 65 6e 20 46 55 4c 4c 0a  ce between FULL.
23500 2a 2a 20 61 6e 64 20 45 58 54 52 41 20 66 6f 72  ** and EXTRA for
23510 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a   WAL mode..**.**
23520 20 44 6f 20 6e 6f 74 20 63 6f 6e 66 75 73 65 20   Do not confuse 
23530 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c  synchronous=FULL
23540 20 77 69 74 68 20 53 51 4c 49 54 45 5f 53 59 4e   with SQLITE_SYN
23550 43 5f 46 55 4c 4c 2e 20 20 54 68 65 0a 2a 2a 20  C_FULL.  The.** 
23560 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
23570 20 6d 61 63 72 6f 20 6d 65 61 6e 73 20 74 6f 20   macro means to 
23580 75 73 65 20 74 68 65 20 4d 61 63 4f 53 58 2d 73  use the MacOSX-s
23590 74 79 6c 65 20 66 75 6c 6c 2d 66 73 79 6e 63 0a  tyle full-fsync.
235a0 2a 2a 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 46  ** using fcntl(F
235b0 5f 46 55 4c 4c 46 53 59 4e 43 29 2e 20 20 53 51  _FULLFSYNC).  SQ
235c0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
235d0 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 61 6e 0a   means to do an.
235e0 2a 2a 20 6f 72 64 69 6e 61 72 79 20 66 73 79 6e  ** ordinary fsyn
235f0 63 28 29 20 63 61 6c 6c 2e 20 20 54 68 65 72 65  c() call.  There
23600 20 69 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63   is no differenc
23610 65 20 62 65 74 77 65 65 6e 20 53 51 4c 49 54 45  e between SQLITE
23620 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20 61 6e  _SYNC_FULL.** an
23630 64 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  d SQLITE_SYNC_NO
23640 52 4d 41 4c 20 6f 6e 20 70 6c 61 74 66 6f 72 6d  RMAL on platform
23650 73 20 6f 74 68 65 72 20 74 68 61 6e 20 4d 61 63  s other than Mac
23660 4f 53 58 2e 20 20 42 75 74 20 74 68 65 0a 2a 2a  OSX.  But the.**
23670 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c   synchronous=FUL
23680 4c 20 76 65 72 73 75 73 20 73 79 6e 63 68 72 6f  L versus synchro
23690 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73 65 74 74  nous=NORMAL sett
236a0 69 6e 67 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ing determines w
236b0 68 65 6e 0a 2a 2a 20 74 68 65 20 78 53 79 6e 63  hen.** the xSync
236c0 20 70 72 69 6d 69 74 69 76 65 20 69 73 20 63 61   primitive is ca
236d0 6c 6c 65 64 20 61 6e 64 20 69 73 20 72 65 6c 65  lled and is rele
236e0 76 61 6e 74 20 74 6f 20 61 6c 6c 20 70 6c 61 74  vant to all plat
236f0 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d  forms..**.** Num
23700 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f  eric values asso
23710 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73  ciated with thes
23720 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46  e states are OFF
23730 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a  ==1, NORMAL=2,.*
23740 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f  * and FULL=3..*/
23750 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
23760 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
23770 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  AS.void sqlite3P
23780 61 67 65 72 53 65 74 46 6c 61 67 73 28 0a 20 20  agerSetFlags(.  
23790 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
237a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
237b0 65 72 20 74 6f 20 73 65 74 20 73 61 66 65 74 79  er to set safety
237c0 20 6c 65 76 65 6c 20 66 6f 72 20 2a 2f 0a 20 20   level for */.  
237d0 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73  unsigned pgFlags
237e0 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73        /* Various
237f0 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 75   flags */.){.  u
23800 6e 73 69 67 6e 65 64 20 6c 65 76 65 6c 20 3d 20  nsigned level = 
23810 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f  pgFlags & PAGER_
23820 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41 53 4b  SYNCHRONOUS_MASK
23830 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
23840 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
23850 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
23860 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
23870 66 75 6c 6c 53 79 6e 63 20 3d 20 30 3b 0a 20 20  fullSync = 0;.  
23880 20 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53    pPager->extraS
23890 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ync = 0;.  }else
238a0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f  {.    pPager->no
238b0 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 50  Sync =  level==P
238c0 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AGER_SYNCHRONOUS
238d0 5f 4f 46 46 20 3f 31 3a 30 3b 0a 20 20 20 20 70  _OFF ?1:0;.    p
238e0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
238f0 3d 20 6c 65 76 65 6c 3e 3d 50 41 47 45 52 5f 53  = level>=PAGER_S
23900 59 4e 43 48 52 4f 4e 4f 55 53 5f 46 55 4c 4c 20  YNCHRONOUS_FULL 
23910 3f 31 3a 30 3b 0a 20 20 20 20 70 50 61 67 65 72  ?1:0;.    pPager
23920 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 6c 65  ->extraSync = le
23930 76 65 6c 3d 3d 50 41 47 45 52 5f 53 59 4e 43 48  vel==PAGER_SYNCH
23940 52 4f 4e 4f 55 53 5f 45 58 54 52 41 20 3f 31 3a  RONOUS_EXTRA ?1:
23950 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
23960 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
23970 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46     pPager->syncF
23980 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  lags = 0;.  }els
23990 65 20 69 66 28 20 70 67 46 6c 61 67 73 20 26 20  e if( pgFlags & 
239a0 50 41 47 45 52 5f 46 55 4c 4c 46 53 59 4e 43 20  PAGER_FULLFSYNC 
239b0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
239c0 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  yncFlags = SQLIT
239d0 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20 20 7d  E_SYNC_FULL;.  }
239e0 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
239f0 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51  ->syncFlags = SQ
23a00 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
23a10 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
23a20 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d 20 28  walSyncFlags = (
23a30 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
23a40 73 3c 3c 32 29 3b 0a 20 20 69 66 28 20 70 50 61  s<<2);.  if( pPa
23a50 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
23a60 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c  .    pPager->wal
23a70 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20 70 50 61  SyncFlags |= pPa
23a80 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3b 0a  ger->syncFlags;.
23a90 20 20 7d 0a 20 20 69 66 28 20 28 70 67 46 6c 61    }.  if( (pgFla
23aa0 67 73 20 26 20 50 41 47 45 52 5f 43 4b 50 54 5f  gs & PAGER_CKPT_
23ab0 46 55 4c 4c 46 53 59 4e 43 29 20 26 26 20 21 70  FULLFSYNC) && !p
23ac0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
23ad0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c  .    pPager->wal
23ae0 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20 28 53 51  SyncFlags |= (SQ
23af0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3c 3c  LITE_SYNC_FULL<<
23b00 32 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67  2);.  }.  if( pg
23b10 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f 43 41  Flags & PAGER_CA
23b20 43 48 45 53 50 49 4c 4c 20 29 7b 0a 20 20 20 20  CHESPILL ){.    
23b30 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69  pPager->doNotSpi
23b40 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47  ll &= ~SPILLFLAG
23b50 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  _OFF;.  }else{. 
23b60 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
23b70 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c  Spill |= SPILLFL
23b80 41 47 5f 4f 46 46 3b 0a 20 20 7d 0a 7d 0a 23 65  AG_OFF;.  }.}.#e
23b90 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
23ba0 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
23bb0 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63   variable is inc
23bc0 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65  remented wheneve
23bd0 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a  r the library.**
23be0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65   attempts to ope
23bf0 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
23c00 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  le.  This inform
23c10 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f  ation is used fo
23c20 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
23c30 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20   analysis only. 
23c40 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49   .*/.#ifdef SQLI
23c50 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
23c60 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
23c70 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
23c80 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d  /*.** Open a tem
23c90 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a  porary file..**.
23ca0 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c  ** Write the fil
23cb0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74  e descriptor int
23cc0 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e  o *pFile. Return
23cd0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
23ce0 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d  ccess .** or som
23cf0 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
23d00 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54  de if we fail. T
23d10 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d  he OS will autom
23d20 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c  atically .** del
23d30 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ete the temporar
23d40 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69  y file when it i
23d50 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
23d60 54 68 65 20 66 6c 61 67 73 20 70 61 73 73 65 64  The flags passed
23d70 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65   to the VFS laye
23d80 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61  r xOpen() call a
23d90 72 65 20 74 68 6f 73 65 20 73 70 65 63 69 66 69  re those specifi
23da0 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74  ed.** by paramet
23db0 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64  er vfsFlags ORed
23dc0 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
23dd0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ing:.**.**     S
23de0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
23df0 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49  RITE.**     SQLI
23e00 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a  TE_OPEN_CREATE.*
23e10 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
23e20 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  N_EXCLUSIVE.**  
23e30 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44     SQLITE_OPEN_D
23e40 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a  ELETEONCLOSE.*/.
23e50 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
23e60 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65  Opentemp(.  Page
23e70 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
23e80 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
23e90 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
23ea0 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
23eb0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66 69   /* Write the fi
23ec0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 68 65  le descriptor he
23ed0 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46  re */.  int vfsF
23ee0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a  lags          /*
23ef0 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
23f00 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46 53  rough to the VFS
23f10 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
23f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23f30 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
23f40 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
23f50 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f  TEST.  sqlite3_o
23f60 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b  pentemp_count++;
23f70 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65    /* Used for te
23f80 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
23f90 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69  is only */.#endi
23fa0 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d  f..  vfsFlags |=
23fb0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
23fc0 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
23fd0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20  _OPEN_CREATE |. 
23fe0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
23ff0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
24000 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   | SQLITE_OPEN_D
24010 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20  ELETEONCLOSE;.  
24020 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
24030 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  en(pPager->pVfs,
24040 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c   0, pFile, vfsFl
24050 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  ags, 0);.  asser
24060 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
24070 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65   || isOpen(pFile
24080 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
24090 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
240a0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
240b0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
240c0 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65  The pager invoke
240d0 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  s the busy-handl
240e0 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c  er if sqlite3OsL
240f0 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a  ock() returns .*
24100 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68  * SQLITE_BUSY wh
24110 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67  en trying to upg
24120 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63  rade from no-loc
24130 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f  k to a SHARED lo
24140 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74  ck,.** or when t
24150 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65  rying to upgrade
24160 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44   from a RESERVED
24170 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c   lock to an EXCL
24180 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20  USIVE .** lock. 
24190 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e  It does *not* in
241a0 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
241b0 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61  ndler when upgra
241c0 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41  ding from.** SHA
241d0 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c  RED to RESERVED,
241e0 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64 69   or when upgradi
241f0 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74  ng from SHARED t
24200 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28  o EXCLUSIVE.** (
24210 77 68 69 63 68 20 6f 63 63 75 72 73 20 64 75 72  which occurs dur
24220 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  ing hot-journal 
24230 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61  rollback). Summa
24240 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e  ry:.**.**   Tran
24250 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20  sition          
24260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
24270 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e  Invokes xBusyHan
24280 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  dler.**   ------
24290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
242a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
242b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
242c0 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20  --.**   NO_LOCK 
242d0 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f        -> SHARED_
242e0 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a  LOCK      | Yes.
242f0 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b  **   SHARED_LOCK
24300 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c     -> RESERVED_L
24310 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20  OCK    | No.**  
24320 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d   SHARED_LOCK   -
24330 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  > EXCLUSIVE_LOCK
24340 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53     | No.**   RES
24350 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58  ERVED_LOCK -> EX
24360 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c  CLUSIVE_LOCK   |
24370 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68   Yes.**.** If th
24380 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63  e busy-handler c
24390 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20  allback returns 
243a0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f  non-zero, the lo
243b0 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65  ck is .** retrie
243c0 64 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e 73  d. If it returns
243d0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
243e0 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f  SQLITE_BUSY erro
243f0 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  r is.** returned
24400 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f   to the caller o
24410 66 20 74 68 65 20 70 61 67 65 72 20 41 50 49 20  f the pager API 
24420 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
24430 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
24440 74 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20  tBusyhandler(.  
24450 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
24460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24470 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
24480 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  ject */.  int (*
24490 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f  xBusyHandler)(vo
244a0 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f  id *),         /
244b0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73  * Pointer to bus
244c0 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y-handler functi
244d0 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  on */.  void *pB
244e0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20  usyHandlerArg   
244f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24500 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73  Argument to pass
24510 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72   to xBusyHandler
24520 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d   */.){.  pPager-
24530 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >xBusyHandler = 
24540 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20  xBusyHandler;.  
24550 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
24560 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79 48  dlerArg = pBusyH
24570 61 6e 64 6c 65 72 41 72 67 3b 0a 0a 20 20 69 66  andlerArg;..  if
24580 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
24590 3e 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64  >fd) ){.    void
245a0 20 2a 2a 61 70 20 3d 20 28 76 6f 69 64 20 2a 2a   **ap = (void **
245b0 29 26 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  )&pPager->xBusyH
245c0 61 6e 64 6c 65 72 3b 0a 20 20 20 20 61 73 73 65  andler;.    asse
245d0 72 74 28 20 28 28 69 6e 74 28 2a 29 28 76 6f 69  rt( ((int(*)(voi
245e0 64 20 2a 29 29 28 61 70 5b 30 5d 29 29 3d 3d 78  d *))(ap[0]))==x
245f0 42 75 73 79 48 61 6e 64 6c 65 72 20 29 3b 0a 20  BusyHandler );. 
24600 20 20 20 61 73 73 65 72 74 28 20 61 70 5b 31 5d     assert( ap[1]
24610 3d 3d 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ==pBusyHandlerAr
24620 67 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g );.    sqlite3
24630 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e  OsFileControlHin
24640 74 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  t(pPager->fd, SQ
24650 4c 49 54 45 5f 46 43 4e 54 4c 5f 42 55 53 59 48  LITE_FCNTL_BUSYH
24660 41 4e 44 4c 45 52 2c 20 28 76 6f 69 64 20 2a 29  ANDLER, (void *)
24670 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ap);.  }.}../*.*
24680 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67  * Change the pag
24690 65 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  e size used by t
246a0 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e  he Pager object.
246b0 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   The new page si
246c0 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64  ze .** is passed
246d0 20 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a   in *pPageSize..
246e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
246f0 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  er is in the err
24700 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  or state when th
24710 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
24720 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20  alled, it.** is 
24730 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c  a no-op. The val
24740 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
24750 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65  he error state e
24760 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20  rror code (i.e. 
24770 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54  .** one of SQLIT
24780 45 5f 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49  E_IOERR, an SQLI
24790 54 45 5f 49 4f 45 52 52 5f 78 78 78 20 73 75 62  TE_IOERR_xxx sub
247a0 2d 63 6f 64 65 20 6f 72 20 53 51 4c 49 54 45 5f  -code or SQLITE_
247b0 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  FULL)..**.** Oth
247c0 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f  erwise, if all o
247d0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
247e0 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
247f0 20 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65    * the new page
24800 20 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20   size (value of 
24810 2a 70 50 61 67 65 53 69 7a 65 29 20 69 73 20 76  *pPageSize) is v
24820 61 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a  alid (a power .*
24830 2a 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74  *     of two bet
24840 77 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c  ween 512 and SQL
24850 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
24860 45 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61  E, inclusive), a
24870 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65  nd.**.**   * the
24880 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
24890 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72  nding page refer
248a0 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a  ences, and.**.**
248b0 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73     * the databas
248c0 65 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20  e is either not 
248d0 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
248e0 61 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a  abase or it is.*
248f0 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f  *     an in-memo
24900 72 79 20 64 61 74 61 62 61 73 65 20 74 68 61 74  ry database that
24910 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69   currently consi
24920 73 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65  sts of zero page
24930 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68  s..**.** then th
24940 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70  e pager object p
24950 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 74 20  age size is set 
24960 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a  to *pPageSize..*
24970 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
24980 20 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64   size is changed
24990 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
249a0 74 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65  tion uses sqlite
249b0 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a  3PagerMalloc() .
249c0 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e  ** to obtain a n
249d0 65 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  ew Pager.pTmpSpa
249e0 63 65 20 62 75 66 66 65 72 2e 20 49 66 20 74 68  ce buffer. If th
249f0 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74  is allocation at
24a00 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c  tempt .** fails,
24a10 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
24a20 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
24a30 65 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61  e page size rema
24a40 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a  ins unchanged. .
24a50 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20  ** In all other 
24a60 63 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b  cases, SQLITE_OK
24a70 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
24a80 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
24a90 73 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e  size is not chan
24aa0 67 65 64 2c 20 65 69 74 68 65 72 20 62 65 63 61  ged, either beca
24ab0 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65  use one of the e
24ac0 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e  numerated.** con
24ad0 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73  ditions above is
24ae0 20 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70   not true, the p
24af0 61 67 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f  ager was in erro
24b00 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r state when thi
24b10 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61  s.** function wa
24b20 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63  s called, or bec
24b30 61 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  ause the memory 
24b40 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
24b50 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74  pt failed, .** t
24b60 68 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69  hen *pPageSize i
24b70 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64  s set to the old
24b80 2c 20 72 65 74 61 69 6e 65 64 20 70 61 67 65 20  , retained page 
24b90 73 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75  size before retu
24ba0 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rning..*/.int sq
24bb0 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
24bc0 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
24bd0 67 65 72 2c 20 75 33 32 20 2a 70 50 61 67 65 53  ger, u32 *pPageS
24be0 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76  ize, int nReserv
24bf0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
24c00 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
24c10 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
24c20 6c 65 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20  le to do a full 
24c30 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
24c40 74 65 28 29 20 68 65 72 65 2c 20 61 73 20 74 68  te() here, as th
24c50 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
24c60 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66   may be called f
24c70 72 6f 6d 20 77 69 74 68 69 6e 20 50 61 67 65 72  rom within Pager
24c80 4f 70 65 6e 28 29 2c 20 62 65 66 6f 72 65 20 74  Open(), before t
24c90 68 65 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66  he state.  ** of
24ca0 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
24cb0 74 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20  t is internally 
24cc0 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a  consistent..  **
24cd0 0a 20 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69  .  ** At one poi
24ce0 6e 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nt this function
24cf0 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72   returned an err
24d00 6f 72 20 69 66 20 74 68 65 20 70 61 67 65 72 20  or if the pager 
24d10 77 61 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47  was in .  ** PAG
24d20 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20  ER_ERROR state. 
24d30 42 75 74 20 73 69 6e 63 65 20 50 41 47 45 52 5f  But since PAGER_
24d40 45 52 52 4f 52 20 73 74 61 74 65 20 67 75 61 72  ERROR state guar
24d50 61 6e 74 65 65 73 20 74 68 61 74 0a 20 20 2a 2a  antees that.  **
24d60 20 74 68 65 72 65 20 69 73 20 61 74 20 6c 65 61   there is at lea
24d70 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
24d80 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ng page referenc
24d90 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
24da0 0a 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  .  ** is a no-op
24db0 20 66 6f 72 20 74 68 61 74 20 63 61 73 65 20 61   for that case a
24dc0 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75  nyhow..  */..  u
24dd0 33 32 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70  32 pageSize = *p
24de0 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  PageSize;.  asse
24df0 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20  rt( pageSize==0 
24e00 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31  || (pageSize>=51
24e10 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
24e20 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
24e30 49 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 28 70  IZE) );.  if( (p
24e40 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20  Pager->memDb==0 
24e50 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
24e60 65 3d 3d 30 29 0a 20 20 20 26 26 20 73 71 6c 69  e==0).   && sqli
24e70 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
24e80 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
24e90 65 29 3d 3d 30 20 0a 20 20 20 26 26 20 70 61 67  e)==0 .   && pag
24ea0 65 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a  eSize && pageSiz
24eb0 65 21 3d 28 75 33 32 29 70 50 61 67 65 72 2d 3e  e!=(u32)pPager->
24ec0 70 61 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20  pageSize .  ){. 
24ed0 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20     char *pNew = 
24ee0 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 20 20  NULL;           
24ef0 20 20 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73 70    /* New temp sp
24f00 61 63 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e  ace */.    i64 n
24f10 42 79 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69  Byte = 0;..    i
24f20 66 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  f( pPager->eStat
24f30 65 3e 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20  e>PAGER_OPEN && 
24f40 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
24f50 64 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  d) ){.      rc =
24f60 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
24f70 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
24f80 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nByte);.    }.  
24f90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24fa0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  _OK ){.      pNe
24fb0 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  w = (char *)sqli
24fc0 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61  te3PageMalloc(pa
24fd0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  geSize);.      i
24fe0 66 28 20 21 70 4e 65 77 20 29 20 72 63 20 3d 20  f( !pNew ) rc = 
24ff0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
25000 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  T;.    }..    if
25010 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25020 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72  ){.      pager_r
25030 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
25040 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
25050 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a  PcacheSetPageSiz
25060 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
25070 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  e, pageSize);.  
25080 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
25090 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
250a0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
250b0 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  ee(pPager->pTmpS
250c0 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50 61  pace);.      pPa
250d0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  ger->pTmpSpace =
250e0 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 50 61   pNew;.      pPa
250f0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50  ger->dbSize = (P
25100 67 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61 67 65  gno)((nByte+page
25110 53 69 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a 65  Size-1)/pageSize
25120 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
25130 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
25140 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Size;.    }else{
25150 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
25160 67 65 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  geFree(pNew);.  
25170 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67    }.  }..  *pPag
25180 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
25190 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 66 28 20  pageSize;.  if( 
251a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
251b0 0a 20 20 20 20 69 66 28 20 6e 52 65 73 65 72 76  .    if( nReserv
251c0 65 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d  e<0 ) nReserve =
251d0 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76   pPager->nReserv
251e0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  e;.    assert( n
251f0 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52  Reserve>=0 && nR
25200 65 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20  eserve<1000 );. 
25210 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65     pPager->nRese
25220 72 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65  rve = (i16)nRese
25230 72 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65  rve;.    pagerRe
25240 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29  portSize(pPager)
25250 3b 0a 20 20 20 20 70 61 67 65 72 46 69 78 4d 61  ;.    pagerFixMa
25260 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a  plimit(pPager);.
25270 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
25280 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
25290 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
252a0 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67  e "temporary pag
252b0 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20 69  e" buffer held i
252c0 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20  nternally.** by 
252d0 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73  the pager.  This
252e0 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68 61   is a buffer tha
252f0 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20  t is big enough 
25300 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65  to hold the.** e
25310 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
25320 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
25330 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20 69  .  This buffer i
25340 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  s used internall
25350 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c  y.** during roll
25360 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65  back and will be
25370 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65   overwritten whe
25380 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b  never a rollback
25390 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74  .** occurs.  But
253a0 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61   other modules a
253b0 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20 69  re free to use i
253c0 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61  t too, as long a
253d0 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b  s.** no rollback
253e0 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e  s are happening.
253f0 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
25400 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
25410 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
25420 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
25430 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f  >pTmpSpace;.}../
25440 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
25450 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  set the maximum 
25460 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
25470 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73  unt if mxPage is
25480 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d   positive. .** M
25490 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69  ake no changes i
254a0 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f  f mxPage is zero
254b0 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41   or negative.  A
254c0 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20  nd never reduce 
254d0 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70  the.** maximum p
254e0 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20  age count below 
254f0 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
25500 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
25510 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ..**.** Regardle
25520 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ss of mxPage, re
25530 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
25540 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
25550 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
25560 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
25570 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
25580 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
25590 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20  .  if( mxPage>0 
255a0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
255b0 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a  xPgno = mxPage;.
255c0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
255d0 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41  ager->eState!=PA
255e0 47 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20  GER_OPEN );     
255f0 20 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20   /* Called only 
25600 62 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a  by OP_MaxPgcnt *
25610 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
25620 65 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67  er->mxPgno>=pPag
25630 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f  er->dbSize );  /
25640 2a 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e  * OP_MaxPgcnt en
25650 66 6f 72 63 65 73 20 74 68 69 73 20 2a 2f 0a 20  forces this */. 
25660 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
25670 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mxPgno;.}../*.**
25680 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
25690 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
256a0 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
256b0 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
256c0 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
256d0 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
256e0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
256f0 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
25700 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
25710 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
25720 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
25730 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
25740 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
25750 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
25760 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
25770 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
25780 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
25790 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
257a0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
257b0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
257c0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
257d0 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
257e0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
257f0 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
25800 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
25810 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
25820 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
25830 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
25840 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
25850 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
25860 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
25870 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
25880 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
25890 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
258a0 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
258b0 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
258c0 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
258d0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
258e0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
258f0 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
25900 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
25910 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
25920 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
25930 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
25940 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
25950 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
25960 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
25970 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
25980 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
25990 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77  * If the pager w
259a0 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74  as opened on a t
259b0 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a  ransient file (z
259c0 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f  Filename==""), o
259d0 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r.** opened on a
259e0 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20   file less than 
259f0 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  N bytes in size,
25a00 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
25a10 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20  er is.** zeroed 
25a20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
25a30 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69  turned. The rati
25a40 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69  onale for this i
25a50 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20  s that this .** 
25a60 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
25a70 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73   to read databas
25a80 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61  e headers, and a
25a90 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f   new transient o
25aa0 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20  r.** zero sized 
25ab0 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68  database has a h
25ac0 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69  eader than consi
25ad0 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  sts entirely of 
25ae0 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  zeroes..**.** If
25af0 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70   any IO error ap
25b00 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  art from SQLITE_
25b10 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
25b20 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
25b30 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f  .** the error co
25b40 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
25b50 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64  o the caller and
25b60 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
25b70 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62   the.** output b
25b80 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e  uffer undefined.
25b90 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
25ba0 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
25bb0 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
25bc0 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
25bd0 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
25be0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
25bf0 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
25c00 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61  Dest, 0, N);.  a
25c10 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
25c20 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
25c30 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
25c40 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
25c50 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
25c60 65 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65  ed by btree imme
25c70 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 63 72  diately after cr
25c80 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  eating.  ** the 
25c90 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54  Pager object.  T
25ca0 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65  here has not bee
25cb0 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  n an opportunity
25cc0 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20   to transition. 
25cd0 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20   ** to WAL mode 
25ce0 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  yet..  */.  asse
25cf0 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
25d00 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69  (pPager) );..  i
25d10 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
25d20 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54  ->fd) ){.    IOT
25d30 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20  RACE(("DBHDR %p 
25d40 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  0 %d\n", pPager,
25d50 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71   N)).    rc = sq
25d60 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
25d70 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e  er->fd, pDest, N
25d80 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
25d90 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
25da0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
25db0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
25dc0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
25dd0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
25de0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
25df0 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c   may only be cal
25e00 6c 65 64 20 77 68 65 6e 20 61 20 72 65 61 64 2d  led when a read-
25e10 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
25e20 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61  pen on.** the pa
25e30 67 65 72 2e 20 49 74 20 72 65 74 75 72 6e 73 20  ger. It returns 
25e40 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
25e50 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
25e60 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
25e70 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
25e80 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e   file is between
25e90 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a   1 and <page-siz
25ea0 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  e> bytes in size
25eb0 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  , then .** this 
25ec0 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
25ed0 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a  1 page file..*/.
25ee0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
25ef0 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
25f00 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70   *pPager, int *p
25f10 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  nPage){.  assert
25f20 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
25f30 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29  >=PAGER_READER )
25f40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
25f50 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
25f60 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  R_WRITER_FINISHE
25f70 44 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d  D );.  *pnPage =
25f80 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64 62   (int)pPager->db
25f90 53 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Size;.}.../*.** 
25fa0 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  Try to obtain a 
25fb0 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63  lock of type loc
25fc0 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74  ktype on the dat
25fd0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a  abase file. If.*
25fe0 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67  * a similar or g
25ff0 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61  reater lock is a
26000 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69  lready held, thi
26010 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
26020 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e  no-op.** (return
26030 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d  ing SQLITE_OK im
26040 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a  mediately)..**.*
26050 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74  * Otherwise, att
26060 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74  empt to obtain t
26070 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71  he lock using sq
26080 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49  lite3OsLock(). I
26090 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75  nvoke .** the bu
260a0 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
260b0 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65  he lock is curre
260c0 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62  ntly not availab
260d0 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75  le. Repeat .** u
260e0 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61  ntil the busy ca
260f0 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66  llback returns f
26100 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68  alse or until th
26110 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a  e attempt to .**
26120 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b   obtain the lock
26130 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a   succeeds..**.**
26140 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
26150 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  K on success and
26160 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
26170 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61  f we cannot obta
26180 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20  in.** the lock. 
26190 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f  If the lock is o
261a0 62 74 61 69 6e 65 64 20 73 75 63 63 65 73 73 66  btained successf
261b0 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61  ully, set the Pa
261c0 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61  ger.state .** va
261d0 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79  riable to lockty
261e0 70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  pe before return
261f0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
26200 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  nt pager_wait_on
26210 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  _lock(Pager *pPa
26220 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  ger, int locktyp
26230 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  e){.  int rc;   
26240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
26260 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
26270 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
26280 69 73 20 69 73 20 65 69 74 68 65 72 20 61 20 6e  is is either a n
26290 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74 68  o-op (because th
262a0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
262b0 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64   is .  ** alread
262c0 79 20 68 65 6c 64 29 2c 20 6f 72 20 6f 6e 65 20  y held), or one 
262d0 6f 66 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f  of the transitio
262e0 6e 73 20 74 68 61 74 20 74 68 65 20 62 75 73 79  ns that the busy
262f0 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61  -handler.  ** ma
26300 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72  y be invoked dur
26310 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  ing, according t
26320 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62  o the comment ab
26330 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  ove.  ** sqlite3
26340 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
26350 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ler()..  */.  as
26360 73 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65  sert( (pPager->e
26370 4c 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a  Lock>=locktype).
26380 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65         || (pPage
26390 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  r->eLock==NO_LOC
263a0 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  K && locktype==S
263b0 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20  HARED_LOCK).    
263c0 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65     || (pPager->e
263d0 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
263e0 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  OCK && locktype=
263f0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  =EXCLUSIVE_LOCK)
26400 0a 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20  .  );..  do {.  
26410 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b    rc = pagerLock
26420 44 62 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74  Db(pPager, lockt
26430 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  ype);.  }while( 
26440 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
26450 26 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  && pPager->xBusy
26460 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e  Handler(pPager->
26470 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29  pBusyHandlerArg)
26480 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
26490 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69  .}../*.** Functi
264a0 6f 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  on assertTruncat
264b0 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67  eConstraint(pPag
264c0 65 72 29 20 63 68 65 63 6b 73 20 74 68 61 74 20  er) checks that 
264d0 6f 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66  one of the .** f
264e0 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
264f0 20 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70   for all dirty p
26500 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69  ages currently i
26510 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  n the page-cache
26520 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65  :.**.**   a) The
26530 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
26540 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
26550 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  al to the size o
26560 66 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63  f the .**      c
26570 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
26580 69 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c  image, in pages,
26590 20 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69   OR.**.**   b) i
265a0 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  f the page conte
265b0 6e 74 20 77 65 72 65 20 77 72 69 74 74 65 6e 20  nt were written 
265c0 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74  at this time, it
265d0 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20   would not.**   
265e0 20 20 20 62 65 20 6e 65 63 65 73 73 61 72 79 20     be necessary 
265f0 74 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72  to write the cur
26600 72 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74  rent content out
26610 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   to the sub-jour
26620 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20  nal.**      (as 
26630 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75  determined by fu
26640 6e 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69  nction subjRequi
26650 72 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a  resPage())..**.*
26660 2a 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69  * If the conditi
26670 6f 6e 20 61 73 73 65 72 74 65 64 20 62 79 20 74  on asserted by t
26680 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72  his function wer
26690 65 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20  e not true, and 
266a0 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67  the.** dirty pag
266b0 65 20 77 65 72 65 20 74 6f 20 62 65 20 64 69 73  e were to be dis
266c0 63 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20  carded from the 
266d0 63 61 63 68 65 20 76 69 61 20 74 68 65 20 70 61  cache via the pa
266e0 67 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72  gerStress().** r
266f0 6f 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72  outine, pagerStr
26700 65 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20  ess() would not 
26710 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
26720 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74  t page content t
26730 6f 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  o.** the databas
26740 65 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76  e file. If a sav
26750 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69  epoint transacti
26760 6f 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62  on were rolled b
26770 61 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69  ack after.** thi
26780 73 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20  s happened, the 
26790 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72  correct behavior
267a0 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73   would be to res
267b0 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  tore the current
267c0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
267d0 68 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72  he page. However
267e0 2c 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e  , since this con
267f0 74 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73  tent is not pres
26800 65 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a  ent in either.**
26810 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26820 6c 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f  le or the portio
26830 6e 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63  n of the rollbac
26840 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a  k journal and .*
26850 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f  * sub-journal ro
26860 6c 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f  lled back the co
26870 6e 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ntent could not 
26880 62 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20  be restored and 
26890 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
268a0 69 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f  image would beco
268b0 6d 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69  me corrupt. It i
268c0 73 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74  s therefore fort
268d0 75 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74  unate that .** t
268e0 68 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65  his circumstance
268f0 20 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a   cannot arise..*
26900 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
26910 4c 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74  LITE_DEBUG).stat
26920 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72  ic void assertTr
26930 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
26940 43 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  Cb(PgHdr *pPg){.
26950 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
26960 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
26970 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73   );.  assert( !s
26980 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
26990 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  pPg) || pPg->pgn
269a0 6f 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  o<=pPg->pPager->
269b0 64 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74  dbSize );.}.stat
269c0 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72  ic void assertTr
269d0 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  uncateConstraint
269e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
269f0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
26a00 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61  IterateDirty(pPa
26a10 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73  ger->pPCache, as
26a20 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73  sertTruncateCons
26a30 74 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c  traintCb);.}.#el
26a40 73 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65  se.# define asse
26a50 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
26a60 61 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e  aint(pPager).#en
26a70 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  dif../*.** Trunc
26a80 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
26a90 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
26aa0 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70  image to nPage p
26ab0 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66  ages. This .** f
26ac0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
26ad0 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79   actually modify
26ae0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26af0 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a  le on disk. It .
26b00 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68 65  ** just sets the
26b10 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
26b20 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  of the pager obj
26b30 65 63 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  ect so that the 
26b40 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77  .** truncation w
26b50 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e  ill be done when
26b60 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
26b70 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
26b80 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  itted..**.** Thi
26b90 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
26ba0 6c 79 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20  ly called right 
26bb0 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e  before committin
26bc0 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  g a transaction.
26bd0 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 66 75  .** Once this fu
26be0 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20  nction has been 
26bf0 63 61 6c 6c 65 64 2c 20 74 68 65 20 74 72 61 6e  called, the tran
26c00 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 65 69 74  saction must eit
26c10 68 65 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64  her be.** rolled
26c20 20 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 74   back or committ
26c30 65 64 2e 20 49 74 20 69 73 20 6e 6f 74 20 73 61  ed. It is not sa
26c40 66 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20  fe to call this 
26c50 66 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20  function and.** 
26c60 74 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 77 72  then continue wr
26c70 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
26c80 61 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  abase..*/.void s
26c90 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
26ca0 61 74 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a  ateImage(Pager *
26cb0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
26cc0 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
26cd0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e  Pager->dbSize>=n
26ce0 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
26cf0 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
26d00 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43  >=PAGER_WRITER_C
26d10 41 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61  ACHEMOD );.  pPa
26d20 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
26d30 61 67 65 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e  age;..  /* At on
26d40 65 20 70 6f 69 6e 74 20 74 68 65 20 63 6f 64 65  e point the code
26d50 20 68 65 72 65 20 63 61 6c 6c 65 64 20 61 73 73   here called ass
26d60 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
26d70 72 61 69 6e 74 28 29 20 74 6f 0a 20 20 2a 2a 20  raint() to.  ** 
26d80 65 6e 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20  ensure that all 
26d90 70 61 67 65 73 20 62 65 69 6e 67 20 74 72 75 6e  pages being trun
26da0 63 61 74 65 64 20 61 77 61 79 20 62 79 20 74 68  cated away by th
26db0 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 61 72 65  is operation are
26dc0 2c 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20 6f 72  ,.  ** if one or
26dd0 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 73   more savepoints
26de0 20 61 72 65 20 6f 70 65 6e 2c 20 70 72 65 73 65   are open, prese
26df0 6e 74 20 69 6e 20 74 68 65 20 73 61 76 65 70 6f  nt in the savepo
26e00 69 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  int .  ** journa
26e10 6c 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 63  l so that they c
26e20 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69  an be restored i
26e30 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  f the savepoint 
26e40 69 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62  is rolled.  ** b
26e50 61 63 6b 2e 20 54 68 69 73 20 69 73 20 6e 6f 20  ack. This is no 
26e60 6c 6f 6e 67 65 72 20 6e 65 63 65 73 73 61 72 79  longer necessary
26e70 20 61 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f   as this functio
26e80 6e 20 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20  n is now only.  
26e90 2a 2a 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20  ** called right 
26ea0 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e  before committin
26eb0 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  g a transaction.
26ec0 20 53 6f 20 61 6c 74 68 6f 75 67 68 20 74 68 65   So although the
26ed0 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 6f 62 6a   .  ** Pager obj
26ee0 65 63 74 20 6d 61 79 20 73 74 69 6c 6c 20 68 61  ect may still ha
26ef0 76 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ve open savepoin
26f00 74 73 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70  ts (Pager.nSavep
26f10 6f 69 6e 74 21 3d 30 29 2c 20 0a 20 20 2a 2a 20  oint!=0), .  ** 
26f20 74 68 65 79 20 63 61 6e 6e 6f 74 20 62 65 20 72  they cannot be r
26f30 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 53 6f 20 74  olled back. So t
26f40 68 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  he assertTruncat
26f50 65 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 63 61  eConstraint() ca
26f60 6c 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f  ll.  ** is no lo
26f70 6e 67 65 72 20 63 6f 72 72 65 63 74 2e 20 2a 2f  nger correct. */
26f80 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
26f90 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
26fa0 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
26fb0 74 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  ting a hot-journ
26fc0 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a  al rollback. It.
26fd0 2a 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75  ** syncs the jou
26fe0 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73  rnal file to dis
26ff0 6b 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50 61  k, then sets pPa
27000 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
27010 74 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f  to the.** size o
27020 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
27030 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  le so that the p
27040 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
27050 72 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a  routine knows.**
27060 20 74 68 61 74 20 74 68 65 20 65 6e 74 69 72 65   that the entire
27070 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
27080 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a  s been synced..*
27090 2a 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68  *.** Syncing a h
270a0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69  ot-journal to di
270b0 73 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  sk before attemp
270c0 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20  ting to roll it 
270d0 62 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a  back ensures .**
270e0 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
270f0 2d 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20  -failure occurs 
27100 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
27110 61 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73  ack, the process
27120 20 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74   that.** attempt
27130 73 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f  s rollback follo
27140 77 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f  wing system reco
27150 76 65 72 79 20 73 65 65 73 20 74 68 65 20 73 61  very sees the sa
27160 6d 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f  me journal.** co
27170 6e 74 65 6e 74 20 61 73 20 74 68 69 73 20 70 72  ntent as this pr
27180 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ocess..**.** If 
27190 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20  everything goes 
271a0 61 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49  as planned, SQLI
271b0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
271c0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a  d. Otherwise, .*
271d0 2a 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  * an SQLite erro
271e0 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
271f0 63 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48  c int pagerSyncH
27200 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  otJournal(Pager 
27210 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
27220 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
27230 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
27240 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  oSync ){.    rc 
27250 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
27260 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
27270 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
27280 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
27290 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
272a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
272b0 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
272c0 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  jfd, &pPager->jo
272d0 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20  urnalHdr);.  }. 
272e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
272f0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
27300 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20  AP_SIZE>0./*.** 
27310 4f 62 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e  Obtain a referen
27320 63 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 20 6d  ce to a memory m
27330 61 70 70 65 64 20 70 61 67 65 20 6f 62 6a 65 63  apped page objec
27340 74 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  t for page numbe
27350 72 20 70 67 6e 6f 2e 20 0a 2a 2a 20 54 68 65 20  r pgno. .** The 
27360 6e 65 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  new object will 
27370 75 73 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20  use the pointer 
27380 70 44 61 74 61 2c 20 6f 62 74 61 69 6e 65 64 20  pData, obtained 
27390 66 72 6f 6d 20 78 46 65 74 63 68 28 29 2e 0a 2a  from xFetch()..*
273a0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
273b0 20 73 65 74 20 2a 70 70 50 61 67 65 20 74 6f 20   set *ppPage to 
273c0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77  point to the new
273d0 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 0a   page reference.
273e0 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ** and return SQ
273f0 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69  LITE_OK. Otherwi
27400 73 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51  se, return an SQ
27410 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
27420 61 6e 64 20 73 65 74 0a 2a 2a 20 2a 70 70 50 61  and set.** *ppPa
27430 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  ge to zero..**.*
27440 2a 20 50 61 67 65 20 72 65 66 65 72 65 6e 63 65  * Page reference
27450 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20 63 61  s obtained by ca
27460 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
27470 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 72 65  ion should be re
27480 6c 65 61 73 65 64 0a 2a 2a 20 62 79 20 63 61 6c  leased.** by cal
27490 6c 69 6e 67 20 70 61 67 65 72 52 65 6c 65 61 73  ling pagerReleas
274a0 65 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73  eMapPage()..*/.s
274b0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 41  tatic int pagerA
274c0 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 0a 20  cquireMapPage(. 
274d0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
274e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274f0 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
27500 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
27510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27520 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
27530 6d 62 65 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  mber */.  void *
27540 70 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20  pData,          
27550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65            /* xFe
27560 74 63 68 28 29 27 64 20 64 61 74 61 20 66 6f 72  tch()'d data for
27570 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
27580 50 67 48 64 72 20 2a 2a 70 70 50 61 67 65 20 20  PgHdr **ppPage  
27590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275a0 2f 2a 20 4f 55 54 3a 20 41 63 71 75 69 72 65 64  /* OUT: Acquired
275b0 20 70 61 67 65 20 6f 62 6a 65 63 74 20 2a 2f 0a   page object */.
275c0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20  ){.  PgHdr *p;  
275d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
275e0 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d       /* Memory m
275f0 61 70 70 65 64 20 70 61 67 65 20 74 6f 20 72 65  apped page to re
27600 74 75 72 6e 20 2a 2f 0a 20 20 0a 20 20 69 66 28  turn */.  .  if(
27610 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72   pPager->pMmapFr
27620 65 65 6c 69 73 74 20 29 7b 0a 20 20 20 20 2a 70  eelist ){.    *p
27630 70 50 61 67 65 20 3d 20 70 20 3d 20 70 50 61 67  pPage = p = pPag
27640 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73  er->pMmapFreelis
27650 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  t;.    pPager->p
27660 4d 6d 61 70 46 72 65 65 6c 69 73 74 20 3d 20 70  MmapFreelist = p
27670 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 70 2d  ->pDirty;.    p-
27680 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
27690 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
276a0 3e 6e 45 78 74 72 61 3e 3d 38 20 29 3b 0a 20 20  >nExtra>=8 );.  
276b0 20 20 6d 65 6d 73 65 74 28 70 2d 3e 70 45 78 74    memset(p->pExt
276c0 72 61 2c 20 30 2c 20 38 29 3b 0a 20 20 7d 65 6c  ra, 0, 8);.  }el
276d0 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  se{.    *ppPage 
276e0 3d 20 70 20 3d 20 28 50 67 48 64 72 20 2a 29 73  = p = (PgHdr *)s
276f0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
27700 28 73 69 7a 65 6f 66 28 50 67 48 64 72 29 20 2b  (sizeof(PgHdr) +
27710 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
27720 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
27730 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
27740 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
27750 3e 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d  >fd, (i64)(pgno-
27760 31 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67  1) * pPager->pag
27770 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20  eSize, pData);. 
27780 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
27790 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
277a0 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 45 78 74     }.    p->pExt
277b0 72 61 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b  ra = (void *)&p[
277c0 31 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73  1];.    p->flags
277d0 20 3d 20 50 47 48 44 52 5f 4d 4d 41 50 3b 0a 20   = PGHDR_MMAP;. 
277e0 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a     p->nRef = 1;.
277f0 20 20 20 20 70 2d 3e 70 50 61 67 65 72 20 3d 20      p->pPager = 
27800 70 50 61 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 61  pPager;.  }..  a
27810 73 73 65 72 74 28 20 70 2d 3e 70 45 78 74 72 61  ssert( p->pExtra
27820 3d 3d 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 20  ==(void *)&p[1] 
27830 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
27840 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73  pPage==0 );.  as
27850 73 65 72 74 28 20 70 2d 3e 66 6c 61 67 73 3d 3d  sert( p->flags==
27860 50 47 48 44 52 5f 4d 4d 41 50 20 29 3b 0a 20 20  PGHDR_MMAP );.  
27870 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65  assert( p->pPage
27880 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61  r==pPager );.  a
27890 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d  ssert( p->nRef==
278a0 31 20 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20  1 );..  p->pgno 
278b0 3d 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61  = pgno;.  p->pDa
278c0 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 70 50  ta = pData;.  pP
278d0 61 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b  ager->nMmapOut++
278e0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ;..  return SQLI
278f0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
27900 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
27910 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
27920 67 65 20 70 50 67 2e 20 70 50 67 20 6d 75 73 74  ge pPg. pPg must
27930 20 68 61 76 65 20 62 65 65 6e 20 72 65 74 75 72   have been retur
27940 6e 65 64 20 62 79 20 61 6e 20 0a 2a 2a 20 65 61  ned by an .** ea
27950 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 70 61  rlier call to pa
27960 67 65 72 41 63 71 75 69 72 65 4d 61 70 50 61 67  gerAcquireMapPag
27970 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e()..*/.static v
27980 6f 69 64 20 70 61 67 65 72 52 65 6c 65 61 73 65  oid pagerRelease
27990 4d 61 70 50 61 67 65 28 50 67 48 64 72 20 2a 70  MapPage(PgHdr *p
279a0 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
279b0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
279c0 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d  er;.  pPager->nM
279d0 6d 61 70 4f 75 74 2d 2d 3b 0a 20 20 70 50 67 2d  mapOut--;.  pPg-
279e0 3e 70 44 69 72 74 79 20 3d 20 70 50 61 67 65 72  >pDirty = pPager
279f0 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b  ->pMmapFreelist;
27a00 0a 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70  .  pPager->pMmap
27a10 46 72 65 65 6c 69 73 74 20 3d 20 70 50 67 3b 0a  Freelist = pPg;.
27a20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
27a30 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d  r->fd->pMethods-
27a40 3e 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 3b 0a  >iVersion>=3 );.
27a50 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74    sqlite3OsUnfet
27a60 63 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  ch(pPager->fd, (
27a70 69 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31  i64)(pPg->pgno-1
27a80 29 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  )*pPager->pageSi
27a90 7a 65 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b  ze, pPg->pData);
27aa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
27ab0 6c 6c 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73  ll PgHdr objects
27ac0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 50   stored in the P
27ad0 61 67 65 72 2e 70 4d 6d 61 70 46 72 65 65 6c 69  ager.pMmapFreeli
27ae0 73 74 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  st list..*/.stat
27af0 69 63 20 76 6f 69 64 20 70 61 67 65 72 46 72 65  ic void pagerFre
27b00 65 4d 61 70 48 64 72 73 28 50 61 67 65 72 20 2a  eMapHdrs(Pager *
27b10 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
27b20 20 2a 70 3b 0a 20 20 50 67 48 64 72 20 2a 70 4e   *p;.  PgHdr *pN
27b30 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61  ext;.  for(p=pPa
27b40 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69  ger->pMmapFreeli
27b50 73 74 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b  st; p; p=pNext){
27b60 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e  .    pNext = p->
27b70 70 44 69 72 74 79 3b 0a 20 20 20 20 73 71 6c 69  pDirty;.    sqli
27b80 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d  te3_free(p);.  }
27b90 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64  .}.../*.** Shutd
27ba0 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63  own the page cac
27bb0 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65  he.  Free all me
27bc0 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61  mory and close a
27bd0 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ll files..**.** 
27be0 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
27bf0 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73   was in progress
27c00 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
27c10 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
27c20 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  at.** transactio
27c30 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
27c40 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69  .  All outstandi
27c50 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
27c60 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20  alidated.** and 
27c70 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20  their memory is 
27c80 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65  freed.  Any atte
27c90 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67  mpt to use a pag
27ca0 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
27cb0 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63  with this page c
27cc0 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20  ache after this 
27cd0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
27ce0 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
27cf0 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
27d00 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dump..**.** This
27d10 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
27d20 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61 20   succeeds. If a 
27d30 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
27d40 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74  ctive an attempt
27d50 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72  .** is made to r
27d60 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20  oll it back. If 
27d70 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
27d80 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
27d90 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f  ack .** a hot jo
27da0 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66  urnal may be lef
27db0 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73  t in the filesys
27dc0 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  tem but no error
27dd0 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
27de0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
27df0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
27e00 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70  erClose(Pager *p
27e10 50 61 67 65 72 2c 20 73 71 6c 69 74 65 33 20 2a  Pager, sqlite3 *
27e20 64 62 29 7b 0a 20 20 75 38 20 2a 70 54 6d 70 20  db){.  u8 *pTmp 
27e30 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e  = (u8 *)pPager->
27e40 70 54 6d 70 53 70 61 63 65 3b 0a 0a 20 20 61 73  pTmpSpace;..  as
27e50 73 65 72 74 28 20 64 62 20 7c 7c 20 70 61 67 65  sert( db || page
27e60 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d  rUseWal(pPager)=
27e70 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
27e80 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
27e90 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
27ea0 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
27eb0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
27ec0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
27ed0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70  ignMalloc();.  p
27ee0 61 67 65 72 46 72 65 65 4d 61 70 48 64 72 73 28  agerFreeMapHdrs(
27ef0 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20 70 50  pPager);.  /* pP
27f00 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
27f10 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
27f20 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
27f30 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
27f40 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 61 73 73  E_OMIT_WAL.  ass
27f50 65 72 74 28 20 64 62 20 7c 7c 20 70 50 61 67 65  ert( db || pPage
27f60 72 2d 3e 70 57 61 6c 3d 3d 30 20 29 3b 0a 20 20  r->pWal==0 );.  
27f70 73 71 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28  sqlite3WalClose(
27f80 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 64 62  pPager->pWal, db
27f90 2c 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e  , pPager->walSyn
27fa0 63 46 6c 61 67 73 2c 20 70 50 61 67 65 72 2d 3e  cFlags, pPager->
27fb0 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20  pageSize,.      
27fc0 28 64 62 20 26 26 20 28 64 62 2d 3e 66 6c 61 67  (db && (db->flag
27fd0 73 20 26 20 53 51 4c 49 54 45 5f 4e 6f 43 6b 70  s & SQLITE_NoCkp
27fe0 74 4f 6e 43 6c 6f 73 65 29 20 3f 20 30 20 3a 20  tOnClose) ? 0 : 
27ff0 70 54 6d 70 29 0a 20 20 29 3b 0a 20 20 70 50 61  pTmp).  );.  pPa
28000 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a 23  ger->pWal = 0;.#
28010 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72 65  endif.  pager_re
28020 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
28030 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
28040 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
28050 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
28060 20 20 20 2f 2a 20 49 66 20 69 74 20 69 73 20 6f     /* If it is o
28070 70 65 6e 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  pen, sync the jo
28080 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
28090 65 20 63 61 6c 6c 69 6e 67 20 55 6e 6c 6f 63 6b  e calling Unlock
280a0 41 6e 64 52 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20  AndRollback..   
280b0 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e   ** If this is n
280c0 6f 74 20 64 6f 6e 65 2c 20 74 68 65 6e 20 61 6e  ot done, then an
280d0 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f   unsynced portio
280e0 6e 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f  n of the open jo
280f0 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 66 69  urnal .    ** fi
28100 6c 65 20 6d 61 79 20 62 65 20 70 6c 61 79 65 64  le may be played
28110 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
28120 61 74 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f  atabase. If a po
28130 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
28140 72 73 20 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65  rs .    ** while
28150 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69   this is happeni
28160 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ng, the database
28170 20 63 6f 75 6c 64 20 62 65 63 6f 6d 65 20 63 6f   could become co
28180 72 72 75 70 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  rrupt..    **.  
28190 20 20 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    ** If an error
281a0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
281b0 79 69 6e 67 20 74 6f 20 73 79 6e 63 20 74 68 65  ying to sync the
281c0 20 6a 6f 75 72 6e 61 6c 2c 20 73 68 69 66 74 20   journal, shift 
281d0 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
281e0 20 69 6e 74 6f 20 74 68 65 20 45 52 52 4f 52 20   into the ERROR 
281f0 73 74 61 74 65 2e 20 54 68 69 73 20 63 61 75 73  state. This caus
28200 65 73 20 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  es UnlockAndRoll
28210 62 61 63 6b 20 74 6f 20 75 6e 6c 6f 63 6b 20 74  back to unlock t
28220 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
28230 73 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  se and close the
28240 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
28250 74 68 6f 75 74 20 61 74 74 65 6d 70 74 69 6e 67  thout attempting
28260 20 74 6f 20 72 6f 6c 6c 20 69 74 0a 20 20 20 20   to roll it.    
28270 2a 2a 20 62 61 63 6b 20 6f 72 20 66 69 6e 61 6c  ** back or final
28280 69 7a 65 20 69 74 2e 20 54 68 65 20 6e 65 78 74  ize it. The next
28290 20 64 61 74 61 62 61 73 65 20 75 73 65 72 20 77   database user w
282a0 69 6c 6c 20 68 61 76 65 20 74 6f 20 64 6f 20 68  ill have to do h
282b0 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  ot-journal.    *
282c0 2a 20 72 6f 6c 6c 62 61 63 6b 20 62 65 66 6f 72  * rollback befor
282d0 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  e accessing the 
282e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
282f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73     */.    if( is
28300 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
28310 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  ) ){.      pager
28320 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 70  _error(pPager, p
28330 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
28340 61 6c 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  al(pPager));.   
28350 20 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f   }.    pagerUnlo
28360 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
28370 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ager);.  }.  sql
28380 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
28390 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f  loc();.  enable_
283a0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
283b0 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52  ors();.  PAGERTR
283c0 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e  ACE(("CLOSE %d\n
283d0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
283e0 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  r)));.  IOTRACE(
283f0 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70  ("CLOSE %p\n", p
28400 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65  Pager)).  sqlite
28410 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
28420 3e 6a 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  >jfd);.  sqlite3
28430 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
28440 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  fd);.  sqlite3Pa
28450 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20  geFree(pTmp);.  
28460 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f  sqlite3PcacheClo
28470 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  se(pPager->pPCac
28480 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  he);..#ifdef SQL
28490 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
284a0 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  if( pPager->xCod
284b0 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d  ecFree ) pPager-
284c0 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67  >xCodecFree(pPag
284d0 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e  er->pCodec);.#en
284e0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21  dif..  assert( !
284f0 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
28500 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70  nt && !pPager->p
28510 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  InJournal );.  a
28520 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
28530 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21  Pager->jfd) && !
28540 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
28550 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74  jfd) );..  sqlit
28560 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
28570 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
28580 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  _OK;.}..#if !def
28590 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
285a0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
285b0 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
285c0 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
285d0 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  r for page pPg..
285e0 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50  */.Pgno sqlite3P
285f0 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44  agerPagenumber(D
28600 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
28610 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b  eturn pPg->pgno;
28620 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
28630 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
28640 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
28650 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
28660 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
28670 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  rRef(DbPage *pPg
28680 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
28690 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f  heRef(pPg);.}../
286a0 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f  *.** Sync the jo
286b0 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20  urnal. In other 
286c0 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
286d0 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
286e0 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
286f0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
28700 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
28710 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
28720 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
28730 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e  .** disk and can
28740 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20   be restored in 
28750 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68  the event of a h
28760 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
28770 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
28780 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66  e Pager.noSync f
28790 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
287a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
287b0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 4f 74  s a no-op..** Ot
287c0 68 65 72 77 69 73 65 2c 20 74 68 65 20 61 63 74  herwise, the act
287d0 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 64 65  ions required de
287e0 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72  pend on the jour
287f0 6e 61 6c 2d 6d 6f 64 65 20 61 6e 64 20 74 68 65  nal-mode and the
28800 20 0a 2a 2a 20 64 65 76 69 63 65 20 63 68 61 72   .** device char
28810 61 63 74 65 72 69 73 74 69 63 73 20 6f 66 20 74  acteristics of t
28820 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
28830 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
28840 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75  *   * If the jou
28850 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20  rnal file is an 
28860 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61  in-memory journa
28870 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f  l file, no actio
28880 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65  n need.**     be
28890 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20   taken..**.**   
288a0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
288b0 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20  the device does 
288c0 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20  not support the 
288d0 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70  SAFE_APPEND prop
288e0 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65  erty,.**     the
288f0 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  n the nRec field
28900 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
28910 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f  ently written jo
28920 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20  urnal header.** 
28930 20 20 20 20 69 73 20 75 70 64 61 74 65 64 20 74      is updated t
28940 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75  o contain the nu
28950 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  mber of journal 
28960 72 65 63 6f 72 64 73 20 74 68 61 74 20 68 61 76  records that hav
28970 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72  e.**     been wr
28980 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20  itten following 
28990 69 74 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  it. If the pager
289a0 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e   is operating in
289b0 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20   full-sync.**   
289c0 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65    mode, then the
289d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
289e0 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74   synced before t
289f0 68 69 73 20 66 69 65 6c 64 20 69 73 20 75 70 64  his field is upd
28a00 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ated..**.**   * 
28a10 49 66 20 74 68 65 20 64 65 76 69 63 65 20 64 6f  If the device do
28a20 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74  es not support t
28a30 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72  he SEQUENTIAL pr
28a40 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a  operty, then .**
28a50 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
28a60 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  e is synced..**.
28a70 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f  ** Or, in pseudo
28a80 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  -code:.**.**   i
28a90 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72  f( NOT <in-memor
28aa0 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a  y journal> ){.**
28ab0 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46       if( NOT SAF
28ac0 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20  E_APPEND ){.**  
28ad0 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73       if( <full-s
28ae0 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e  ync mode> ) xSyn
28af0 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e  c(<journal file>
28b00 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64  );.**       <upd
28b10 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a  ate nRec field>.
28b20 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20  **     } .**    
28b30 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54   if( NOT SEQUENT
28b40 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75  IAL ) xSync(<jou
28b50 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20  rnal file>);.** 
28b60 20 20 7d 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63    }.**.** If suc
28b70 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 72 6f  cessful, this ro
28b80 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65  utine clears the
28b90 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
28ba0 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79 20 0a   flag of every .
28bb0 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c  ** page currentl
28bc0 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79  y held in memory
28bd0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
28be0 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  g SQLITE_OK. If 
28bf0 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69  an IO.** error i
28c00 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  s encountered, t
28c10 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
28c20 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
28c30 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  d to the caller.
28c40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
28c50 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
28c60 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 65   *pPager, int ne
28c70 77 48 64 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  wHdr){.  int rc;
28c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c90 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
28ca0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73  rn code */..  as
28cb0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53  sert( pPager->eS
28cc0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
28cd0 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20  ER_CACHEMOD.    
28ce0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
28cf0 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
28d00 45 52 5f 44 42 4d 4f 44 0a 20 20 29 3b 0a 20 20  ER_DBMOD.  );.  
28d10 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
28d20 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
28d30 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
28d40 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
28d50 67 65 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20  ger) );..  rc = 
28d60 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c  sqlite3PagerExcl
28d70 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72  usiveLock(pPager
28d80 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
28d90 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
28da0 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67  rc;..  if( !pPag
28db0 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
28dc0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
28dd0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
28de0 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
28df0 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50  ager->jfd) && pP
28e00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
28e10 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
28e20 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
28e30 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
28e40 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
28e50 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
28e60 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
28e70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
28e80 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
28e90 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  d) );..      if(
28ea0 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
28eb0 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
28ec0 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  D) ){.        /*
28ed0 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c   This block deal
28ee0 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72  s with an obscur
28ef0 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68  e problem. If th
28f00 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f  e last connectio
28f10 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  n.        ** tha
28f20 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20  t wrote to this 
28f30 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65  database was ope
28f40 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73  rating in persis
28f50 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20  tent-journal.   
28f60 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68       ** mode, th
28f70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
28f80 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20  ile may at this 
28f90 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62  point actually b
28fa0 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20  e larger.       
28fb0 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a   ** than Pager.j
28fc0 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e  ournalOff bytes.
28fd0 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69   If the next thi
28fe0 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ng in the journa
28ff0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c  l.        ** fil
29000 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
29010 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
29020 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72   (written as par
29030 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  t of the.       
29040 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e   ** previous con
29050 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e 73 61  nection's transa
29060 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72  ction), and a cr
29070 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69  ash or power-fai
29080 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  lure .        **
29090 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e 52   occurs after nR
290a0 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62 75  ec is updated bu
290b0 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f  t before this co
290c0 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20  nnection writes 
290d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74  .        ** anyt
290e0 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65  hing else to the
290f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
29100 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20  r commits/rolls 
29110 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20  back its .      
29120 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
29130 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d  ), then SQLite m
29140 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73  ay become confus
29150 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68  ed when doing th
29160 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f  e .        ** ho
29170 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
29180 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63  ck following rec
29190 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f  overy. It may ro
291a0 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20  ll back all.    
291b0 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63      ** of this c
291c0 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c  onnections data,
291d0 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f   then proceed to
291e0 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68   rolling back th
291f0 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a  e old,.        *
29200 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61  * out-of-date da
29210 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  ta that follows 
29220 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72  it. Database cor
29230 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  ruption..       
29240 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
29250 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
29260 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  is, if the journ
29270 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70  al file does app
29280 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20  ear to contain. 
29290 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69         ** a vali
292a0 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69  d header followi
292b0 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ng Pager.journal
292c0 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20  Off, then write 
292d0 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a  a 0x00.        *
292e0 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73 74  * byte to the st
292f0 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65  art of it to pre
29300 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69  vent it from bei
29310 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20  ng recognized.. 
29320 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
29330 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69 4e    ** Variable iN
29340 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73 20  extHdrOffset is 
29350 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65  set to the offse
29360 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73 0a  t at which this.
29370 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 6c          ** probl
29380 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77 69  ematic header wi
29390 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74 20  ll occur, if it 
293a0 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20 69  exists. aMagic i
293b0 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20 20  s used .        
293c0 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61 72  ** as a temporar
293d0 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73 70  y buffer to insp
293e0 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63 6f  ect the first co
293f0 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f 66  uple of bytes of
29400 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
29410 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e 61  potential journa
29420 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20  l header..      
29430 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34    */.        i64
29440 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 3b   iNextHdrOffset;
29450 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61 67  .        u8 aMag
29460 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 75  ic[8];.        u
29470 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  8 zHeader[sizeof
29480 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
29490 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d  4];..        mem
294a0 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
294b0 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
294c0 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
294d0 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33  ));.        put3
294e0 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
294f0 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
29500 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e  gic)], pPager->n
29510 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  Rec);..        i
29520 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20  NextHdrOffset = 
29530 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
29540 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
29550 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
29560 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
29570 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65  , aMagic, 8, iNe
29580 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20  xtHdrOffset);.  
29590 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
295a0 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65  LITE_OK && 0==me
295b0 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
295c0 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29  urnalMagic, 8) )
295d0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74  {.          stat
295e0 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f  ic const u8 zero
295f0 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  byte = 0;.      
29600 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
29610 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
29620 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20  jfd, &zerobyte, 
29630 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  1, iNextHdrOffse
29640 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
29650 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
29660 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
29670 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
29680 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
29690 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
296a0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
296b0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
296c0 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  Rec value into t
296d0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
296e0 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20  header. If in.  
296f0 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79        ** full-sy
29700 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
29710 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
29720 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73   first. This ens
29730 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20  ures that.      
29740 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61    ** all data ha
29750 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65  s really hit the
29760 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65   disk before nRe
29770 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  c is updated to 
29780 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  mark.        ** 
29790 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74  it as a candidat
297a0 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a  e for rollback..
297b0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
297c0 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f     ** This is no
297d0 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68  t required if th
297e0 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64  e persistent med
297f0 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a  ia supports the.
29800 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f          ** SAFE_
29810 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e  APPEND property.
29820 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73   Because in this
29830 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20   case it is not 
29840 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20  possible .      
29850 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65    ** for garbage
29860 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65   data to be appe
29870 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65  nded to the file
29880 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  , the nRec field
29890 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70  .        ** is p
298a0 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78  opulated with 0x
298b0 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68  FFFFFFFF when th
298c0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
298d0 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20   is written.    
298e0 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72      ** and never
298f0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
29900 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ated..        */
29910 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
29920 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26  ger->fullSync &&
29930 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
29940 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
29950 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  ) ){.          P
29960 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
29970 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
29980 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
29990 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r)));.          
299a0 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
299b0 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
299c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
299d0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
299e0 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
299f0 2d 3e 73 79 6e 63 46 6c 61 67 73 29 3b 0a 20 20  ->syncFlags);.  
29a00 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
29a10 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
29a20 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
29a30 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
29a40 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 5c  (("JHDR %p %lld\
29a50 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
29a60 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 29 29  er->journalHdr))
29a70 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
29a80 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 0a 20  qlite3OsWrite(. 
29a90 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
29aa0 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
29ab0 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29   sizeof(zHeader)
29ac0 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
29ad0 6c 48 64 72 0a 20 20 20 20 20 20 20 20 29 3b 0a  lHdr.        );.
29ae0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
29af0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
29b00 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
29b10 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63       if( 0==(iDc
29b20 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
29b30 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20  QUENTIAL) ){.   
29b40 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
29b50 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
29b60 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
29b70 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
29b80 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
29b90 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
29ba0 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d  r)).        rc =
29bb0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
29bc0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
29bd0 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 7c 20 0a  er->syncFlags| .
29be0 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
29bf0 72 2d 3e 73 79 6e 63 46 6c 61 67 73 3d 3d 53 51  r->syncFlags==SQ
29c00 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53  LITE_SYNC_FULL?S
29c10 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
29c20 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29  NLY:0).        )
29c30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
29c40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
29c50 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
29c60 0a 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ..      pPager->
29c70 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
29c80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
29c90 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 48 64  .      if( newHd
29ca0 72 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c  r && 0==(iDc&SQL
29cb0 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
29cc0 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20  PPEND) ){.      
29cd0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
29ce0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
29cf0 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
29d00 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
29d10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29d20 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
29d30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
29d40 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72  se{.      pPager
29d50 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70  ->journalHdr = p
29d60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
29d70 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  f;.    }.  }..  
29d80 2f 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61  /* Unless the pa
29d90 67 65 72 20 69 73 20 69 6e 20 6e 6f 53 79 6e 63  ger is in noSync
29da0 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e   mode, the journ
29db0 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74  al file was just
29dc0 20 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75   .  ** successfu
29dd0 6c 6c 79 20 73 79 6e 63 65 64 2e 20 45 69 74 68  lly synced. Eith
29de0 65 72 20 77 61 79 2c 20 63 6c 65 61 72 20 74 68  er way, clear th
29df0 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
29e00 43 20 66 6c 61 67 20 6f 6e 20 0a 20 20 2a 2a 20  C flag on .  ** 
29e10 61 6c 6c 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a  all pages..  */.
29e20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
29e30 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50  learSyncFlags(pP
29e40 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
29e50 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
29e60 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f   = PAGER_WRITER_
29e70 44 42 4d 4f 44 3b 0a 20 20 61 73 73 65 72 74 28  DBMOD;.  assert(
29e80 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
29e90 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
29ea0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
29eb0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
29ec0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
29ed0 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65  first in a linke
29ee0 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20  d list of dirty 
29ef0 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a  pages connected.
29f00 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72 2e  ** by the PgHdr.
29f10 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20  pDirty pointer. 
29f20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72  This function wr
29f30 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66  ites each one of
29f40 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72   the.** in-memor
29f50 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c  y pages in the l
29f60 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ist to the datab
29f70 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72  ase file. The ar
29f80 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65  gument may.** be
29f90 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74   NULL, represent
29fa0 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73  ing an empty lis
29fb0 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
29fc0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
29fd0 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a  .** a no-op..**.
29fe0 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75 73  ** The pager mus
29ff0 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20  t hold at least 
2a000 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
2a010 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
2a020 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e  on.** is called.
2a030 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   Before writing 
2a040 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20  anything to the 
2a050 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
2a060 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75  his lock.** is u
2a070 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58  pgraded to an EX
2a080 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
2a090 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74   the lock cannot
2a0a0 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a   be obtained,.**
2a0b0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
2a0c0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20  returned and no 
2a0d0 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
2a0e0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2a0f0 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  file..** .** If 
2a100 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20 74  the pager is a t
2a110 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61  emp-file pager a
2a120 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66 69  nd the actual fi
2a130 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a  le-system file.*
2a140 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65  * is not yet ope
2a150 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64  n, it is created
2a160 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f   and opened befo
2a170 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a  re any data is .
2a180 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a  ** written out..
2a190 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c  **.** Once the l
2a1a0 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67  ock has been upg
2a1b0 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65  raded and, if ne
2a1c0 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c  cessary, the fil
2a1d0 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65  e opened,.** the
2a1e0 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74   pages are writt
2a1f0 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  en out to the da
2a200 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c  tabase file in l
2a210 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69  ist order. Writi
2a220 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20  ng.** a page is 
2a230 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d 65  skipped if it me
2a240 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74 68  ets either of th
2a250 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74  e following crit
2a260 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  eria:.**.**   * 
2a270 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
2a280 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
2a290 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72  Pager.dbSize, or
2a2a0 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44  .**   * The PGHD
2a2b0 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61  R_DONT_WRITE fla
2a2c0 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20  g is set on the 
2a2d0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  page..**.** If w
2a2e0 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67  riting out a pag
2a2f0 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74  e causes the dat
2a300 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
2a310 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65  ow, Pager.dbFile
2a320 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74  Size.** is updat
2a330 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20  ed accordingly. 
2a340 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72 69  If page 1 is wri
2a350 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74  tten out, then t
2a360 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a  he value cached.
2a370 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69  ** in Pager.dbFi
2a380 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61  leVers[] is upda
2a390 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ted to match the
2a3a0 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65   new value store
2a3b0 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61  d in.** the data
2a3c0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
2a3d0 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   If everything i
2a3e0 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  s successful, SQ
2a3f0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2a400 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
2a410 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20  ror .** occurs, 
2a420 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
2a430 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72   is returned. Or
2a440 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53 49  , if the EXCLUSI
2a450 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a  VE lock cannot.*
2a460 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53  * be obtained, S
2a470 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
2a480 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
2a490 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
2a4a0 65 5f 70 61 67 65 6c 69 73 74 28 50 61 67 65 72  e_pagelist(Pager
2a4b0 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
2a4c0 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 72  *pList){.  int r
2a4d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2a4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4f0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2a500 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  /..  /* This fun
2a510 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 63 61  ction is only ca
2a520 6c 6c 65 64 20 66 6f 72 20 72 6f 6c 6c 62 61 63  lled for rollbac
2a530 6b 20 70 61 67 65 72 73 20 69 6e 20 57 52 49 54  k pagers in WRIT
2a540 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 2e 20  ER_DBMOD state. 
2a550 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 70 61  */.  assert( !pa
2a560 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2a570 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2a580 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2a590 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  || pPager->eStat
2a5a0 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
2a5b0 44 42 4d 4f 44 20 29 3b 0a 20 20 61 73 73 65 72  DBMOD );.  asser
2a5c0 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
2a5d0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
2a5e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   );.  assert( is
2a5f0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
2a600 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 44 69 72 74   || pList->pDirt
2a610 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  y==0 );..  /* If
2a620 20 74 68 65 20 66 69 6c 65 20 69 73 20 61 20 74   the file is a t
2a630 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74  emp-file has not
2a640 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
2a650 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49  , open it now. I
2a660 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f  t.  ** is not po
2a670 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f  ssible for rc to
2a680 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53   be other than S
2a690 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73  QLITE_OK if this
2a6a0 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20   branch.  ** is 
2a6b0 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f  taken, as pager_
2a6c0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69  wait_on_lock() i
2a6d0 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65  s a no-op for te
2a6e0 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20  mp-files..  */. 
2a6f0 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
2a700 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
2a710 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2a720 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d  tempFile && rc==
2a730 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
2a740 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74   rc = pagerOpent
2a750 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67  emp(pPager, pPag
2a760 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
2a770 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a  vfsFlags);.  }..
2a780 20 20 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20    /* Before the 
2a790 66 69 72 73 74 20 77 72 69 74 65 2c 20 67 69 76  first write, giv
2a7a0 65 20 74 68 65 20 56 46 53 20 61 20 68 69 6e 74  e the VFS a hint
2a7b0 20 6f 66 20 77 68 61 74 20 74 68 65 20 66 69 6e   of what the fin
2a7c0 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a  al.  ** file siz
2a7d0 65 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a  e will be..  */.
2a7e0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
2a7f0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
2a800 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
2a810 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2a820 45 5f 4f 4b 20 0a 20 20 20 26 26 20 70 50 61 67  E_OK .   && pPag
2a830 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 3c 70  er->dbHintSize<p
2a840 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 0a 20 20  Pager->dbSize.  
2a850 20 26 26 20 28 70 4c 69 73 74 2d 3e 70 44 69 72   && (pList->pDir
2a860 74 79 20 7c 7c 20 70 4c 69 73 74 2d 3e 70 67 6e  ty || pList->pgn
2a870 6f 3e 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74  o>pPager->dbHint
2a880 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 20 73  Size).  ){.    s
2a890 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 46  qlite3_int64 szF
2a8a0 69 6c 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ile = pPager->pa
2a8b0 67 65 53 69 7a 65 20 2a 20 28 73 71 6c 69 74 65  geSize * (sqlite
2a8c0 33 5f 69 6e 74 36 34 29 70 50 61 67 65 72 2d 3e  3_int64)pPager->
2a8d0 64 62 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c 69  dbSize;.    sqli
2a8e0 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
2a8f0 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c  Hint(pPager->fd,
2a900 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49   SQLITE_FCNTL_SI
2a910 5a 45 5f 48 49 4e 54 2c 20 26 73 7a 46 69 6c 65  ZE_HINT, &szFile
2a920 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
2a930 62 48 69 6e 74 53 69 7a 65 20 3d 20 70 50 61 67  bHintSize = pPag
2a940 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a  er->dbSize;.  }.
2a950 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
2a960 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74  LITE_OK && pList
2a970 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
2a980 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b  o = pList->pgno;
2a990 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
2a9a0 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65  e are dirty page
2a9b0 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
2a9c0 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75  che with page nu
2a9d0 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20  mbers greater.  
2a9e0 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
2a9f0 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61  dbSize, this mea
2aa00 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  ns sqlite3PagerT
2aa10 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77  runcateImage() w
2aa20 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20  as called to.   
2aa30 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c   ** make the fil
2aa40 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75  e smaller (presu
2aa50 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61  mably by auto-va
2aa60 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e  cuum code). Do n
2aa70 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20  ot write.    ** 
2aa80 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74  any such pages t
2aa90 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  o the file..    
2aaa0 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20  **.    ** Also, 
2aab0 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74  do not write out
2aac0 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 68   any page that h
2aad0 61 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e  as the PGHDR_DON
2aae0 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20  T_WRITE flag.   
2aaf0 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79 20   ** set (set by 
2ab00 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
2ab10 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f  Write())..    */
2ab20 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
2ab30 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26  Pager->dbSize &&
2ab40 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67   0==(pList->flag
2ab50 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  s&PGHDR_DONT_WRI
2ab60 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34  TE) ){.      i64
2ab70 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d   offset = (pgno-
2ab80 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
2ab90 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f  pageSize;   /* O
2aba0 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 2a  ffset to write *
2abb0 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44  /.      char *pD
2abc0 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
2abd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2abe0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 74         /* Data t
2abf0 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a  o write */    ..
2ac00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
2ac10 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44  List->flags&PGHD
2ac20 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d 30 20  R_NEED_SYNC)==0 
2ac30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  );.      if( pLi
2ac40 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 20 70 61  st->pgno==1 ) pa
2ac50 67 65 72 5f 77 72 69 74 65 5f 63 68 61 6e 67 65  ger_write_change
2ac60 63 6f 75 6e 74 65 72 28 70 4c 69 73 74 29 3b 0a  counter(pList);.
2ac70 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65  .      /* Encode
2ac80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
2ac90 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50  .      CODEC2(pP
2aca0 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61  ager, pList->pDa
2acb0 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74  ta, pgno, 6, ret
2acc0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2acd0 5f 42 4b 50 54 2c 20 70 44 61 74 61 29 3b 0a 0a  _BKPT, pData);..
2ace0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f        /* Write o
2acf0 75 74 20 74 68 65 20 70 61 67 65 20 64 61 74 61  ut the page data
2ad00 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
2ad10 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
2ad20 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61  Pager->fd, pData
2ad30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
2ad40 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20  ze, offset);..  
2ad50 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31      /* If page 1
2ad60 20 77 61 73 20 6a 75 73 74 20 77 72 69 74 74 65   was just writte
2ad70 6e 2c 20 75 70 64 61 74 65 20 50 61 67 65 72 2e  n, update Pager.
2ad80 64 62 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61  dbFileVers to ma
2ad90 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  tch.      ** the
2ada0 20 76 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65   value now store
2adb0 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
2adc0 65 20 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69  e file. If writi
2add0 6e 67 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a  ng this .      *
2ade0 2a 20 70 61 67 65 20 63 61 75 73 65 64 20 74 68  * page caused th
2adf0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2ae00 74 6f 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20  to grow, update 
2ae10 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20  dbFileSize. .   
2ae20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
2ae30 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pgno==1 ){.     
2ae40 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
2ae50 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
2ae60 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f  pData[24], sizeo
2ae70 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
2ae80 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
2ae90 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70        if( pgno>p
2aea0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
2aeb0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  e ){.        pPa
2aec0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
2aed0 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  = pgno;.      }.
2aee0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53        pPager->aS
2aef0 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 57  tat[PAGER_STAT_W
2af00 52 49 54 45 5d 2b 2b 3b 0a 0a 20 20 20 20 20 20  RITE]++;..      
2af10 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20 62 61  /* Update any ba
2af20 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70  ckup objects cop
2af30 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
2af40 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e  s of this pager.
2af50 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2af60 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50  3BackupUpdate(pP
2af70 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70  ager->pBackup, p
2af80 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d  gno, (u8*)pList-
2af90 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20  >pData);..      
2afa0 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4f  PAGERTRACE(("STO
2afb0 52 45 20 25 64 20 70 61 67 65 20 25 64 20 68 61  RE %d page %d ha
2afc0 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
2afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afe0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
2aff0 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67   pgno, pager_pag
2b000 65 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a  ehash(pList)));.
2b010 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
2b020 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20  PGOUT %p %d\n", 
2b030 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
2b040 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
2b050 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  (sqlite3_pager_w
2b060 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20  ritedb_count);. 
2b070 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b080 50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53  PAGERTRACE(("NOS
2b090 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c  TORE %d page %d\
2b0a0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
2b0b0 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  er), pgno));.   
2b0c0 20 7d 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74   }.    pager_set
2b0d0 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
2b0e0 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c  ;.    pList = pL
2b0f0 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d  ist->pDirty;.  }
2b100 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2b110 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74  ../*.** Ensure t
2b120 68 61 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  hat the sub-jour
2b130 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
2b140 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61  . If it is alrea
2b150 64 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a  dy open, this .*
2b160 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  * function is a 
2b170 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  no-op..**.** SQL
2b180 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2b190 65 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  ed if everything
2b1a0 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20   goes according 
2b1b0 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20  to plan. An .** 
2b1c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
2b1d0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
2b1e0 65 74 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c  eturned if a cal
2b1f0 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70  l to sqlite3OsOp
2b200 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a  en() .** fails..
2b210 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
2b220 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67  enSubJournal(Pag
2b230 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2b240 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2b250 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  K;.  if( !isOpen
2b260 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
2b270 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
2b280 66 6c 61 67 73 20 3d 20 20 53 51 4c 49 54 45 5f  flags =  SQLITE_
2b290 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
2b2a0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  | SQLITE_OPEN_RE
2b2b0 41 44 57 52 49 54 45 20 0a 20 20 20 20 20 20 7c  ADWRITE .      |
2b2c0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
2b2d0 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ATE | SQLITE_OPE
2b2e0 4e 5f 45 58 43 4c 55 53 49 56 45 20 0a 20 20 20  N_EXCLUSIVE .   
2b2f0 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e     | SQLITE_OPEN
2b300 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a  _DELETEONCLOSE;.
2b310 20 20 20 20 69 6e 74 20 6e 53 74 6d 74 53 70 69      int nStmtSpi
2b320 6c 6c 20 3d 20 73 71 6c 69 74 65 33 43 6f 6e 66  ll = sqlite3Conf
2b330 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b 0a 20  ig.nStmtSpill;. 
2b340 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
2b350 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
2b360 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
2b370 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e  MORY || pPager->
2b380 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a  subjInMemory ){.
2b390 20 20 20 20 20 20 6e 53 74 6d 74 53 70 69 6c 6c        nStmtSpill
2b3a0 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
2b3b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75   rc = sqlite3Jou
2b3c0 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
2b3d0 3e 70 56 66 73 2c 20 30 2c 20 70 50 61 67 65 72  >pVfs, 0, pPager
2b3e0 2d 3e 73 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6e  ->sjfd, flags, n
2b3f0 53 74 6d 74 53 70 69 6c 6c 29 3b 0a 20 20 7d 0a  StmtSpill);.  }.
2b400 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2b410 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72  /*.** Append a r
2b420 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63 75 72  ecord of the cur
2b430 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 70 61  rent state of pa
2b440 67 65 20 70 50 67 20 74 6f 20 74 68 65 20 73 75  ge pPg to the su
2b450 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a 0a 2a  b-journal. .**.*
2b460 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
2b470 20 73 65 74 20 74 68 65 20 62 69 74 20 63 6f 72   set the bit cor
2b480 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50  responding to pP
2b490 67 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62  g->pgno in the b
2b4a0 69 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c  itvecs.** for al
2b4b0 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  l open savepoint
2b4c0 73 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  s before returni
2b4d0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ng..**.** This f
2b4e0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
2b4f0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
2b500 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
2b510 73 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20  ssful, an IO.** 
2b520 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68  error code if th
2b530 65 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  e attempt to wri
2b540 74 65 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  te to the sub-jo
2b550 75 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20  urnal fails, or 
2b560 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
2b570 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
2b580 6c 73 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67  ls while setting
2b590 20 61 20 62 69 74 20 69 6e 20 61 20 73 61 76 65   a bit in a save
2b5a0 70 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e  point.** bitvec.
2b5b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
2b5c0 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67  ubjournalPage(Pg
2b5d0 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74  Hdr *pPg){.  int
2b5e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2b5f0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2b600 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
2b610 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
2b620 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
2b630 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
2b640 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e   ){..    /* Open
2b650 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2b660 2c 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20  , if it has not 
2b670 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65  already been ope
2b680 6e 65 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ned */.    asser
2b690 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
2b6a0 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73  urnal );.    ass
2b6b0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
2b6c0 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65  er->jfd) || page
2b6d0 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2b6e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
2b6f0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
2b700 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  fd) || pPager->n
2b710 53 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20  SubRec==0 );.   
2b720 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
2b730 65 57 61 6c 28 70 50 61 67 65 72 29 20 0a 20 20  eWal(pPager) .  
2b740 20 20 20 20 20 20 20 7c 7c 20 70 61 67 65 49 6e         || pageIn
2b750 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
2b760 70 50 67 29 20 0a 20 20 20 20 20 20 20 20 20 7c  pPg) .         |
2b770 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  | pPg->pgno>pPag
2b780 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 0a  er->dbOrigSize .
2b790 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d 20      );.    rc = 
2b7a0 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70  openSubJournal(p
2b7b0 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  Pager);..    /* 
2b7c0 49 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  If the sub-journ
2b7d0 61 6c 20 77 61 73 20 6f 70 65 6e 65 64 20 73 75  al was opened su
2b7e0 63 63 65 73 73 66 75 6c 6c 79 20 28 6f 72 20 77  ccessfully (or w
2b7f0 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29  as already open)
2b800 2c 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 74  ,.    ** write t
2b810 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
2b820 64 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  d into the file.
2b830 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
2b840 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b850 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20      void *pData 
2b860 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20  = pPg->pData;.  
2b870 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
2b880 20 28 69 36 34 29 70 50 61 67 65 72 2d 3e 6e 53   (i64)pPager->nS
2b890 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
2b8a0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
2b8b0 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
2b8c0 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  .#if SQLITE_HAS_
2b8d0 43 4f 44 45 43 20 20 20 0a 20 20 20 20 20 20 69  CODEC   .      i
2b8e0 66 28 20 21 70 50 61 67 65 72 2d 3e 73 75 62 6a  f( !pPager->subj
2b8f0 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20 20 20  InMemory ){.    
2b900 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
2b910 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
2b920 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53  gno, 7, return S
2b930 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
2b940 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  , pData2);.     
2b950 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
2b960 20 20 20 20 70 44 61 74 61 32 20 3d 20 70 44 61      pData2 = pDa
2b970 74 61 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54  ta;.      PAGERT
2b980 52 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52  RACE(("STMT-JOUR
2b990 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
2b9a0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
2b9b0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b  r), pPg->pgno));
2b9c0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
2b9d0 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
2b9e0 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50  sjfd, offset, pP
2b9f0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
2ba00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2ba10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
2ba20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
2ba30 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70  (pPager->sjfd, p
2ba40 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70  Data2, pPager->p
2ba50 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b  ageSize, offset+
2ba60 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  4);.      }.    
2ba70 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
2ba80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ba90 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63   pPager->nSubRec
2baa0 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
2bab0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
2bac0 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  nt>0 );.    rc =
2bad0 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
2bae0 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70  itvecs(pPager, p
2baf0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  Pg->pgno);.  }. 
2bb00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74   return rc;.}.st
2bb10 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72  atic int subjour
2bb20 6e 61 6c 50 61 67 65 49 66 52 65 71 75 69 72 65  nalPageIfRequire
2bb30 64 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  d(PgHdr *pPg){. 
2bb40 20 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65   if( subjRequire
2bb50 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20  sPage(pPg) ){.  
2bb60 20 20 72 65 74 75 72 6e 20 73 75 62 6a 6f 75 72    return subjour
2bb70 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20  nalPage(pPg);.  
2bb80 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
2bb90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2bba0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2bbb0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2bbc0 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65 20  d by the pcache 
2bbd0 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68 61  layer when it ha
2bbe0 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a  s reached some.*
2bbf0 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69  * soft memory li
2bc00 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74 20 61  mit. The first a
2bc10 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
2bc20 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20  nter to a Pager 
2bc30 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20  object.** (cast 
2bc40 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65  as a void*). The
2bc50 20 70 61 67 65 72 20 69 73 20 61 6c 77 61 79 73   pager is always
2bc60 20 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f   'purgeable' (no
2bc70 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  t an in-memory.*
2bc80 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54 68 65  * database). The
2bc90 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
2bca0 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20   is a reference 
2bcb0 74 6f 20 61 20 70 61 67 65 20 74 68 61 74 20 69  to a page that i
2bcc0 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  s .** currently 
2bcd0 64 69 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f  dirty but has no
2bce0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
2bcf0 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67  erences. The pag
2bd00 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61  e.** is always a
2bd10 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
2bd20 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
2bd30 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
2bd40 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  rst .** argument
2bd50 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20  ..**.** The job 
2bd60 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
2bd70 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20   is to make pPg 
2bd80 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67  clean by writing
2bd90 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   its contents.**
2bda0 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
2bdb0 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f  base file, if po
2bdc0 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79  ssible. This may
2bdd0 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67   involve syncing
2bde0 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
2bdf0 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
2be00 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69  successful, sqli
2be10 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
2be20 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  an() is called o
2be30 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a  n the page and.*
2be40 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
2be50 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
2be60 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
2be70 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65  e trying to make
2be80 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65   the.** page cle
2be90 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  an, the IO error
2bea0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2beb0 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 63  d. If the page c
2bec0 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65  annot be.** made
2bed0 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20   clean for some 
2bee0 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75  other reason, bu
2bef0 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
2bf00 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  s, then SQLITE_O
2bf10 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
2bf20 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68   by sqlite3Pcach
2bf30 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20  eMakeClean() is 
2bf40 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73  not called..*/.s
2bf50 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
2bf60 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50  tress(void *p, P
2bf70 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
2bf80 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50  ger *pPager = (P
2bf90 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20  ager *)p;.  int 
2bfa0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2bfb0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
2bfc0 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29  pPager==pPager )
2bfd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
2bfe0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
2bff0 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  TY );..  /* The 
2c000 64 6f 4e 6f 74 53 70 69 6c 6c 20 4e 4f 53 59 4e  doNotSpill NOSYN
2c010 43 20 62 69 74 20 69 73 20 73 65 74 20 64 75 72  C bit is set dur
2c020 69 6e 67 20 74 69 6d 65 73 20 77 68 65 6e 20 64  ing times when d
2c030 6f 69 6e 67 20 61 20 73 79 6e 63 20 6f 66 0a 20  oing a sync of. 
2c040 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64   ** journal (and
2c050 20 61 64 64 69 6e 67 20 61 20 6e 65 77 20 68 65   adding a new he
2c060 61 64 65 72 29 20 69 73 20 6e 6f 74 20 61 6c 6c  ader) is not all
2c070 6f 77 65 64 2e 20 20 54 68 69 73 20 6f 63 63 75  owed.  This occu
2c080 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 63  rs.  ** during c
2c090 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50  alls to sqlite3P
2c0a0 61 67 65 72 57 72 69 74 65 28 29 20 77 68 69 6c  agerWrite() whil
2c0b0 65 20 74 72 79 69 6e 67 20 74 6f 20 6a 6f 75 72  e trying to jour
2c0c0 6e 61 6c 20 6d 75 6c 74 69 70 6c 65 0a 20 20 2a  nal multiple.  *
2c0d0 2a 20 70 61 67 65 73 20 62 65 6c 6f 6e 67 69 6e  * pages belongin
2c0e0 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65  g to the same se
2c0f0 63 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ctor..  **.  ** 
2c100 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 52  The doNotSpill R
2c110 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 4f 46 46 20  OLLBACK and OFF 
2c120 62 69 74 73 20 69 6e 68 69 62 69 74 73 20 61 6c  bits inhibits al
2c130 6c 20 63 61 63 68 65 20 73 70 69 6c 6c 69 6e 67  l cache spilling
2c140 0a 20 20 2a 2a 20 72 65 67 61 72 64 6c 65 73 73  .  ** regardless
2c150 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e   of whether or n
2c160 6f 74 20 61 20 73 79 6e 63 20 69 73 20 72 65 71  ot a sync is req
2c170 75 69 72 65 64 2e 20 20 54 68 69 73 20 69 73 20  uired.  This is 
2c180 73 65 74 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20  set during.  ** 
2c190 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 62 79  a rollback or by
2c1a0 20 75 73 65 72 20 72 65 71 75 65 73 74 2c 20 72   user request, r
2c1b0 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 2a  espectively..  *
2c1c0 2a 0a 20 20 2a 2a 20 53 70 69 6c 6c 69 6e 67 20  *.  ** Spilling 
2c1d0 69 73 20 61 6c 73 6f 20 70 72 6f 68 69 62 69 74  is also prohibit
2c1e0 65 64 20 77 68 65 6e 20 69 6e 20 61 6e 20 65 72  ed when in an er
2c1f0 72 6f 72 20 73 74 61 74 65 20 73 69 6e 63 65 20  ror state since 
2c200 74 68 61 74 20 63 6f 75 6c 64 0a 20 20 2a 2a 20  that could.  ** 
2c210 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
2c220 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 20 49   corruption.   I
2c230 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d  n the current im
2c240 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 74 20  plementation it 
2c250 0a 20 20 2a 2a 20 69 73 20 69 6d 70 6f 73 73 69  .  ** is impossi
2c260 62 6c 65 20 66 6f 72 20 73 71 6c 69 74 65 33 50  ble for sqlite3P
2c270 63 61 63 68 65 46 65 74 63 68 28 29 20 74 6f 20  cacheFetch() to 
2c280 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 63  be called with c
2c290 72 65 61 74 65 46 6c 61 67 3d 3d 33 0a 20 20 2a  reateFlag==3.  *
2c2a0 2a 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 65  * while in the e
2c2b0 72 72 6f 72 20 73 74 61 74 65 2c 20 68 65 6e 63  rror state, henc
2c2c0 65 20 69 74 20 69 73 20 69 6d 70 6f 73 73 69 62  e it is impossib
2c2d0 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74  le for this rout
2c2e0 69 6e 65 20 74 6f 0a 20 20 2a 2a 20 62 65 20 63  ine to.  ** be c
2c2f0 61 6c 6c 65 64 20 69 6e 20 74 68 65 20 65 72 72  alled in the err
2c300 6f 72 20 73 74 61 74 65 2e 20 20 4e 65 76 65 72  or state.  Never
2c310 74 68 65 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c  theless, we incl
2c320 75 64 65 20 61 20 4e 45 56 45 52 28 29 0a 20 20  ude a NEVER().  
2c330 2a 2a 20 74 65 73 74 20 66 6f 72 20 74 68 65 20  ** test for the 
2c340 65 72 72 6f 72 20 73 74 61 74 65 20 61 73 20 61  error state as a
2c350 20 73 61 66 65 67 75 61 72 64 20 61 67 61 69 6e   safeguard again
2c360 73 74 20 66 75 74 75 72 65 20 63 68 61 6e 67 65  st future change
2c370 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45  s..  */.  if( NE
2c380 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72 72 43  VER(pPager->errC
2c390 6f 64 65 29 20 29 20 72 65 74 75 72 6e 20 53 51  ode) ) return SQ
2c3a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 74 65 73 74 63  LITE_OK;.  testc
2c3b0 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ase( pPager->doN
2c3c0 6f 74 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46  otSpill & SPILLF
2c3d0 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  LAG_ROLLBACK );.
2c3e0 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
2c3f0 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26  er->doNotSpill &
2c400 20 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 20 29   SPILLFLAG_OFF )
2c410 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50  ;.  testcase( pP
2c420 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c  ager->doNotSpill
2c430 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f 53   & SPILLFLAG_NOS
2c440 59 4e 43 20 29 3b 0a 20 20 69 66 28 20 70 50 61  YNC );.  if( pPa
2c450 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 0a  ger->doNotSpill.
2c460 20 20 20 26 26 20 28 28 70 50 61 67 65 72 2d 3e     && ((pPager->
2c470 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 28 53 50  doNotSpill & (SP
2c480 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b  ILLFLAG_ROLLBACK
2c490 7c 53 50 49 4c 4c 46 4c 41 47 5f 4f 46 46 29 29  |SPILLFLAG_OFF))
2c4a0 21 3d 30 0a 20 20 20 20 20 20 7c 7c 20 28 70 50  !=0.      || (pP
2c4b0 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52  g->flags & PGHDR
2c4c0 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30 29 0a  _NEED_SYNC)!=0).
2c4d0 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
2c4e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
2c4f0 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
2c500 30 3b 0a 20 20 69 66 28 20 70 61 67 65 72 55 73  0;.  if( pagerUs
2c510 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
2c520 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 73      /* Write a s
2c530 69 6e 67 6c 65 20 66 72 61 6d 65 20 66 6f 72 20  ingle frame for 
2c540 74 68 69 73 20 70 61 67 65 20 74 6f 20 74 68 65  this page to the
2c550 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20   log. */.    rc 
2c560 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  = subjournalPage
2c570 49 66 52 65 71 75 69 72 65 64 28 70 50 67 29 3b  IfRequired(pPg);
2c580 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51   .    if( rc==SQ
2c590 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2c5a0 20 72 63 20 3d 20 70 61 67 65 72 57 61 6c 46 72   rc = pagerWalFr
2c5b0 61 6d 65 73 28 70 50 61 67 65 72 2c 20 70 50 67  ames(pPager, pPg
2c5c0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
2c5d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 0a 23 69 66   }else{.    .#if
2c5e0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2c5f0 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57  E_BATCH_ATOMIC_W
2c600 52 49 54 45 0a 20 20 20 20 69 66 28 20 70 50 61  RITE.    if( pPa
2c610 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30  ger->tempFile==0
2c620 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2c630 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65  qlite3JournalCre
2c640 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ate(pPager->jfd)
2c650 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2c660 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
2c670 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
2c680 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
2c690 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 20 20  }.#endif.  .    
2c6a0 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  /* Sync the jour
2c6b0 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75  nal file if requ
2c6c0 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ired. */.    if(
2c6d0 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
2c6e0 52 5f 4e 45 45 44 5f 53 59 4e 43 20 0a 20 20 20  R_NEED_SYNC .   
2c6f0 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74    || pPager->eSt
2c700 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
2c710 52 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 29  R_CACHEMOD.    )
2c720 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e  {.      rc = syn
2c730 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  cJournal(pPager,
2c740 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20   1);.    }.  .  
2c750 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63    /* Write the c
2c760 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
2c770 61 67 65 20 6f 75 74 20 74 6f 20 74 68 65 20 64  age out to the d
2c780 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
2c790 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2c7a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2c7b0 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c  assert( (pPg->fl
2c7c0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
2c7d0 59 4e 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  YNC)==0 );.     
2c7e0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
2c7f0 65 5f 70 61 67 65 6c 69 73 74 28 70 50 61 67 65  e_pagelist(pPage
2c800 72 2c 20 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  r, pPg);.    }. 
2c810 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68   }..  /* Mark th
2c820 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
2c830 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
2c840 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
2c850 41 47 45 52 54 52 41 43 45 28 28 22 53 54 52 45  AGERTRACE(("STRE
2c860 53 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  SS %d page %d\n"
2c870 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
2c880 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  ), pPg->pgno));.
2c890 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
2c8a0 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b  eMakeClean(pPg);
2c8b0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
2c8c0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
2c8d0 72 2c 20 72 63 29 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  r, rc); .}../*.*
2c8e0 2a 20 46 6c 75 73 68 20 61 6c 6c 20 75 6e 72 65  * Flush all unre
2c8f0 66 65 72 65 6e 63 65 64 20 64 69 72 74 79 20 70  ferenced dirty p
2c900 61 67 65 73 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f  ages to disk..*/
2c910 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2c920 72 46 6c 75 73 68 28 50 61 67 65 72 20 2a 70 50  rFlush(Pager *pP
2c930 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
2c940 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
2c950 65 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20  e;.  if( !MEMDB 
2c960 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 4c  ){.    PgHdr *pL
2c970 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50 63 61  ist = sqlite3Pca
2c980 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
2c990 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
2c9a0 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65 72     assert( asser
2c9b0 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70 50  t_pager_state(pP
2c9c0 61 67 65 72 29 20 29 3b 0a 20 20 20 20 77 68 69  ager) );.    whi
2c9d0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
2c9e0 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20  K && pList ){.  
2c9f0 20 20 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74      PgHdr *pNext
2ca00 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
2ca10 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
2ca20 74 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  t->nRef==0 ){.  
2ca30 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2ca40 53 74 72 65 73 73 28 28 76 6f 69 64 2a 29 70 50  Stress((void*)pP
2ca50 61 67 65 72 2c 20 70 4c 69 73 74 29 3b 0a 20 20  ager, pList);.  
2ca60 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 69 73      }.      pLis
2ca70 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 7d  t = pNext;.    }
2ca80 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
2ca90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  c;.}../*.** Allo
2caa0 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
2cab0 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72 20  ize a new Pager 
2cac0 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61  object and put a
2cad0 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a   pointer to it.*
2cae0 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54  * in *ppPager. T
2caf0 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20  he pager should 
2cb00 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72  eventually be fr
2cb10 65 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 69  eed by passing i
2cb20 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50  t.** to sqlite3P
2cb30 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a  agerClose()..**.
2cb40 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65  ** The zFilename
2cb50 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
2cb60 20 70 61 74 68 20 74 6f 20 74 68 65 20 64 61 74   path to the dat
2cb70 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
2cb80 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  en..** If zFilen
2cb90 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  ame is NULL then
2cba0 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65   a randomly-name
2cbb0 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  d temporary file
2cbc0 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
2cbd0 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66  nd used as the f
2cbe0 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
2cbf0 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  . Temporary file
2cc00 73 20 61 72 65 20 62 65 20 64 65 6c 65 74 65 64  s are be deleted
2cc10 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
2cc20 79 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20  y when they are 
2cc30 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65  closed. If zFile
2cc40 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79  name is ":memory
2cc50 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20  :" then .** all 
2cc60 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68  information is h
2cc70 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74  eld in cache. It
2cc80 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65   is never writte
2cc90 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54  n to disk. .** T
2cca0 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
2ccb0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20  to implement an 
2ccc0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
2ccd0 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45  se..**.** The nE
2cce0 78 74 72 61 20 70 61 72 61 6d 65 74 65 72 20 73  xtra parameter s
2ccf0 70 65 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d  pecifies the num
2cd00 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
2cd10 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a  space allocated.
2cd20 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61  ** along with ea
2cd30 63 68 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ch page referenc
2cd40 65 2e 20 54 68 69 73 20 73 70 61 63 65 20 69 73  e. This space is
2cd50 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68   available to th
2cd60 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68  e user.** via th
2cd70 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  e sqlite3PagerGe
2cd80 74 45 78 74 72 61 28 29 20 41 50 49 2e 20 20 57  tExtra() API.  W
2cd90 68 65 6e 20 61 20 6e 65 77 20 70 61 67 65 20 69  hen a new page i
2cda0 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 74 68 65  s allocated, the
2cdb0 0a 2a 2a 20 66 69 72 73 74 20 38 20 62 79 74 65  .** first 8 byte
2cdc0 73 20 6f 66 20 74 68 69 73 20 73 70 61 63 65 20  s of this space 
2cdd0 61 72 65 20 7a 65 72 6f 65 64 20 62 75 74 20 74  are zeroed but t
2cde0 68 65 20 72 65 6d 61 69 6e 64 65 72 20 69 73 20  he remainder is 
2cdf0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 2a  uninitialized..*
2ce00 2a 20 28 54 68 65 20 65 78 74 72 61 20 73 70 61  * (The extra spa
2ce10 63 65 20 69 73 20 75 73 65 64 20 62 79 20 62 74  ce is used by bt
2ce20 72 65 65 20 61 73 20 74 68 65 20 4d 65 6d 50 61  ree as the MemPa
2ce30 67 65 20 6f 62 6a 65 63 74 2e 29 0a 2a 2a 0a 2a  ge object.).**.*
2ce40 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72 67 75  * The flags argu
2ce50 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20  ment is used to 
2ce60 73 70 65 63 69 66 79 20 70 72 6f 70 65 72 74 69  specify properti
2ce70 65 73 20 74 68 61 74 20 61 66 66 65 63 74 20 74  es that affect t
2ce80 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  he.** operation 
2ce90 6f 66 20 74 68 65 20 70 61 67 65 72 2e 20 49 74  of the pager. It
2cea0 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65   should be passe
2ceb0 64 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63  d some bitwise c
2cec0 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66  ombination.** of
2ced0 20 74 68 65 20 50 41 47 45 52 5f 2a 20 66 6c 61   the PAGER_* fla
2cee0 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66  gs..**.** The vf
2cef0 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72  sFlags parameter
2cf00 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f   is a bitmask to
2cf10 20 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61   pass to the fla
2cf20 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  gs parameter.** 
2cf30 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d  of the xOpen() m
2cf40 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70  ethod of the sup
2cf50 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f  plied VFS when o
2cf60 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a  pening files. .*
2cf70 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
2cf80 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f  r object is allo
2cf90 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 73 70  cated and the sp
2cfa0 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65  ecified file ope
2cfb0 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66  ned .** successf
2cfc0 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ully, SQLITE_OK 
2cfd0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
2cfe0 2a 70 70 50 61 67 65 72 20 73 65 74 20 74 6f 20  *ppPager set to 
2cff0 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  point to.** the 
2d000 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74  new pager object
2d010 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
2d020 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69  curs, *ppPager i
2d030 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a  s set to NULL.**
2d040 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20   and error code 
2d050 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66  returned. This f
2d060 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75  unction may retu
2d070 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  rn SQLITE_NOMEM.
2d080 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  ** (sqlite3Mallo
2d090 63 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61  c() is used to a
2d0a0 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c  llocate memory),
2d0b0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
2d0c0 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20   or .** various 
2d0d0 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72  SQLITE_IO_XXX er
2d0e0 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rors..*/.int sql
2d0f0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20  ite3PagerOpen(. 
2d100 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
2d110 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  fs,       /* The
2d120 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79   virtual file sy
2d130 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20  stem to use */. 
2d140 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
2d150 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ,         /* OUT
2d160 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67  : Return the Pag
2d170 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72  er structure her
2d180 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
2d190 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
2d1a0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
2d1b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
2d1c0 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  open */.  int nE
2d1d0 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20  xtra,           
2d1e0 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65     /* Extra byte
2d1f0 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68  s append to each
2d200 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
2d210 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
2d220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d230 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69   flags controlli
2d240 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  ng this file */.
2d250 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20    int vfsFlags, 
2d260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
2d270 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
2d280 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66  gh to sqlite3_vf
2d290 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 76  s.xOpen() */.  v
2d2a0 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44  oid (*xReinit)(D
2d2b0 62 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e 63 74  bPage*) /* Funct
2d2c0 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69 61 6c  ion to reinitial
2d2d0 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29 7b 0a  ize pages */.){.
2d2e0 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61    u8 *pPtr;.  Pa
2d2f0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b  ger *pPager = 0;
2d300 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
2d310 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61  object to alloca
2d320 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f  te and return */
2d330 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2d340 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52  TE_OK;      /* R
2d350 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2d360 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30  int tempFile = 0
2d370 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
2d380 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20   for temp files 
2d390 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79  (incl. in-memory
2d3a0 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74   files) */.  int
2d3b0 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20   memDb = 0;     
2d3c0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2d3d0 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
2d3e0 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
2d3f0 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30  int readOnly = 0
2d400 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
2d410 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65   if this is a re
2d420 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a  ad-only file */.
2d430 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c    int journalFil
2d440 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79  eSize;     /* By
2d450 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
2d460 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c  for each journal
2d470 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   fd */.  char *z
2d480 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20  Pathname = 0;   
2d490 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74    /* Full path t
2d4a0 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  o database file 
2d4b0 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61  */.  int nPathna
2d4c0 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  me = 0;       /*
2d4d0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2d4e0 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f   in zPathname */
2d4f0 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61  .  int useJourna
2d500 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  l = (flags & PAG
2d510 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29  ER_OMIT_JOURNAL)
2d520 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f  ==0; /* False to
2d530 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f   omit journal */
2d540 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a  .  int pcacheSiz
2d550 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  e = sqlite3Pcach
2d560 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20 2f  eSize();       /
2d570 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  * Bytes to alloc
2d580 61 74 65 20 66 6f 72 20 50 43 61 63 68 65 20 2a  ate for PCache *
2d590 2f 0a 20 20 75 33 32 20 73 7a 50 61 67 65 44 66  /.  u32 szPageDf
2d5a0 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  lt = SQLITE_DEFA
2d5b0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20  ULT_PAGE_SIZE;  
2d5c0 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65 20  /* Default page 
2d5d0 73 69 7a 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  size */.  const 
2d5e0 63 68 61 72 20 2a 7a 55 72 69 20 3d 20 30 3b 20  char *zUri = 0; 
2d5f0 20 20 20 2f 2a 20 55 52 49 20 61 72 67 73 20 74     /* URI args t
2d600 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20  o copy */.  int 
2d610 6e 55 72 69 20 3d 20 30 3b 20 20 20 20 20 20 20  nUri = 0;       
2d620 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2d630 66 20 62 79 74 65 73 20 6f 66 20 55 52 49 20 61  f bytes of URI a
2d640 72 67 73 20 61 74 20 2a 7a 55 72 69 20 2a 2f 0a  rgs at *zUri */.
2d650 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
2d660 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20   how much space 
2d670 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  is required for 
2d680 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  each journal fil
2d690 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74  e-handle.  ** (t
2d6a0 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20  here are two of 
2d6b0 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a  them, the main j
2d6c0 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73  ournal and the s
2d6d0 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 20 2a 2f  ub-journal).  */
2d6e0 0a 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  .  journalFileSi
2d6f0 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69  ze = ROUND8(sqli
2d700 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70  te3JournalSize(p
2d710 56 66 73 29 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  Vfs));..  /* Set
2d720 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69   the output vari
2d730 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20  able to NULL in 
2d740 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63  case an error oc
2d750 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61  curs. */.  *ppPa
2d760 67 65 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65  ger = 0;..#ifnde
2d770 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
2d780 4d 4f 52 59 44 42 0a 20 20 69 66 28 20 66 6c 61  MORYDB.  if( fla
2d790 67 73 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52  gs & PAGER_MEMOR
2d7a0 59 20 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d  Y ){.    memDb =
2d7b0 20 31 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c   1;.    if( zFil
2d7c0 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
2d7d0 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a  me[0] ){.      z
2d7e0 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
2d7f0 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 7a 46  e3DbStrDup(0, zF
2d800 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
2d810 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30  if( zPathname==0
2d820 20 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54    ) return SQLIT
2d830 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
2d840 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
2d850 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2d860 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
2d870 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b    zFilename = 0;
2d880 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
2d890 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  f..  /* Compute 
2d8a0 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75  and store the fu
2d8b0 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61  ll pathname in a
2d8c0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  n allocated buff
2d8d0 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20  er pointed.  ** 
2d8e0 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c  to by zPathname,
2d8f0 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d   length nPathnam
2d900 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69  e. Or, if this i
2d910 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
2d920 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62  le,.  ** leave b
2d930 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e  oth nPathname an
2d940 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20  d zPathname set 
2d950 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  to 0..  */.  if(
2d960 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
2d970 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
2d980 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
2d990 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
2d9a0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
2d9b0 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61  e+1;.    zPathna
2d9c0 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  me = sqlite3DbMa
2d9d0 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 50 61 74 68  llocRaw(0, nPath
2d9e0 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28  name*2);.    if(
2d9f0 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b   zPathname==0 ){
2da00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2da10 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
2da20 0a 20 20 20 20 7d 0a 20 20 20 20 7a 50 61 74 68  .    }.    zPath
2da30 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20  name[0] = 0; /* 
2da40 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74 69 61  Make sure initia
2da50 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20 46 75  lized even if Fu
2da60 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66 61 69  llPathname() fai
2da70 6c 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  ls */.    rc = s
2da80 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
2da90 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
2daa0 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c  name, nPathname,
2dab0 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
2dac0 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   nPathname = sql
2dad0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
2dae0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d  thname);.    z =
2daf0 20 7a 55 72 69 20 3d 20 26 7a 46 69 6c 65 6e 61   zUri = &zFilena
2db00 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  me[sqlite3Strlen
2db10 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 5d  30(zFilename)+1]
2db20 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20  ;.    while( *z 
2db30 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71  ){.      z += sq
2db40 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
2db50 2b 31 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73  +1;.      z += s
2db60 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2db70 29 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  )+1;.    }.    n
2db80 55 72 69 20 3d 20 28 69 6e 74 29 28 26 7a 5b 31  Uri = (int)(&z[1
2db90 5d 20 2d 20 7a 55 72 69 29 3b 0a 20 20 20 20 61  ] - zUri);.    a
2dba0 73 73 65 72 74 28 20 6e 55 72 69 3e 3d 30 20 29  ssert( nUri>=0 )
2dbb0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2dbc0 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68  LITE_OK && nPath
2dbd0 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50  name+8>pVfs->mxP
2dbe0 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
2dbf0 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
2dc00 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68  is taken when th
2dc10 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20 72  e journal path r
2dc20 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20  equired by.     
2dc30 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
2dc40 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 77 69   being opened wi
2dc50 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20  ll be more than 
2dc60 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2dc70 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20  .      ** bytes 
2dc80 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20  in length. This 
2dc90 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
2dca0 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65  se cannot be ope
2dcb0 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73  ned,.      ** as
2dcc0 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   it will not be 
2dcd0 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e  possible to open
2dce0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2dcf0 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20 20 20  e or even.      
2dd00 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68  ** check for a h
2dd10 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  ot-journal befor
2dd20 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20 20 20  e reading..     
2dd30 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
2dd40 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
2dd50 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KPT;.    }.    i
2dd60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2dd70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2dd80 33 44 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68  3DbFree(0, zPath
2dd90 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  name);.      ret
2dda0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2ddb0 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
2ddc0 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20   memory for the 
2ddd0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  Pager structure,
2dde0 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20   PCache object, 
2ddf0 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66  the.  ** three f
2de00 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c  ile descriptors,
2de10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2de20 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
2de30 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
2de40 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79  le name. The lay
2de50 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73  out in memory is
2de60 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
2de70 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72  *.  **     Pager
2de80 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
2de90 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65             (size
2dea0 6f 66 28 50 61 67 65 72 29 20 62 79 74 65 73 29  of(Pager) bytes)
2deb0 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65  .  **     PCache
2dec0 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
2ded0 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
2dee0 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 20 62  e3PcacheSize() b
2def0 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44  ytes).  **     D
2df00 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e  atabase file han
2df10 64 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 28  dle            (
2df20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62  pVfs->szOsFile b
2df30 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53  ytes).  **     S
2df40 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
2df50 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28  handle         (
2df60 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
2df70 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
2df80 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  Main journal fil
2df90 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
2dfa0 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
2dfb0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
2dfc0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   Database file n
2dfd0 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
2dfe0 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79   (nPathname+1 by
2dff0 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f  tes).  **     Jo
2e000 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
2e010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
2e020 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74  Pathname+8+1 byt
2e030 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20  es).  */.  pPtr 
2e040 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d  = (u8 *)sqlite3M
2e050 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52  allocZero(.    R
2e060 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50  OUND8(sizeof(*pP
2e070 61 67 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a  ager)) +      /*
2e080 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
2e090 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70   */.    ROUND8(p
2e0a0 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20  cacheSize) +    
2e0b0 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65         /* PCache
2e0c0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52   object */.    R
2e0d0 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73  OUND8(pVfs->szOs
2e0e0 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a  File) +       /*
2e0f0 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c   The main db fil
2e100 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  e */.    journal
2e110 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20  FileSize * 2 +  
2e120 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2e130 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  wo journal files
2e140 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61   */ .    nPathna
2e150 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 20 2b 20  me + 1 + nUri + 
2e160 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65          /* zFile
2e170 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74  name */.    nPat
2e180 68 6e 61 6d 65 20 2b 20 38 20 2b 20 32 20 20 20  hname + 8 + 2   
2e190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a             /* zJ
2e1a0 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
2e1b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
2e1c0 4c 0a 20 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d  L.    + nPathnam
2e1d0 65 20 2b 20 34 20 2b 20 32 20 20 20 20 20 20 20  e + 4 + 2       
2e1e0 20 20 20 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a       /* zWal */.
2e1f0 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20 61 73  #endif.  );.  as
2e200 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
2e210 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54  _ALIGNMENT(SQLIT
2e220 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75  E_INT_TO_PTR(jou
2e230 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29  rnalFileSize)) )
2e240 3b 0a 20 20 69 66 28 20 21 70 50 74 72 20 29 7b  ;.  if( !pPtr ){
2e250 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
2e260 65 65 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29  ee(0, zPathname)
2e270 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2e280 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
2e290 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20    }.  pPager =  
2e2a0 20 20 20 20 20 20 20 20 20 20 20 20 28 50 61 67              (Pag
2e2b0 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50  er*)(pPtr);.  pP
2e2c0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20  ager->pPCache = 
2e2d0 20 20 20 28 50 43 61 63 68 65 2a 29 28 70 50 74     (PCache*)(pPt
2e2e0 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  r += ROUND8(size
2e2f0 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20  of(*pPager)));. 
2e300 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20   pPager->fd =   
2e310 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
2e320 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70  pPtr += ROUND8(p
2e330 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70  cacheSize));.  p
2e340 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73  Pager->sjfd = (s
2e350 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50  qlite3_file*)(pP
2e360 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66  tr += ROUND8(pVf
2e370 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20  s->szOsFile));. 
2e380 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20   pPager->jfd =  
2e390 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
2e3a0 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46  pPtr += journalF
2e3b0 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  ileSize);.  pPag
2e3c0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  er->zFilename = 
2e3d0 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20     (char*)(pPtr 
2e3e0 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  += journalFileSi
2e3f0 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45  ze);.  assert( E
2e400 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
2e410 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ENT(pPager->jfd)
2e420 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   );..  /* Fill i
2e430 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c  n the Pager.zFil
2e440 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e  ename and Pager.
2e450 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73  zJournal buffers
2e460 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a  , if required. *
2e470 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d  /.  if( zPathnam
2e480 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
2e490 20 6e 50 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a   nPathname>0 );.
2e4a0 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75      pPager->zJou
2e4b0 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29  rnal =   (char*)
2e4c0 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61  (pPtr += nPathna
2e4d0 6d 65 20 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0a  me + 1 + nUri);.
2e4e0 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
2e4f0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  r->zFilename, zP
2e500 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
2e510 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 55 72  me);.    if( nUr
2e520 69 20 29 20 6d 65 6d 63 70 79 28 26 70 50 61 67  i ) memcpy(&pPag
2e530 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50  er->zFilename[nP
2e540 61 74 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69  athname+1], zUri
2e550 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d  , nUri);.    mem
2e560 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  cpy(pPager->zJou
2e570 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  rnal, zPathname,
2e580 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
2e590 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
2e5a0 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e  >zJournal[nPathn
2e5b0 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c  ame], "-journal\
2e5c0 30 30 30 22 2c 20 38 2b 32 29 3b 0a 20 20 20 20  000", 8+2);.    
2e5d0 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
2e5e0 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  x3(pPager->zFile
2e5f0 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  name, pPager->zJ
2e600 6f 75 72 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66  ournal);.#ifndef
2e610 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
2e620 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 57 61  .    pPager->zWa
2e630 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  l = &pPager->zJo
2e640 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b  urnal[nPathname+
2e650 38 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  8+1];.    memcpy
2e660 28 70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a  (pPager->zWal, z
2e670 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
2e680 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ame);.    memcpy
2e690 28 26 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e  (&pPager->zWal[n
2e6a0 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c  Pathname], "-wal
2e6b0 5c 30 30 30 22 2c 20 34 2b 31 29 3b 0a 20 20 20  \000", 4+1);.   
2e6c0 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
2e6d0 69 78 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ix3(pPager->zFil
2e6e0 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a  ename, pPager->z
2e6f0 57 61 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  Wal);.#endif.   
2e700 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30   sqlite3DbFree(0
2e710 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , zPathname);.  
2e720 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73  }.  pPager->pVfs
2e730 20 3d 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65   = pVfs;.  pPage
2e740 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66  r->vfsFlags = vf
2e750 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70  sFlags;..  /* Op
2e760 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  en the pager fil
2e770 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  e..  */.  if( zF
2e780 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
2e790 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69  name[0] ){.    i
2e7a0 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20  nt fout = 0;    
2e7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e7c0 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65 74  /* VFS flags ret
2e7d0 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29  urned by xOpen()
2e7e0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2e7f0 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
2e800 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2e810 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20  me, pPager->fd, 
2e820 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29  vfsFlags, &fout)
2e830 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 6d  ;.    assert( !m
2e840 65 6d 44 62 20 29 3b 0a 20 20 20 20 72 65 61 64  emDb );.    read
2e850 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c  Only = (fout&SQL
2e860 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
2e870 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  Y);..    /* If t
2e880 68 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63  he file was succ
2e890 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20  essfully opened 
2e8a0 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
2e8b0 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68  ccess,.    ** ch
2e8c0 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70  oose a default p
2e8d0 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65  age size in case
2e8e0 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61   we have to crea
2e8f0 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  te the.    ** da
2e900 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
2e910 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
2e920 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  ze is the maximu
2e930 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  m of:.    **.   
2e940 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f   **    + SQLITE_
2e950 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2e960 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  E,.    **    + T
2e970 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
2e980 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65  d by sqlite3OsSe
2e990 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a  ctorSize().    *
2e9a0 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65  *    + The large
2e9b0 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61  st page size tha
2e9c0 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  t can be written
2e9d0 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20   atomically..   
2e9e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
2e9f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ea00 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c     int iDc = sql
2ea10 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
2ea20 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
2ea30 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 69  er->fd);.      i
2ea40 66 28 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  f( !readOnly ){.
2ea50 20 20 20 20 20 20 20 20 73 65 74 53 65 63 74 6f          setSecto
2ea60 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
2ea70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
2ea80 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
2ea90 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d  E_SIZE<=SQLITE_M
2eaa0 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2eab0 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20 20 69  SIZE);.        i
2eac0 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50  f( szPageDflt<pP
2ead0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
2eae0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2eaf0 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
2eb00 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
2eb10 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2eb20 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
2eb30 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51   szPageDflt = SQ
2eb40 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2eb50 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20  _PAGE_SIZE;.    
2eb60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2eb70 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
2eb80 66 6c 74 20 3d 20 28 75 33 32 29 70 50 61 67 65  flt = (u32)pPage
2eb90 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20  r->sectorSize;. 
2eba0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2ebb0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
2ebc0 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
2ebd0 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 7b  _WRITE.        {
2ebe0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
2ebf0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  i;.          ass
2ec00 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
2ec10 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32  _ATOMIC512==(512
2ec20 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20  >>8));.         
2ec30 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
2ec40 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
2ec50 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
2ec60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
2ec70 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
2ec80 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33  _PAGE_SIZE<=6553
2ec90 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  6);.          fo
2eca0 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b  r(ii=szPageDflt;
2ecb0 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f   ii<=SQLITE_MAX_
2ecc0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2ecd0 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20  E; ii=ii*2){.   
2ece0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63           if( iDc
2ecf0 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
2ed00 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29  TOMIC|(ii>>8)) )
2ed10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2ed20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b  szPageDflt = ii;
2ed30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2ed40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2ed50 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2ed60 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
2ed70 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 73 71 6c 69 74  ->noLock = sqlit
2ed80 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a  e3_uri_boolean(z
2ed90 46 69 6c 65 6e 61 6d 65 2c 20 22 6e 6f 6c 6f 63  Filename, "noloc
2eda0 6b 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  k", 0);.      if
2edb0 28 20 28 69 44 63 20 26 20 53 51 4c 49 54 45 5f  ( (iDc & SQLITE_
2edc0 49 4f 43 41 50 5f 49 4d 4d 55 54 41 42 4c 45 29  IOCAP_IMMUTABLE)
2edd0 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71  !=0.       || sq
2ede0 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
2edf0 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 69 6d  n(zFilename, "im
2ee00 6d 75 74 61 62 6c 65 22 2c 20 30 29 20 29 7b 0a  mutable", 0) ){.
2ee10 20 20 20 20 20 20 20 20 20 20 76 66 73 46 6c 61            vfsFla
2ee20 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
2ee30 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
2ee40 20 20 20 20 20 20 67 6f 74 6f 20 61 63 74 5f 6c        goto act_l
2ee50 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65 3b 0a 20  ike_temp_file;. 
2ee60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2ee70 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
2ee80 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
2ee90 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
2eea0 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20  t is not opened 
2eeb0 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20  immediately..   
2eec0 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
2eed0 20 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64   we accept the d
2eee0 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
2eef0 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61   and delay actua
2ef00 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69  lly.    ** openi
2ef10 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69  ng the file unti
2ef20 6c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  l the first call
2ef30 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20   to OsWrite().. 
2ef40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
2ef50 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f  s branch is also
2ef60 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d   run for an in-m
2ef70 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20  emory database. 
2ef80 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20  An in-memory.   
2ef90 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
2efa0 74 68 65 20 73 61 6d 65 20 61 73 20 61 20 74 65  the same as a te
2efb0 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20  mp-file that is 
2efc0 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75  never written ou
2efd0 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b  t to.    ** disk
2efe0 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d   and uses an in-
2eff0 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20  memory rollback 
2f000 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2a 0a  journal..    **.
2f010 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e      ** This bran
2f020 63 68 20 61 6c 73 6f 20 72 75 6e 73 20 66 6f 72  ch also runs for
2f030 20 66 69 6c 65 73 20 6d 61 72 6b 65 64 20 61 73   files marked as
2f040 20 69 6d 6d 75 74 61 62 6c 65 2e 0a 20 20 20 20   immutable..    
2f050 2a 2f 20 0a 61 63 74 5f 6c 69 6b 65 5f 74 65 6d  */ .act_like_tem
2f060 70 5f 66 69 6c 65 3a 0a 20 20 20 20 74 65 6d 70  p_file:.    temp
2f070 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50  File = 1;.    pP
2f080 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50  ager->eState = P
2f090 41 47 45 52 5f 52 45 41 44 45 52 3b 20 20 20 20  AGER_READER;    
2f0a0 20 2f 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61   /* Pretend we a
2f0b0 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f  lready have a lo
2f0c0 63 6b 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72  ck */.    pPager
2f0d0 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43 4c 55 53  ->eLock = EXCLUS
2f0e0 49 56 45 5f 4c 4f 43 4b 3b 20 20 20 20 2f 2a 20  IVE_LOCK;    /* 
2f0f0 50 72 65 74 65 6e 64 20 77 65 20 61 72 65 20 69  Pretend we are i
2f100 6e 20 45 58 43 4c 55 53 49 56 45 20 6d 6f 64 65  n EXCLUSIVE mode
2f110 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
2f120 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 20 20 20 20 20  noLock = 1;     
2f130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
2f140 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20   no locking */. 
2f150 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76     readOnly = (v
2f160 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
2f170 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20  PEN_READONLY);. 
2f180 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
2f190 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50  lowing call to P
2f1a0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
2f1b0 29 20 73 65 72 76 65 73 20 74 6f 20 73 65 74 20  ) serves to set 
2f1c0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20  the value of .  
2f1d0 2a 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a  ** Pager.pageSiz
2f1e0 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74  e and to allocat
2f1f0 65 20 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70  e the Pager.pTmp
2f200 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20  Space buffer..  
2f210 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
2f220 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
2f230 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65  sert( pPager->me
2f240 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  mDb==0 );.    rc
2f250 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
2f260 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
2f270 72 2c 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20  r, &szPageDflt, 
2f280 2d 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  -1);.    testcas
2f290 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
2f2a0 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e   );.  }..  /* In
2f2b0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61  itialize the PCa
2f2c0 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20  che object. */. 
2f2d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f2e0 4f 4b 20 29 7b 0a 20 20 20 20 6e 45 78 74 72 61  OK ){.    nExtra
2f2f0 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61   = ROUND8(nExtra
2f300 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
2f310 45 78 74 72 61 3e 3d 38 20 26 26 20 6e 45 78 74  Extra>=8 && nExt
2f320 72 61 3c 31 30 30 30 20 29 3b 0a 20 20 20 20 72  ra<1000 );.    r
2f330 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  c = sqlite3Pcach
2f340 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74  eOpen(szPageDflt
2f350 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62  , nExtra, !memDb
2f360 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2f370 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f           !memDb?
2f380 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28  pagerStress:0, (
2f390 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70  void *)pPager, p
2f3a0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
2f3b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
2f3c0 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
2f3d0 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20  above, free the 
2f3e0 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
2f3f0 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66   and close the f
2f400 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
2f410 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2f420 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
2f430 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ose(pPager->fd);
2f440 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
2f450 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  Free(pPager->pTm
2f460 70 53 70 61 63 65 29 3b 0a 20 20 20 20 73 71 6c  pSpace);.    sql
2f470 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
2f480 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
2f490 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
2f4a0 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE(("OPEN %d %s
2f4b0 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
2f4c0 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70  D(pPager->fd), p
2f4d0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2f4e0 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
2f4f0 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70  OPEN %p %s\n", p
2f500 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a  Pager, pPager->z
2f510 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50  Filename))..  pP
2f520 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
2f530 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61   = (u8)useJourna
2f540 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  l;.  /* pPager->
2f550 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  stmtOpen = 0; */
2f560 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
2f570 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a  mtInUse = 0; */.
2f580 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65    /* pPager->nRe
2f590 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  f = 0; */.  /* p
2f5a0 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
2f5b0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
2f5c0 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
2f5d0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2f5e0 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a  er->nPage = 0; *
2f5f0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  /.  pPager->mxPg
2f600 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  no = SQLITE_MAX_
2f610 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a  PAGE_COUNT;.  /*
2f620 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
2f630 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a   PAGER_UNLOCK; *
2f640 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65  /.  /* pPager->e
2f650 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20  rrMask = 0; */. 
2f660 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2f670 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65  e = (u8)tempFile
2f680 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70  ;.  assert( temp
2f690 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
2f6a0 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a  INGMODE_NORMAL .
2f6b0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d            || tem
2f6c0 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
2f6d0 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
2f6e0 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  VE );.  assert( 
2f6f0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2f700 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29  E_EXCLUSIVE==1 )
2f710 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  ;.  pPager->excl
2f720 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29  usiveMode = (u8)
2f730 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61  tempFile; .  pPa
2f740 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
2f750 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
2f760 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
2f770 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d  r->memDb = (u8)m
2f780 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
2f790 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72  readOnly = (u8)r
2f7a0 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73 73 65 72  eadOnly;.  asser
2f7b0 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c  t( useJournal ||
2f7c0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
2f7d0 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  e );.  pPager->n
2f7e0 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  oSync = pPager->
2f7f0 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28 20  tempFile;.  if( 
2f800 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
2f810 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2f820 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 3d 3d  ager->fullSync==
2f830 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2f840 20 70 50 61 67 65 72 2d 3e 65 78 74 72 61 53 79   pPager->extraSy
2f850 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  nc==0 );.    ass
2f860 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 79 6e  ert( pPager->syn
2f870 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a 20 20 20  cFlags==0 );.   
2f880 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2f890 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 3d 3d 30  >walSyncFlags==0
2f8a0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
2f8b0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
2f8c0 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  c = 1;.    pPage
2f8d0 72 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d 20 30  r->extraSync = 0
2f8e0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79  ;.    pPager->sy
2f8f0 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  ncFlags = SQLITE
2f900 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20  _SYNC_NORMAL;.  
2f910 20 20 70 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e    pPager->walSyn
2f920 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
2f930 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c 20 28 53  SYNC_NORMAL | (S
2f940 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
2f950 4c 3c 3c 32 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  L<<2);.  }.  /* 
2f960 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
2f970 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
2f980 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
2f990 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
2f9a0 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b  ager->pLast = 0;
2f9b0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45   */.  pPager->nE
2f9c0 78 74 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74  xtra = (u16)nExt
2f9d0 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ra;.  pPager->jo
2f9e0 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d  urnalSizeLimit =
2f9f0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
2fa00 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d  JOURNAL_SIZE_LIM
2fa10 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73  IT;.  assert( is
2fa20 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
2fa30 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a   || tempFile );.
2fa40 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
2fa50 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21  pPager);.  if( !
2fa60 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  useJournal ){.  
2fa70 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
2fa80 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
2fa90 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20  URNALMODE_OFF;. 
2faa0 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 44 62   }else if( memDb
2fab0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
2fac0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
2fad0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2fae0 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a  MEMORY;.  }.  /*
2faf0 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61   pPager->xBusyHa
2fb00 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20  ndler = 0; */.  
2fb10 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  /* pPager->pBusy
2fb20 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20  HandlerArg = 0; 
2fb30 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65  */.  pPager->xRe
2fb40 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74  initer = xReinit
2fb50 3b 0a 20 20 73 65 74 47 65 74 74 65 72 4d 65 74  ;.  setGetterMet
2fb60 68 6f 64 28 70 50 61 67 65 72 29 3b 0a 20 20 2f  hod(pPager);.  /
2fb70 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d  * memset(pPager-
2fb80 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f  >aHash, 0, sizeo
2fb90 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  f(pPager->aHash)
2fba0 29 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  ); */.  /* pPage
2fbb0 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 53 51 4c 49  r->szMmap = SQLI
2fbc0 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50 5f  TE_DEFAULT_MMAP_
2fbd0 53 49 5a 45 20 2f 2f 20 77 69 6c 6c 20 62 65 20  SIZE // will be 
2fbe0 73 65 74 20 62 79 20 62 74 72 65 65 2e 63 20 2a  set by btree.c *
2fbf0 2f 0a 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  /..  *ppPager = 
2fc00 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e  pPager;.  return
2fc10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
2fc20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
2fc30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2fc40 20 68 61 73 20 6e 6f 74 20 62 65 20 64 65 6c 65   has not be dele
2fc50 74 65 64 20 6f 72 20 72 65 6e 61 6d 65 64 20 6f  ted or renamed o
2fc60 75 74 20 66 72 6f 6d 0a 2a 2a 20 75 6e 64 65 72  ut from.** under
2fc70 20 74 68 65 20 70 61 67 65 72 2e 20 20 52 65 74   the pager.  Ret
2fc80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
2fc90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
2fca0 20 73 74 69 6c 6c 20 77 65 72 65 20 69 74 20 6f   still were it o
2fcb0 75 67 68 74 0a 2a 2a 20 74 6f 20 62 65 20 6f 6e  ught.** to be on
2fcc0 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 6e   disk.  Return n
2fcd0 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c 49 54 45 5f  on-zero (SQLITE_
2fce0 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44  READONLY_DBMOVED
2fcf0 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
2fd00 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 66 72 6f  rror.** code fro
2fd10 6d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  m sqlite3OsAcces
2fd20 73 28 29 29 20 69 66 20 74 68 65 20 64 61 74 61  s()) if the data
2fd30 62 61 73 65 20 68 61 73 20 67 6f 6e 65 20 6d 69  base has gone mi
2fd40 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssing..*/.static
2fd50 20 69 6e 74 20 64 61 74 61 62 61 73 65 49 73 55   int databaseIsU
2fd60 6e 6d 6f 76 65 64 28 50 61 67 65 72 20 2a 70 50  nmoved(Pager *pP
2fd70 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 62 48 61  ager){.  int bHa
2fd80 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 69 6e  sMoved = 0;.  in
2fd90 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61  t rc;..  if( pPa
2fda0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 20  ger->tempFile ) 
2fdb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2fdc0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
2fdd0 64 62 53 69 7a 65 3d 3d 30 20 29 20 72 65 74 75  dbSize==0 ) retu
2fde0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2fdf0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2fe00 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 70 50 61  zFilename && pPa
2fe10 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30  ger->zFilename[0
2fe20 5d 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ] );.  rc = sqli
2fe30 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
2fe40 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c  (pPager->fd, SQL
2fe50 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f  ITE_FCNTL_HAS_MO
2fe60 56 45 44 2c 20 26 62 48 61 73 4d 6f 76 65 64 29  VED, &bHasMoved)
2fe70 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2fe80 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 7b 0a 20  TE_NOTFOUND ){. 
2fe90 20 20 20 2f 2a 20 49 66 20 74 68 65 20 48 41 53     /* If the HAS
2fea0 5f 4d 4f 56 45 44 20 66 69 6c 65 2d 63 6f 6e 74  _MOVED file-cont
2feb0 72 6f 6c 20 69 73 20 75 6e 69 6d 70 6c 65 6d 65  rol is unimpleme
2fec0 6e 74 65 64 2c 20 61 73 73 75 6d 65 20 74 68 61  nted, assume tha
2fed0 74 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  t the file.    *
2fee0 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d  * has not been m
2fef0 6f 76 65 64 2e 20 20 54 68 61 74 20 69 73 20 74  oved.  That is t
2ff00 68 65 20 68 69 73 74 6f 72 69 63 61 6c 20 62 65  he historical be
2ff10 68 61 76 69 6f 72 20 6f 66 20 53 51 4c 69 74 65  havior of SQLite
2ff20 3a 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 2a  : prior to.    *
2ff30 2a 20 76 65 72 73 69 6f 6e 20 33 2e 38 2e 33 2c  * version 3.8.3,
2ff40 20 69 74 20 6e 65 76 65 72 20 63 68 65 63 6b 65   it never checke
2ff50 64 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51  d */.    rc = SQ
2ff60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2ff70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ff80 4f 4b 20 26 26 20 62 48 61 73 4d 6f 76 65 64 20  OK && bHasMoved 
2ff90 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
2ffa0 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f  TE_READONLY_DBMO
2ffb0 56 45 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  VED;.  }.  retur
2ffc0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
2ffd0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2ffe0 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 72   called after tr
2fff0 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d  ansitioning from
30000 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f   PAGER_UNLOCK to
30010 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52 45 44  .** PAGER_SHARED
30020 20 73 74 61 74 65 2e 20 49 74 20 74 65 73 74 73   state. It tests
30030 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68   if there is a h
30040 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65  ot journal prese
30050 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c  nt in.** the fil
30060 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65  e-system for the
30070 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20 41 20   given pager. A 
30080 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  hot journal is o
30090 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64  ne that .** need
300a0 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
300b0 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67 20 74  ack. According t
300c0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
300d0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a   a hot-journal.*
300e0 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 66  * file exists if
300f0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
30100 72 69 74 65 72 69 61 20 61 72 65 20 6d 65 74 3a  riteria are met:
30110 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 6a  .**.**   * The j
30120 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
30130 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 73  ts in the file s
30140 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20  ystem, and.**   
30150 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68 6f 6c  * No process hol
30160 64 73 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ds a RESERVED or
30170 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
30180 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30190 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  le, and.**   * T
301a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
301b0 20 69 74 73 65 6c 66 20 69 73 20 67 72 65 61 74   itself is great
301c0 65 72 20 74 68 61 6e 20 30 20 62 79 74 65 73 20  er than 0 bytes 
301d0 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20  in size, and.** 
301e0 20 20 2a 20 54 68 65 20 66 69 72 73 74 20 62 79    * The first by
301f0 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  te of the journa
30200 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
30210 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e 0a 2a  d is not 0x00..*
30220 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
30230 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
30240 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
30250 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c   0 but a journal
30260 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c   file.** exists,
30270 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c   that is probabl
30280 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  y an old journal
30290 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20   left over from 
302a0 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62  a prior.** datab
302b0 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ase with the sam
302c0 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20  e name. In this 
302d0 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  case the journal
302e0 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74   file is.** just
302f0 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 4f   deleted using O
30300 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69 73 74  sDelete, *pExist
30310 73 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  s is set to 0 an
30320 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  d SQLITE_OK.** i
30330 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
30340 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
30350 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20 69 66  oes not check if
30360 20 74 68 65 72 65 20 69 73 20 61 20 6d 61 73 74   there is a mast
30370 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
30380 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  ame.** at the en
30390 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 49  d of the file. I
303a0 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e 64 20  f there is, and 
303b0 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f 75 72  that master jour
303c0 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f 65 73  nal file.** does
303d0 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e   not exist, then
303e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
303f0 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
30400 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a 2a 20  hot. In this.** 
30410 63 61 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e  case this routin
30420 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20  e will return a 
30430 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 2e 20  false-positive. 
30440 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61  The pager_playba
30450 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
30460 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68  will discover th
30470 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  at the journal f
30480 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  ile is not reall
30490 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20 77 69  y hot and .** wi
304a0 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74 20 62  ll not roll it b
304b0 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ack. .**.** If a
304c0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
304d0 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20 65 78  e is found to ex
304e0 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ist, *pExists is
304f0 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20 0a 2a   set to 1 and .*
30500 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
30510 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f 74 2d  rned. If no hot-
30520 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
30530 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69 73 74  present, *pExist
30540 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  s is.** set to 0
30550 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
30560 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
30570 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  O error occurs w
30580 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74  hile trying.** t
30590 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  o determine whet
305a0 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68 6f 74  her or not a hot
305b0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78  -journal file ex
305c0 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65 72 72  ists, the IO err
305d0 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20 72 65  or.** code is re
305e0 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76  turned and the v
305f0 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73 74 73  alue of *pExists
30600 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a   is undefined..*
30610 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
30620 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  HotJournal(Pager
30630 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70   *pPager, int *p
30640 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74  Exists){.  sqlit
30650 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
30660 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
30670 66 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  fs;.  int rc = S
30680 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
30690 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
306a0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78 69 73  de */.  int exis
306b0 74 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  ts = 1;         
306c0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
306d0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
306e0 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
306f0 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20 3d 20 21  int jrnlOpen = !
30700 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
30710 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  jfd);..  assert(
30720 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
30730 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
30740 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
30750 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fd) );.  assert(
30760 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d   pPager->eState=
30770 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 0a  =PAGER_OPEN );..
30780 20 20 61 73 73 65 72 74 28 20 6a 72 6e 6c 4f 70    assert( jrnlOp
30790 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71 6c 69 74  en==0 || ( sqlit
307a0 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
307b0 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
307c0 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20 53 51 4c  ->jfd) &.    SQL
307d0 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45  ITE_IOCAP_UNDELE
307e0 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 0a  TABLE_WHEN_OPEN.
307f0 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74    ));..  *pExist
30800 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 6a 72  s = 0;.  if( !jr
30810 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63  nlOpen ){.    rc
30820 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
30830 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  ss(pVfs, pPager-
30840 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54  >zJournal, SQLIT
30850 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
30860 20 26 65 78 69 73 74 73 29 3b 0a 20 20 7d 0a 20   &exists);.  }. 
30870 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30880 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a  OK && exists ){.
30890 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d      int locked =
308a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
308b0 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20  /* True if some 
308c0 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20  process holds a 
308d0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f  RESERVED lock */
308e0 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f  ..    /* Race co
308f0 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41  ndition here:  A
30900 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
30910 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 68  ight have been h
30920 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a  olding the.    *
30930 2a 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  * the RESERVED l
30940 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a  ock and have a j
30950 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74  ournal open at t
30960 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  he sqlite3OsAcce
30970 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c  ss() .    ** cal
30980 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65  l above, but the
30990 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  n delete the jou
309a0 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68  rnal and drop th
309b0 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20  e lock before.  
309c0 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74    ** we get to t
309d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c  he following sql
309e0 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
309f0 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20  vedLock() call. 
30a00 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20   If that.    ** 
30a10 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 69  is the case, thi
30a20 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
30a30 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61  think there is a
30a40 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65   hot journal whe
30a50 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74  n.    ** in fact
30a60 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20   there is none. 
30a70 20 54 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e   This results in
30a80 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76   a false-positiv
30a90 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20  e which will.   
30aa0 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74   ** be dealt wit
30ab0 68 20 62 79 20 74 68 65 20 70 6c 61 79 62 61 63  h by the playbac
30ac0 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b  k routine.  Tick
30ad0 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f  et #3883..    */
30ae0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
30af0 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
30b00 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
30b10 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69   &locked);.    i
30b20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
30b30 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20   && !locked ){. 
30b40 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b       Pgno nPage;
30b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b60 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
30b70 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
30b80 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61  file */..      a
30b90 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
30ba0 65 6d 70 46 69 6c 65 3d 3d 30 20 29 3b 0a 20 20  empFile==0 );.  
30bb0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61      rc = pagerPa
30bc0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
30bd0 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  &nPage);.      i
30be0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
30bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
30c00 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
30c10 73 20 7a 65 72 6f 20 70 61 67 65 73 20 69 6e 20  s zero pages in 
30c20 73 69 7a 65 2c 20 74 68 61 74 20 6d 65 61 6e 73  size, that means
30c30 20 74 68 61 74 20 65 69 74 68 65 72 20 28 31 29   that either (1)
30c40 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
30c50 6a 6f 75 72 6e 61 6c 20 69 73 20 61 20 72 65 6d  journal is a rem
30c60 6e 61 6e 74 20 66 72 6f 6d 20 61 20 70 72 69 6f  nant from a prio
30c70 72 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  r database with 
30c80 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 77 68  the same name wh
30c90 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ere.        ** t
30ca0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30cb0 20 62 75 74 20 6e 6f 74 20 74 68 65 20 6a 6f 75   but not the jou
30cc0 72 6e 61 6c 20 77 61 73 20 64 65 6c 65 74 65 64  rnal was deleted
30cd0 2c 20 6f 72 20 28 32 29 20 74 68 65 20 69 6e 69  , or (2) the ini
30ce0 74 69 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  tial.        ** 
30cf0 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74  transaction that
30d00 20 70 6f 70 75 6c 61 74 65 73 20 61 20 6e 65 77   populates a new
30d10 20 64 61 74 61 62 61 73 65 20 69 73 20 62 65 69   database is bei
30d20 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  ng rolled back..
30d30 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 65 69          ** In ei
30d40 74 68 65 72 20 63 61 73 65 2c 20 74 68 65 20 6a  ther case, the j
30d50 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 20  ournal file can 
30d60 62 65 20 64 65 6c 65 74 65 64 2e 20 20 48 6f 77  be deleted.  How
30d70 65 76 65 72 2c 20 74 61 6b 65 20 63 61 72 65 0a  ever, take care.
30d80 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 74          ** not t
30d90 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
30da0 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20  rnal file if it 
30db0 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  is already open 
30dc0 64 75 65 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  due to.        *
30dd0 2a 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 50  * journal_mode=P
30de0 45 52 53 49 53 54 2e 0a 20 20 20 20 20 20 20 20  ERSIST..        
30df0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  */.        if( n
30e00 50 61 67 65 3d 3d 30 20 26 26 20 21 6a 72 6e 6c  Page==0 && !jrnl
30e10 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Open ){.        
30e20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
30e30 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
30e40 20 20 20 20 20 20 20 20 69 66 28 20 70 61 67 65          if( page
30e50 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c 20  rLockDb(pPager, 
30e60 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d  RESERVED_LOCK)==
30e70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30e80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
30e90 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70  OsDelete(pVfs, p
30ea0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
30eb0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
30ec0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
30ed0 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 20 70 61  clusiveMode ) pa
30ee0 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
30ef0 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
30f00 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30f10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
30f20 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
30f30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
30f40 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
30f50 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
30f60 78 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  xists and no oth
30f70 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
30f80 73 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20  s a reserved.   
30f90 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65         ** or gre
30fa0 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
30fb0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
30fc0 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74  Now check that t
30fd0 68 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20  here is.        
30fe0 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e    ** at least on
30ff0 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73  e non-zero bytes
31000 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
31010 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
31020 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e..          ** 
31030 49 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65  If there is, the
31040 6e 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68  n we consider th
31050 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65  is journal to be
31060 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20   hot. If not, . 
31070 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63           ** it c
31080 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20  an be ignored.. 
31090 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
310a0 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f        if( !jrnlO
310b0 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
310c0 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54     int f = SQLIT
310d0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
310e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
310f0 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
31100 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
31110 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
31120 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
31130 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c   pPager->jfd, f,
31140 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &f);.          
31150 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
31160 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
31170 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20  .            u8 
31180 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  first = 0;.     
31190 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
311a0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
311b0 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26  ->jfd, (void *)&
311c0 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20  first, 1, 0);.  
311d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
311e0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
311f0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
31200 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
31210 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
31220 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31230 20 20 20 20 20 69 66 28 20 21 6a 72 6e 6c 4f 70       if( !jrnlOp
31240 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
31250 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
31260 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
31270 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
31280 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
31290 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29  sts = (first!=0)
312a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
312b0 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
312c0 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20  _CANTOPEN ){.   
312d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
312e0 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 68  e cannot open th
312f0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
31300 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72  al file in order
31310 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 20   to see if.     
31320 20 20 20 20 20 20 20 2a 2a 20 69 74 20 68 61 73         ** it has
31330 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72 2c 20   a zero header, 
31340 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 64 75  that might be du
31350 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72 72 6f  e to an I/O erro
31360 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20  r, or.          
31370 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65    ** it might be
31380 20 64 75 65 20 74 6f 20 74 68 65 20 72 61 63 65   due to the race
31390 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72   condition descr
313a0 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64 20 69  ibed above and i
313b0 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  n.            **
313c0 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e 20 20   ticket #3883.  
313d0 45 69 74 68 65 72 20 77 61 79 2c 20 61 73 73 75  Either way, assu
313e0 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  me that the jour
313f0 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20 20 20  nal is hot..    
31400 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
31410 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c 73 65  might be a false
31420 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75 74 20   positive.  But 
31430 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74  if it is, then t
31440 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  he.            *
31450 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f 75 72  * automatic jour
31460 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61 6e 64  nal playback and
31470 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68 61 6e   recovery mechan
31480 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a 20 20  ism will deal.  
31490 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74            ** wit
314a0 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20 45 58  h it under an EX
314b0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77 68 65  CLUSIVE lock whe
314c0 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  re we do not nee
314d0 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20  d to.           
314e0 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d 75 63   ** worry so muc
314f0 68 20 77 69 74 68 20 72 61 63 65 20 63 6f 6e 64  h with race cond
31500 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20  itions..        
31510 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
31520 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b     *pExists = 1;
31530 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
31540 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
31550 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31560 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
31570 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
31580 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
31590 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
315a0 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  led to obtain a 
315b0 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  shared lock on t
315c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
315d0 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67  ..** It is illeg
315e0 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74  al to call sqlit
315f0 65 33 50 61 67 65 72 47 65 74 28 29 20 75 6e 74  e3PagerGet() unt
31600 69 6c 20 61 66 74 65 72 20 74 68 69 73 20 66 75  il after this fu
31610 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65  nction.** has be
31620 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
31630 63 61 6c 6c 65 64 2e 20 49 66 20 61 20 73 68 61  called. If a sha
31640 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61 6c 72 65  red-lock is alre
31650 61 64 79 20 68 65 6c 64 20 77 68 65 6e 0a 2a 2a  ady held when.**
31660 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
31670 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
31680 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
31690 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65  he following ope
316a0 72 61 74 69 6f 6e 73 20 61 72 65 20 61 6c 73 6f  rations are also
316b0 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20 74 68   performed by th
316c0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
316d0 2a 2a 20 20 20 31 29 20 49 66 20 74 68 65 20 70  **   1) If the p
316e0 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c  ager is currentl
316f0 79 20 69 6e 20 50 41 47 45 52 5f 4f 50 45 4e 20  y in PAGER_OPEN 
31700 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68  state (no lock h
31710 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74  eld.**      on t
31720 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
31730 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d  ), then an attem
31740 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62  pt is made to ob
31750 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53  tain a.**      S
31760 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  HARED lock on th
31770 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
31780 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   Immediately aft
31790 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20  er obtaining.** 
317a0 20 20 20 20 20 74 68 65 20 53 48 41 52 45 44 20       the SHARED 
317b0 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73  lock, the file-s
317c0 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64  ystem is checked
317d0 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
317e0 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63  al,.**      whic
317f0 68 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b  h is played back
31800 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c   if present. Fol
31810 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a  lowing any hot-j
31820 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20  ournal .**      
31830 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f  rollback, the co
31840 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61  ntents of the ca
31850 63 68 65 20 61 72 65 20 76 61 6c 69 64 61 74 65  che are validate
31860 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  d by checking.**
31870 20 20 20 20 20 20 74 68 65 20 27 63 68 61 6e 67        the 'chang
31880 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64  e-counter' field
31890 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
318a0 20 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64   file header and
318b0 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72 64  .**      discard
318c0 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20 66  ed if they are f
318d0 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c  ound to be inval
318e0 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49  id..**.**   2) I
318f0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  f the pager is r
31900 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
31910 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68  ive-mode, and th
31920 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ere are currentl
31930 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74  y.**      no out
31940 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
31950 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73  ces to any pages
31960 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20  , and is in the 
31970 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20  error state,.** 
31980 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74       then an att
31990 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
319a0 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20  clear the error 
319b0 73 74 61 74 65 20 62 79 20 64 69 73 63 61 72 64  state by discard
319c0 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20  ing.**      the 
319d0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
319e0 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 72  page cache and r
319f0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20  olling back any 
31a00 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  open journal.** 
31a10 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a       file..**.**
31a20 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   If everything i
31a30 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  s successful, SQ
31a40 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
31a50 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
31a60 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77  ror .** occurs w
31a70 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65  hile locking the
31a80 20 64 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b   database, check
31a90 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  ing for a hot-jo
31aa0 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 0a 2a  urnal file or .*
31ab0 2a 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  * rolling back a
31ac0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
31ad0 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
31ae0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
31af0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
31b00 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65  rSharedLock(Page
31b10 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
31b20 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
31b30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31b40 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
31b50 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  */..  /* This ro
31b60 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
31b70 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74 72 65 65  lled from b-tree
31b80 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74   and only when t
31b90 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a  here are no.  **
31ba0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
31bb0 65 73 2e 20 54 68 69 73 20 69 6d 70 6c 69 65 73  es. This implies
31bc0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
31bd0 73 74 61 74 65 20 73 68 6f 75 6c 64 20 65 69 74  state should eit
31be0 68 65 72 0a 20 20 2a 2a 20 62 65 20 4f 50 45 4e  her.  ** be OPEN
31bf0 20 6f 72 20 52 45 41 44 45 52 2e 20 52 45 41 44   or READER. READ
31c00 45 52 20 69 73 20 6f 6e 6c 79 20 70 6f 73 73 69  ER is only possi
31c10 62 6c 65 20 69 66 20 74 68 65 20 70 61 67 65 72  ble if the pager
31c20 20 69 73 20 6f 72 20 77 61 73 20 69 6e 20 0a 20   is or was in . 
31c30 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 61 63   ** exclusive ac
31c40 63 65 73 73 20 6d 6f 64 65 2e 20 20 2a 2f 0a 20  cess mode.  */. 
31c50 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
31c60 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
31c70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
31c80 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
31c90 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
31ca0 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  te(pPager) );.  
31cb0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
31cc0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50  eState==PAGER_OP
31cd0 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  EN || pPager->eS
31ce0 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41 44  tate==PAGER_READ
31cf0 45 52 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ER );.  assert( 
31d00 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
31d10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
31d20 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
31d30 6c 28 70 50 61 67 65 72 29 20 26 26 20 70 50 61  l(pPager) && pPa
31d40 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47  ger->eState==PAG
31d50 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 69  ER_OPEN ){.    i
31d60 6e 74 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d  nt bHotJournal =
31d70 20 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   1;          /* 
31d80 54 72 75 65 20 69 66 20 74 68 65 72 65 20 65 78  True if there ex
31d90 69 73 74 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  ists a hot journ
31da0 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  al-file */..    
31db0 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
31dc0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
31dd0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  ager->tempFile==
31de0 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f  0 || pPager->eLo
31df0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
31e00 43 4b 20 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20  CK );..    rc = 
31e10 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
31e20 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  ck(pPager, SHARE
31e30 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
31e40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31e50 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
31e60 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 4e  pPager->eLock==N
31e70 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72  O_LOCK || pPager
31e80 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e 4f 57 4e  ->eLock==UNKNOWN
31e90 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 67  _LOCK );.      g
31ea0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
31eb0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a  }..    /* If a j
31ec0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
31ed0 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73  ts, and there is
31ee0 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63   no RESERVED loc
31ef0 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
31f00 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
31f10 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65  hen it either ne
31f20 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
31f30 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64   back or deleted
31f40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
31f50 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 3d   pPager->eLock<=
31f60 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
31f70 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74       rc = hasHot
31f80 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
31f90 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20  &bHotJournal);. 
31fa0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
31fb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31fc0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
31fd0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62  .    }.    if( b
31fe0 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  HotJournal ){.  
31ff0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
32000 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
32010 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
32020 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43  READONLY_ROLLBAC
32030 4b 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  K;.        goto 
32040 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
32050 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e  .      /* Get an
32060 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
32070 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
32080 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f  file. At this po
32090 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20  int it is.      
320a0 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  ** important tha
320b0 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
320c0 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65  k is not obtaine
320d0 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20  d on the way to 
320e0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43  the.      ** EXC
320f0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
32100 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72  it were, another
32110 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f   process might o
32120 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  pen the.      **
32130 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
32140 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52  detect the RESER
32150 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f  VED lock, and co
32160 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a  nclude that the.
32170 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
32180 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61  e is safe to rea
32190 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f  d while this pro
321a0 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f  cess is still ro
321b0 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20  lling the .     
321c0 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   ** hot-journal 
321d0 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a  back..      ** .
321e0 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65        ** Because
321f0 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
32200 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
32210 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64  is not requested
32220 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 6f  , any.      ** o
32230 74 68 65 72 20 70 72 6f 63 65 73 73 20 61 74 74  ther process att
32240 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65 73  empting to acces
32250 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
32260 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f 20  ile will get to 
32270 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 70  .      ** this p
32280 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
32290 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62 74   and fail to obt
322a0 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c  ain its own EXCL
322b0 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20 20  USIVE lock .    
322c0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61    ** on the data
322d0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
322e0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c   **.      ** Unl
322f0 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
32300 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
32310 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c  =exclusive mode,
32320 20 74 68 65 20 6c 6f 63 6b 20 69 73 0a 20 20 20   the lock is.   
32330 20 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64     ** downgraded
32340 20 74 6f 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20   to SHARED_LOCK 
32350 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
32360 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 20 20  tion returns..  
32370 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
32380 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50  = pagerLockDb(pP
32390 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
323a0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
323b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
323c0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  {.        goto f
323d0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ailed;.      }. 
323e0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 74 20  .      /* If it 
323f0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
32400 70 65 6e 20 61 6e 64 20 74 68 65 20 66 69 6c 65  pen and the file
32410 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c   exists on disk,
32420 20 6f 70 65 6e 20 74 68 65 20 0a 20 20 20 20 20   open the .     
32430 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20   ** journal for 
32440 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
32450 73 2e 20 57 72 69 74 65 20 61 63 63 65 73 73 20  s. Write access 
32460 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63 61  is required beca
32470 75 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e  use .      ** in
32480 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
32490 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20  s mode the file 
324a0 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20  descriptor will 
324b0 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 0a 20 20  be kept open .  
324c0 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f 73 73 69      ** and possi
324d0 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20 74  bly used for a t
324e0 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72  ransaction later
324f0 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72 69 74 65   on. Also, write
32500 2d 61 63 63 65 73 73 20 0a 20 20 20 20 20 20 2a  -access .      *
32510 2a 20 69 73 20 75 73 75 61 6c 6c 79 20 72 65 71  * is usually req
32520 75 69 72 65 64 20 74 6f 20 66 69 6e 61 6c 69 7a  uired to finaliz
32530 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 6e  e the journal in
32540 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 70 65   journal_mode=pe
32550 72 73 69 73 74 20 0a 20 20 20 20 20 20 2a 2a 20  rsist .      ** 
32560 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73 6f 20 66  mode (and also f
32570 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
32580 74 72 75 6e 63 61 74 65 20 6f 6e 20 73 6f 6d 65  truncate on some
32590 20 73 79 73 74 65 6d 73 29 2e 0a 20 20 20 20 20   systems)..     
325a0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
325b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  the journal does
325c0 20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74 20 75   not exist, it u
325d0 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61  sually means tha
325e0 74 20 73 6f 6d 65 20 0a 20 20 20 20 20 20 2a 2a  t some .      **
325f0 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
32600 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74  n managed to get
32610 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20   in and roll it 
32620 62 61 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20  back before .   
32630 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 6e 6e 65     ** this conne
32640 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65 64 20 74  ction obtained t
32650 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
32660 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20 69 74 20  k above. Or, it 
32670 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 65  .      ** may me
32680 61 6e 20 74 68 61 74 20 74 68 65 20 70 61 67 65  an that the page
32690 72 20 77 61 73 20 69 6e 20 74 68 65 20 65 72 72  r was in the err
326a0 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74 68  or-state when th
326b0 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  is.      ** func
326c0 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20  tion was called 
326d0 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
326e0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
326f0 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ist..      */.  
32700 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
32710 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
32720 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
32730 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
32740 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
32750 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 45 78  .        int bEx
32760 69 73 74 73 3b 20 20 20 20 20 20 20 20 20 20 20  ists;           
32770 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f     /* True if jo
32780 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
32790 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  s */.        rc 
327a0 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
327b0 73 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  s(.            p
327c0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
327d0 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  urnal, SQLITE_AC
327e0 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 62 45  CESS_EXISTS, &bE
327f0 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20 20 20  xists);.        
32800 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
32810 4b 20 26 26 20 62 45 78 69 73 74 73 20 29 7b 0a  K && bExists ){.
32820 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f            int fo
32830 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ut = 0;.        
32840 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45    int f = SQLITE
32850 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
32860 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
32870 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
32880 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
32890 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
328a0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
328b0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
328c0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
328d0 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
328e0 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20  d, f, &fout);.  
328f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
32900 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
32910 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
32920 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  jfd) );.        
32930 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
32940 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49  _OK && fout&SQLI
32950 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
32960 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
32970 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
32980 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OPEN_BKPT;.     
32990 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
329a0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
329b0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  d);.          }.
329c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
329d0 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61  }. .      /* Pla
329e0 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65  yback and delete
329f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44   the journal.  D
32a00 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65  rop the database
32a10 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20   write.      ** 
32a20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69  lock and reacqui
32a30 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  re the read lock
32a40 2e 20 50 75 72 67 65 20 74 68 65 20 63 61 63 68  . Purge the cach
32a50 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a  e before.      *
32a60 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  * playing back t
32a70 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73  he hot-journal s
32a80 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20  o that we don't 
32a90 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20 20  end up with.    
32aa0 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73    ** an inconsis
32ab0 74 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e  tent cache.  Syn
32ac0 63 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61  c the hot journa
32ad0 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67  l before playing
32ae0 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63  .      ** it bac
32af0 6b 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63  k since the proc
32b00 65 73 73 20 74 68 61 74 20 63 72 61 73 68 65 64  ess that crashed
32b10 20 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f   and left the ho
32b20 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  t journal.      
32b30 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20  ** probably did 
32b40 6e 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20  not sync it and 
32b50 77 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20  we are required 
32b60 74 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20  to always sync. 
32b70 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72       ** the jour
32b80 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69  nal before playi
32b90 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20  ng it back..    
32ba0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69    */.      if( i
32bb0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
32bc0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  d) ){.        as
32bd0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
32be0 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72  _OK );.        r
32bf0 63 20 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74  c = pagerSyncHot
32c00 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
32c10 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
32c20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32c30 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
32c40 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
32c50 65 72 2c 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  er, !pPager->tem
32c60 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  pFile);.        
32c70 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
32c80 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20   = PAGER_OPEN;. 
32c90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
32ca0 65 6c 73 65 20 69 66 28 20 21 70 50 61 67 65 72  else if( !pPager
32cb0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
32cc0 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
32cd0 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  UnlockDb(pPager,
32ce0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
32cf0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
32d00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
32d10 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
32d20 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
32d30 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  en if an error o
32d40 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
32d50 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20 20 20 20  ng to open.     
32d60 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c 20 62 61     ** or roll ba
32d70 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
32d80 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 61   while holding a
32d90 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
32da0 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  . The.        **
32db0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
32dc0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20  routine will be 
32dd0 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 72 65  called before re
32de0 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e 6c 6f 63  turning to unloc
32df0 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  k.        ** the
32e00 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 75 6e   file. If the un
32e10 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20 66 61 69  lock attempt fai
32e20 6c 73 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 65  ls, then Pager.e
32e30 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a 20 20 20  Lock must be.   
32e40 20 20 20 20 20 2a 2a 20 73 65 74 20 74 6f 20 55       ** set to U
32e50 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28 73 65 65  NKNOWN_LOCK (see
32e60 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
32e70 76 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 66  ve the #define f
32e80 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 55  or .        ** U
32e90 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61 62 6f 76  NKNOWN_LOCK abov
32ea0 65 20 66 6f 72 20 61 6e 20 65 78 70 6c 61 6e 61  e for an explana
32eb0 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20 20 20 20  tion). .        
32ec0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e  **.        ** In
32ed0 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 70 61   order to get pa
32ee0 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 74 6f 20  ger_unlock() to 
32ef0 64 6f 20 74 68 69 73 2c 20 73 65 74 20 50 61 67  do this, set Pag
32f00 65 72 2e 65 53 74 61 74 65 20 74 6f 0a 20 20 20  er.eState to.   
32f10 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 45 52       ** PAGER_ER
32f20 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73 20 69 73  ROR now. This is
32f30 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6f   not actually co
32f40 75 6e 74 65 64 20 61 73 20 61 20 74 72 61 6e 73  unted as a trans
32f50 69 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ition.        **
32f60 20 74 6f 20 45 52 52 4f 52 20 73 74 61 74 65 20   to ERROR state 
32f70 69 6e 20 74 68 65 20 73 74 61 74 65 20 64 69 61  in the state dia
32f80 67 72 61 6d 20 61 74 20 74 68 65 20 74 6f 70 20  gram at the top 
32f90 6f 66 20 74 68 69 73 20 66 69 6c 65 2c 0a 20 20  of this file,.  
32fa0 20 20 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77        ** since w
32fb0 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
32fc0 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20 70 61 67  same call to pag
32fd0 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c  er_unlock() will
32fe0 20 76 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a   very.        **
32ff0 20 73 68 6f 72 74 6c 79 20 74 72 61 6e 73 69 74   shortly transit
33000 69 6f 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62  ion the pager ob
33010 6a 65 63 74 20 74 6f 20 74 68 65 20 4f 50 45 4e  ject to the OPEN
33020 20 73 74 61 74 65 2e 20 43 61 6c 6c 69 6e 67 0a   state. Calling.
33030 20 20 20 20 20 20 20 20 2a 2a 20 61 73 73 65 72          ** asser
33040 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 29 20  t_pager_state() 
33050 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f 77 2c 20  would fail now, 
33060 61 73 20 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74  as it should not
33070 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 20 20 20   be possible.   
33080 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e       ** to be in
33090 20 45 52 52 4f 52 20 73 74 61 74 65 20 77 68 65   ERROR state whe
330a0 6e 20 74 68 65 72 65 20 61 72 65 20 7a 65 72 6f  n there are zero
330b0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
330c0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  e .        ** re
330d0 66 65 72 65 6e 63 65 73 2e 0a 20 20 20 20 20 20  ferences..      
330e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67    */.        pag
330f0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
33100 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f   rc);.        go
33110 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
33120 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
33130 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
33140 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
33150 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
33160 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 53 48  Pager->eLock==SH
33170 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  ARED_LOCK).     
33180 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
33190 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
331a0 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  && pPager->eLock
331b0 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20  >SHARED_LOCK).  
331c0 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
331d0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
331e0 65 6d 70 46 69 6c 65 20 26 26 20 70 50 61 67 65  empFile && pPage
331f0 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64  r->hasHeldShared
33200 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Lock ){.      /*
33210 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b   The shared-lock
33220 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
33230 63 71 75 69 72 65 64 20 74 68 65 6e 20 63 68 65  cquired then che
33240 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73  ck to.      ** s
33250 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ee if the databa
33260 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  se has been modi
33270 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61  fied.  If the da
33280 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67  tabase has chang
33290 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 66 6c 75  ed,.      ** flu
332a0 73 68 20 74 68 65 20 63 61 63 68 65 2e 20 20 54  sh the cache.  T
332b0 68 65 20 68 61 73 48 65 6c 64 53 68 61 72 65 64  he hasHeldShared
332c0 4c 6f 63 6b 20 66 6c 61 67 20 70 72 65 76 65 6e  Lock flag preven
332d0 74 73 20 74 68 69 73 20 66 72 6f 6d 0a 20 20 20  ts this from.   
332e0 20 20 20 2a 2a 20 6f 63 63 75 72 72 69 6e 67 20     ** occurring 
332f0 6f 6e 20 74 68 65 20 76 65 72 79 20 66 69 72 73  on the very firs
33300 74 20 61 63 63 65 73 73 20 74 6f 20 61 20 66 69  t access to a fi
33310 6c 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  le, in order to 
33320 73 61 76 65 20 61 0a 20 20 20 20 20 20 2a 2a 20  save a.      ** 
33330 73 69 6e 67 6c 65 20 75 6e 6e 65 63 65 73 73 61  single unnecessa
33340 72 79 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64  ry sqlite3OsRead
33350 28 29 20 63 61 6c 6c 20 61 74 20 74 68 65 20 73  () call at the s
33360 74 61 72 74 2d 75 70 2e 0a 20 20 20 20 20 20 2a  tart-up..      *
33370 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62  *.      ** Datab
33380 61 73 65 20 63 68 61 6e 67 65 73 20 61 72 65 20  ase changes are 
33390 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b  detected by look
333a0 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20  ing at 15 bytes 
333b0 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20  beginning.      
333c0 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34 20  ** at offset 24 
333d0 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20  into the file.  
333e0 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20 74  The first 4 of t
333f0 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61 72  hese 16 bytes ar
33400 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d  e.      ** a 32-
33410 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74  bit counter that
33420 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
33430 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65  with each change
33440 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  .  The.      ** 
33450 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e  other bytes chan
33460 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68  ge randomly with
33470 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67   each file chang
33480 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  e when.      ** 
33490 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73  a codec is in us
334a0 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  e..      ** .   
334b0 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61     ** There is a
334c0 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
334d0 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61  ll chance that a
334e0 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74   change will not
334f0 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65   be .      ** de
33500 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61  tected.  The cha
33510 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65  nce of an undete
33520 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73  cted change is s
33530 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20  o small that.   
33540 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20     ** it can be 
33550 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20  neglected..     
33560 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 64   */.      char d
33570 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66  bFileVers[sizeof
33580 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
33590 65 72 73 29 5d 3b 0a 0a 20 20 20 20 20 20 49 4f  ers)];..      IO
335a0 54 52 41 43 45 28 28 22 43 4b 56 45 52 53 20 25  TRACE(("CKVERS %
335b0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
335c0 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
335d0 72 73 29 29 29 3b 0a 20 20 20 20 20 20 72 63 20  rs)));.      rc 
335e0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
335f0 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46  pPager->fd, &dbF
33600 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
33610 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29  dbFileVers), 24)
33620 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
33630 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33640 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
33650 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
33660 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20  READ ){.        
33670 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
33680 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33690 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65   memset(dbFileVe
336a0 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62  rs, 0, sizeof(db
336b0 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
336c0 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d    }..      if( m
336d0 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62  emcmp(pPager->db
336e0 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65  FileVers, dbFile
336f0 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
33700 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a  ileVers))!=0 ){.
33710 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
33720 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  set(pPager);..  
33730 20 20 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 74        /* Unmap t
33740 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
33750 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65  . It is possible
33760 20 74 68 61 74 20 65 78 74 65 72 6e 61 6c 20 70   that external p
33770 72 6f 63 65 73 73 65 73 0a 20 20 20 20 20 20 20  rocesses.       
33780 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 74 72 75   ** may have tru
33790 6e 63 61 74 65 64 20 74 68 65 20 64 61 74 61 62  ncated the datab
337a0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  ase file and the
337b0 6e 20 65 78 74 65 6e 64 65 64 20 69 74 20 62 61  n extended it ba
337c0 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ck.        ** to
337d0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69   its original si
337e0 7a 65 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  ze while this pr
337f0 6f 63 65 73 73 20 77 61 73 20 6e 6f 74 20 68 6f  ocess was not ho
33800 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 2e 0a 20 20  lding a lock..  
33810 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73        ** In this
33820 20 63 61 73 65 20 74 68 65 72 65 20 6d 61 79 20   case there may 
33830 65 78 69 73 74 20 61 20 50 61 67 65 72 2e 70 4d  exist a Pager.pM
33840 61 70 20 6d 61 70 70 69 6e 67 20 74 68 61 74 20  ap mapping that 
33850 61 70 70 65 61 72 73 0a 20 20 20 20 20 20 20 20  appears.        
33860 2a 2a 20 74 6f 20 62 65 20 74 68 65 20 72 69 67  ** to be the rig
33870 68 74 20 73 69 7a 65 20 62 75 74 20 69 73 20 6e  ht size but is n
33880 6f 74 20 61 63 74 75 61 6c 6c 79 20 76 61 6c 69  ot actually vali
33890 64 2e 20 41 76 6f 69 64 20 74 68 69 73 0a 20 20  d. Avoid this.  
338a0 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 69        ** possibi
338b0 6c 69 74 79 20 62 79 20 75 6e 6d 61 70 70 69 6e  lity by unmappin
338c0 67 20 74 68 65 20 64 62 20 68 65 72 65 2e 20 2a  g the db here. *
338d0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 55 53  /.        if( US
338e0 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20 29  EFETCH(pPager) )
338f0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
33900 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
33910 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30 29 3b 0a  ger->fd, 0, 0);.
33920 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33930 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
33940 49 66 20 74 68 65 72 65 20 69 73 20 61 20 57 41  If there is a WA
33950 4c 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66 69  L file in the fi
33960 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70 65 6e 20  le-system, open 
33970 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69 6e  this database in
33980 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65   WAL.    ** mode
33990 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
339a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
339b0 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  ion call is a no
339c0 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  -op..    */.    
339d0 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 57 61  rc = pagerOpenWa
339e0 6c 49 66 50 72 65 73 65 6e 74 28 70 50 61 67 65  lIfPresent(pPage
339f0 72 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  r);.#ifndef SQLI
33a00 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
33a10 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
33a20 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  pWal==0 || rc==S
33a30 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23 65 6e 64  QLITE_OK );.#end
33a40 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61  if.  }..  if( pa
33a50 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
33a60 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
33a70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
33a80 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
33a90 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63  BeginReadTransac
33aa0 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  tion(pPager);.  
33ab0 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
33ac0 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 26 26 20  >tempFile==0 && 
33ad0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
33ae0 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 72 63  PAGER_OPEN && rc
33af0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
33b00 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 61 67     rc = pagerPag
33b10 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
33b20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
33b30 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20  .  }.. failed:. 
33b40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
33b50 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
33b60 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
33b70 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
33b80 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ger);.    assert
33b90 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
33ba0 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a  ==PAGER_OPEN );.
33bb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
33bc0 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20 50 41  ger->eState = PA
33bd0 47 45 52 5f 52 45 41 44 45 52 3b 0a 20 20 20 20  GER_READER;.    
33be0 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53  pPager->hasHeldS
33bf0 68 61 72 65 64 4c 6f 63 6b 20 3d 20 31 3b 0a 20  haredLock = 1;. 
33c00 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
33c10 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
33c20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
33c30 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f  has reached zero
33c40 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61  , rollback any a
33c50 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  ctive.** transac
33c60 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  tion and unlock 
33c70 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a  the pager..**.**
33c80 20 45 78 63 65 70 74 2c 20 69 6e 20 6c 6f 63 6b   Except, in lock
33c90 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c 55 53 49  ing_mode=EXCLUSI
33ca0 56 45 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  VE when there is
33cb0 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69 6e 0a 2a   nothing to in.*
33cc0 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
33cd0 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75 6e 6c 6f  ournal, the unlo
33ce0 63 6b 20 69 73 20 6e 6f 74 20 70 65 72 66 6f 72  ck is not perfor
33cf0 6d 65 64 20 61 6e 64 20 74 68 65 72 65 20 69 73  med and there is
33d00 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 72  .** nothing to r
33d10 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74 68 69 73  ollback, so this
33d20 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
33d30 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  -op..*/ .static 
33d40 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
33d50 49 66 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a  IfUnused(Pager *
33d60 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 73  pPager){.  if( s
33d70 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
33d80 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
33d90 61 63 68 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ache)==0 ){.    
33da0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
33db0 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20 29 3b 20 2f  nMmapOut==0 ); /
33dc0 2a 20 62 65 63 61 75 73 65 20 70 61 67 65 31 20  * because page1 
33dd0 69 73 20 6e 65 76 65 72 20 6d 65 6d 6f 72 79 20  is never memory 
33de0 6d 61 70 70 65 64 20 2a 2f 0a 20 20 20 20 70 61  mapped */.    pa
33df0 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
33e00 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
33e10 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  }.}../*.** The p
33e20 61 67 65 20 67 65 74 74 65 72 20 6d 65 74 68 6f  age getter metho
33e30 64 73 20 65 61 63 68 20 74 72 79 20 74 6f 20 61  ds each try to a
33e40 63 71 75 69 72 65 20 61 20 72 65 66 65 72 65 6e  cquire a referen
33e50 63 65 20 74 6f 20 61 0a 2a 2a 20 70 61 67 65 20  ce to a.** page 
33e60 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
33e70 20 70 67 6e 6f 2e 20 49 66 20 74 68 65 20 72 65   pgno. If the re
33e80 71 75 65 73 74 65 64 20 72 65 66 65 72 65 6e 63  quested referenc
33e90 65 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73  e is .** success
33ea0 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20  fully obtained, 
33eb0 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20  it is copied to 
33ec0 2a 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49  *ppPage and SQLI
33ed0 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
33ee0 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  **.** There are 
33ef0 64 69 66 66 65 72 65 6e 74 20 69 6d 70 6c 65 6d  different implem
33f00 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  entations of the
33f10 20 67 65 74 74 65 72 20 6d 65 74 68 6f 64 20 64   getter method d
33f20 65 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f 6e 20 74  epending.** on t
33f30 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
33f40 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 0a 2a   of the pager..*
33f50 2a 0a 2a 2a 20 20 20 20 20 67 65 74 50 61 67 65  *.**     getPage
33f60 4e 6f 72 6d 61 6c 28 29 20 20 20 20 20 20 20 20  Normal()        
33f70 20 2d 2d 20 20 54 68 65 20 6e 6f 72 6d 61 6c 20   --  The normal 
33f80 67 65 74 74 65 72 0a 2a 2a 20 20 20 20 20 67 65  getter.**     ge
33f90 74 50 61 67 65 45 72 72 6f 72 28 29 20 20 20 20  tPageError()    
33fa0 20 20 20 20 20 20 2d 2d 20 20 55 73 65 64 20 69        --  Used i
33fb0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
33fc0 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
33fd0 0a 2a 2a 20 20 20 20 20 67 65 74 50 61 67 65 4d  .**     getPageM
33fe0 6d 61 70 28 29 20 20 20 20 20 20 20 20 20 20 20  map()           
33ff0 2d 2d 20 20 55 73 65 64 20 69 66 20 6d 65 6d 6f  --  Used if memo
34000 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f 20 69 73  ry-mapped I/O is
34010 20 65 6e 61 62 6c 65 64 0a 2a 2a 0a 2a 2a 20 49   enabled.**.** I
34020 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
34030 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
34040 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69 74  in the cache, it
34050 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a   is returned. .*
34060 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e  * Otherwise, a n
34070 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69  ew page object i
34080 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
34090 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 64  populated with d
340a0 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d  ata.** read from
340b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
340c0 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65  le. In some case
340d0 73 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f  s, the pcache mo
340e0 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f  dule may.** choo
340f0 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61  se not to alloca
34100 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62  te a new page ob
34110 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75  ject and may reu
34120 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a  se an existing.*
34130 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f  * object with no
34140 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
34150 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  erences..**.** T
34160 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70  he extra data ap
34170 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65  pended to a page
34180 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69   is always initi
34190 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20  alized to zeros 
341a0 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69  the .** first ti
341b0 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61  me a page is loa
341c0 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e  ded into memory.
341d0 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65 71   If the page req
341e0 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c  uested is .** al
341f0 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63  ready in the cac
34200 68 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  he when this fun
34210 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
34220 20 74 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a   then the extra.
34230 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74 20  ** data is left 
34240 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 74  as it was when t
34250 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77  he page object w
34260 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a  as last used..**
34270 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
34280 61 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61  ase image is sma
34290 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  ller than the re
342a0 71 75 65 73 74 65 64 20 70 61 67 65 20 6f 72 20  quested page or 
342b0 69 66 20 0a 2a 2a 20 74 68 65 20 66 6c 61 67 73  if .** the flags
342c0 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74 61   parameter conta
342d0 69 6e 73 20 74 68 65 20 50 41 47 45 52 5f 47 45  ins the PAGER_GE
342e0 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 62 69 74 20  T_NOCONTENT bit 
342f0 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75  and the .** requ
34300 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
34310 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64  t already stored
34320 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74   in the cache, t
34330 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61  hen no .** actua
34340 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75  l disk read occu
34350 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  rs. In this case
34360 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67   the memory imag
34370 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67  e of the .** pag
34380 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
34390 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a   to all zeros. .
343a0 2a 2a 0a 2a 2a 20 49 66 20 50 41 47 45 52 5f 47  **.** If PAGER_G
343b0 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 69 73 20  ET_NOCONTENT is 
343c0 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  true, it means t
343d0 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  hat we do not ca
343e0 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20  re about.** the 
343f0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
34400 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63 75 72  page. This occur
34410 73 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69  s in two scenari
34420 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57  os:.**.**   a) W
34430 68 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72  hen reading a fr
34440 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
34450 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
34460 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ase, and.**.**  
34470 20 62 29 20 57 68 65 6e 20 61 20 73 61 76 65 70   b) When a savep
34480 6f 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f  oint is being ro
34490 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65  lled back and we
344a0 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a   need to load.**
344b0 20 20 20 20 20 20 61 20 6e 65 77 20 70 61 67 65        a new page
344c0 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20   into the cache 
344d0 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74  to be filled wit
344e0 68 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a  h the data read.
344f0 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
34500 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e   savepoint journ
34510 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 41 47  al..**.** If PAG
34520 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
34530 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
34540 68 65 20 64 61 74 61 20 72 65 74 75 72 6e 65 64  he data returned
34550 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65   is zeroed inste
34560 61 64 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20 72  ad.** of being r
34570 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
34580 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61  abase. Additiona
34590 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f  lly, the bits co
345a0 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
345b0 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e  o pgno in Pager.
345c0 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76  pInJournal (bitv
345d0 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65  ec of pages alre
345e0 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ady written to t
345f0 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
34600 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61 67 65  le) and the Page
34610 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61  rSavepoint.pInSa
34620 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20  vepoint bitvecs 
34630 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73  of any open.** s
34640 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65  avepoints are se
34650 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66  t. This means if
34660 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 64   the page is mad
34670 65 20 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e  e writable at an
34680 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68  y.** point in th
34690 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20  e future, using 
346a0 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
346b0 33 50 61 67 65 72 57 72 69 74 65 28 29 2c 20 69  3PagerWrite(), i
346c0 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77  ts contents.** w
346d0 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e  ill not be journ
346e0 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65 73  aled. This saves
346f0 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61   IO..**.** The a
34700 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74  cquisition might
34710 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61   fail for severa
34720 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61  l reasons.  In a
34730 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20  ll cases,.** an 
34740 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
34750 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
34760 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69  ed and *ppPage i
34770 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
34780 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
34790 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
347a0 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72  ().  Both this r
347b0 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75  outine and Looku
347c0 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  p() attempt.** t
347d0 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e  o find a page in
347e0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
347f0 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20  ache first.  If 
34800 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
34810 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65  already.** in me
34820 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69  mory, this routi
34830 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20  ne goes to disk 
34840 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68  to read it in wh
34850 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a  ereas Lookup().*
34860 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30  * just returns 0
34870 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
34880 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d  acquires a read-
34890 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  lock the first t
348a0 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f  ime it.** has to
348b0 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64   go to disk, and
348c0 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79   could also play
348d0 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  back an old jour
348e0 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nal if necessary
348f0 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75  ..** Since Looku
34900 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74  p() never goes t
34910 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72  o disk, it never
34920 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74   has to deal wit
34930 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f  h locks.** or jo
34940 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a  urnal files..*/.
34950 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61  static int getPa
34960 67 65 4e 6f 72 6d 61 6c 28 0a 20 20 50 61 67 65  geNormal(.  Page
34970 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
34980 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65  /* The pager ope
34990 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
349a0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
349b0 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
349c0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
349d0 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50  o fetch */.  DbP
349e0 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
349f0 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e   /* Write a poin
34a00 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
34a10 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
34a20 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ags           /*
34a30 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66   PAGER_GET_XXX f
34a40 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  lags */.){.  int
34a50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
34a60 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
34a70 20 75 38 20 6e 6f 43 6f 6e 74 65 6e 74 3b 20 20   u8 noContent;  
34a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a90 20 2f 2a 20 54 72 75 65 20 69 66 20 50 41 47 45   /* True if PAGE
34aa0 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
34ab0 69 73 20 73 65 74 20 2a 2f 0a 20 20 73 71 6c 69  is set */.  sqli
34ac0 74 65 33 5f 70 63 61 63 68 65 5f 70 61 67 65 20  te3_pcache_page 
34ad0 2a 70 42 61 73 65 3b 0a 0a 20 20 61 73 73 65 72  *pBase;..  asser
34ae0 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
34af0 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
34b00 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
34b10 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
34b20 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73  _READER );.  ass
34b30 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
34b40 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
34b50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
34b60 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72  ger->hasHeldShar
34b70 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 0a 20 20  edLock==1 );..  
34b80 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20 72 65  if( pgno==0 ) re
34b90 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
34ba0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 70 42 61 73  UPT_BKPT;.  pBas
34bb0 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  e = sqlite3Pcach
34bc0 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70  eFetch(pPager->p
34bd0 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 33 29  PCache, pgno, 3)
34be0 3b 0a 20 20 69 66 28 20 70 42 61 73 65 3d 3d 30  ;.  if( pBase==0
34bf0 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 30 3b   ){.    pPg = 0;
34c00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
34c10 33 50 63 61 63 68 65 46 65 74 63 68 53 74 72 65  3PcacheFetchStre
34c20 73 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ss(pPager->pPCac
34c30 68 65 2c 20 70 67 6e 6f 2c 20 26 70 42 61 73 65  he, pgno, &pBase
34c40 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
34c50 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
34c60 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
34c70 72 3b 0a 20 20 20 20 69 66 28 20 70 42 61 73 65  r;.    if( pBase
34c80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
34c90 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
34ca0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
34cb0 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
34cc0 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  r;.    }.  }.  p
34cd0 50 67 20 3d 20 2a 70 70 50 61 67 65 20 3d 20 73  Pg = *ppPage = s
34ce0 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
34cf0 68 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e  hFinish(pPager->
34d00 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70  pPCache, pgno, p
34d10 42 61 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Base);.  assert(
34d20 20 70 50 67 3d 3d 28 2a 70 70 50 61 67 65 29 20   pPg==(*ppPage) 
34d30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
34d40 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a  ->pgno==pgno );.
34d50 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
34d60 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c  Pager==pPager ||
34d70 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20   pPg->pPager==0 
34d80 29 3b 0a 0a 20 20 6e 6f 43 6f 6e 74 65 6e 74 20  );..  noContent 
34d90 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
34da0 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 29 21  _GET_NOCONTENT)!
34db0 3d 30 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70  =0;.  if( pPg->p
34dc0 50 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74  Pager && !noCont
34dd0 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e  ent ){.    /* In
34de0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70   this case the p
34df0 63 61 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f  cache already co
34e00 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61  ntains an initia
34e10 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20  lized copy of.  
34e20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52    ** the page. R
34e30 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75  eturn without fu
34e40 72 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20  rther ado.  */. 
34e50 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c     assert( pgno<
34e60 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20  =PAGER_MAX_PGNO 
34e70 26 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d  && pgno!=PAGER_M
34e80 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
34e90 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53  ;.    pPager->aS
34ea0 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 48  tat[PAGER_STAT_H
34eb0 49 54 5d 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  IT]++;.    retur
34ec0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
34ed0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
34ee0 65 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61  e pager cache ha
34ef0 73 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20  s created a new 
34f00 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e  page. Its conten
34f10 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20  t needs to .    
34f20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ** be initialize
34f30 64 2e 20 42 75 74 20 66 69 72 73 74 20 73 6f 6d  d. But first som
34f40 65 20 65 72 72 6f 72 20 63 68 65 63 6b 73 3a 0a  e error checks:.
34f50 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 28 31      **.    ** (1
34f60 29 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  ) The maximum pa
34f70 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33  ge number is 2^3
34f80 31 0a 20 20 20 20 2a 2a 20 28 32 29 20 4e 65 76  1.    ** (2) Nev
34f90 65 72 20 74 72 79 20 74 6f 20 66 65 74 63 68 20  er try to fetch 
34fa0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65  the locking page
34fb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
34fc0 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50  pgno>PAGER_MAX_P
34fd0 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  GNO || pgno==PAG
34fe0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
34ff0 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
35000 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
35010 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
35020 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
35030 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  rr;.    }..    p
35040 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61  Pg->pPager = pPa
35050 67 65 72 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  ger;..    assert
35060 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
35070 2d 3e 66 64 29 20 7c 7c 20 21 4d 45 4d 44 42 20  ->fd) || !MEMDB 
35080 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70  );.    if( !isOp
35090 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
350a0 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
350b0 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f 6e 74 65  <pgno || noConte
350c0 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  nt ){.      if( 
350d0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50  pgno>pPager->mxP
350e0 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72  gno ){.        r
350f0 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
35100 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
35110 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
35120 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
35130 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a  f( noContent ){.
35140 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 75          /* Failu
35150 72 65 20 74 6f 20 73 65 74 20 74 68 65 20 62 69  re to set the bi
35160 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72  ts in the InJour
35170 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20  nal bit-vectors 
35180 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20  is benign..     
35190 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20     ** It merely 
351a0 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69  means that we mi
351b0 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72  ght do some extr
351c0 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61  a work to journa
351d0 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  l a .        ** 
351e0 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
351f0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f  ot need to be jo
35200 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74  urnaled.  Nevert
35210 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20  heless, be sure 
35220 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  .        ** to t
35230 65 73 74 20 74 68 65 20 63 61 73 65 20 77 68 65  est the case whe
35240 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  re a malloc erro
35250 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
35260 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a 20 20  rying to set .  
35270 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74 20 69        ** a bit i
35280 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72 2e 0a  n a bit vector..
35290 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
352a0 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
352b0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
352c0 20 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3c         if( pgno<
352d0 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
352e0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
352f0 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20   TESTONLY( rc = 
35300 29 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  ) sqlite3BitvecS
35310 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  et(pPager->pInJo
35320 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20  urnal, pgno);.  
35330 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
35340 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
35350 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  EM );.        }.
35360 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59          TESTONLY
35370 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f 53 61  ( rc = ) addToSa
35380 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70  vepointBitvecs(p
35390 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
353a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
353b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
353c0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
353d0 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
353e0 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  oc();.      }.  
353f0 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e      memset(pPg->
35400 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72  pData, 0, pPager
35410 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
35420 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52     IOTRACE(("ZER
35430 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  O %p %d\n", pPag
35440 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20  er, pgno));.    
35450 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
35460 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
35470 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20 20  ==pPager );.    
35480 20 20 70 50 61 67 65 72 2d 3e 61 53 74 61 74 5b    pPager->aStat[
35490 50 41 47 45 52 5f 53 54 41 54 5f 4d 49 53 53 5d  PAGER_STAT_MISS]
354a0 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72  ++;.      rc = r
354b0 65 61 64 44 62 50 61 67 65 28 70 50 67 29 3b 0a  eadDbPage(pPg);.
354c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
354d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
354e0 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63     goto pager_ac
354f0 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
35500 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67   }.    }.    pag
35510 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28  er_set_pagehash(
35520 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pPg);.  }.  retu
35530 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
35540 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72  ager_acquire_err
35550 3a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  :.  assert( rc!=
35560 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
35570 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71  f( pPg ){.    sq
35580 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
35590 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  pPg);.  }.  page
355a0 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
355b0 70 50 61 67 65 72 29 3b 0a 20 20 2a 70 70 50 61  pPager);.  *ppPa
355c0 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ge = 0;.  return
355d0 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49   rc;.}..#if SQLI
355e0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
355f0 3e 30 0a 2f 2a 20 54 68 65 20 70 61 67 65 20 67  >0./* The page g
35600 65 74 74 65 72 20 66 6f 72 20 77 68 65 6e 20 6d  etter for when m
35610 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f  emory-mapped I/O
35620 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 73   is enabled */.s
35630 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 67  tatic int getPag
35640 65 4d 4d 61 70 28 0a 20 20 50 61 67 65 72 20 2a  eMMap(.  Pager *
35650 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20  pPager,      /* 
35660 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f  The pager open o
35670 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
35680 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
35690 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no,          /* 
356a0 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66  Page number to f
356b0 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65  etch */.  DbPage
356c0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
356d0 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
356e0 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72   to the page her
356f0 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
35700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
35710 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67  GER_GET_XXX flag
35720 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
35730 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
35740 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a  PgHdr *pPg = 0;.
35750 20 20 75 33 32 20 69 46 72 61 6d 65 20 3d 20 30    u32 iFrame = 0
35760 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35770 20 20 2f 2a 20 46 72 61 6d 65 20 74 6f 20 72 65    /* Frame to re
35780 61 64 20 66 72 6f 6d 20 57 41 4c 20 66 69 6c 65  ad from WAL file
35790 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20   */..  /* It is 
357a0 61 63 63 65 70 74 61 62 6c 65 20 74 6f 20 75 73  acceptable to us
357b0 65 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 28 6d  e a read-only (m
357c0 6d 61 70 29 20 70 61 67 65 20 66 6f 72 20 61 6e  map) page for an
357d0 79 20 70 61 67 65 20 65 78 63 65 70 74 0a 20 20  y page except.  
357e0 2a 2a 20 70 61 67 65 20 31 20 69 66 20 74 68 65  ** page 1 if the
357f0 72 65 20 69 73 20 6e 6f 20 77 72 69 74 65 2d 74  re is no write-t
35800 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20  ransaction open 
35810 6f 72 20 74 68 65 20 41 43 51 55 49 52 45 5f 52  or the ACQUIRE_R
35820 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 66 6c 61  EADONLY.  ** fla
35830 67 20 77 61 73 20 73 70 65 63 69 66 69 65 64 20  g was specified 
35840 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 41  by the caller. A
35850 6e 64 20 73 6f 20 6c 6f 6e 67 20 61 73 20 74 68  nd so long as th
35860 65 20 64 62 20 69 73 20 6e 6f 74 20 61 20 0a 20  e db is not a . 
35870 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f 72   ** temporary or
35880 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
35890 61 73 65 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74  ase.  */.  const
358a0 20 69 6e 74 20 62 4d 6d 61 70 4f 6b 20 3d 20 28   int bMmapOk = (
358b0 70 67 6e 6f 3e 31 0a 20 20 20 26 26 20 28 70 50  pgno>1.   && (pP
358c0 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
358d0 47 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 28 66  GER_READER || (f
358e0 6c 61 67 73 20 26 20 50 41 47 45 52 5f 47 45 54  lags & PAGER_GET
358f0 5f 52 45 41 44 4f 4e 4c 59 29 29 0a 20 20 29 3b  _READONLY)).  );
35900 0a 0a 20 20 61 73 73 65 72 74 28 20 55 53 45 46  ..  assert( USEF
35910 45 54 43 48 28 70 50 61 67 65 72 29 20 29 3b 0a  ETCH(pPager) );.
35920 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
35930 53 5f 43 4f 44 45 43 0a 20 20 61 73 73 65 72 74  S_CODEC.  assert
35940 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  ( pPager->xCodec
35950 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ==0 );.#endif.. 
35960 20 2f 2a 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   /* Optimization
35970 20 6e 6f 74 65 3a 20 20 41 64 64 69 6e 67 20 74   note:  Adding t
35980 68 65 20 22 70 67 6e 6f 3c 3d 31 22 20 74 65 72  he "pgno<=1" ter
35990 6d 20 62 65 66 6f 72 65 20 22 70 67 6e 6f 3d 3d  m before "pgno==
359a0 30 22 20 68 65 72 65 0a 20 20 2a 2a 20 61 6c 6c  0" here.  ** all
359b0 6f 77 73 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  ows the compiler
359c0 20 6f 70 74 69 6d 69 7a 65 72 20 74 6f 20 72 65   optimizer to re
359d0 75 73 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  use the results 
359e0 6f 66 20 74 68 65 20 22 70 67 6e 6f 3e 31 22 0a  of the "pgno>1".
359f0 20 20 2a 2a 20 74 65 73 74 20 69 6e 20 74 68 65    ** test in the
35a00 20 70 72 65 76 69 6f 75 73 20 73 74 61 74 65 6d   previous statem
35a10 65 6e 74 2c 20 61 6e 64 20 61 76 6f 69 64 20 74  ent, and avoid t
35a20 65 73 74 69 6e 67 20 70 67 6e 6f 3d 3d 30 20 69  esting pgno==0 i
35a30 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6d 6d 6f  n the.  ** commo
35a40 6e 20 63 61 73 65 20 77 68 65 72 65 20 70 67 6e  n case where pgn
35a50 6f 20 69 73 20 6c 61 72 67 65 2e 20 2a 2f 0a 20  o is large. */. 
35a60 20 69 66 28 20 70 67 6e 6f 3c 3d 31 20 26 26 20   if( pgno<=1 && 
35a70 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pgno==0 ){.    r
35a80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
35a90 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
35aa0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
35ab0 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  >eState>=PAGER_R
35ac0 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72  EADER );.  asser
35ad0 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
35ae0 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
35af0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
35b00 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64  r->hasHeldShared
35b10 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73  Lock==1 );.  ass
35b20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
35b30 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
35b40 29 3b 0a 0a 20 20 69 66 28 20 62 4d 6d 61 70 4f  );..  if( bMmapO
35b50 6b 20 26 26 20 70 61 67 65 72 55 73 65 57 61 6c  k && pagerUseWal
35b60 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
35b70 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
35b80 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d  indFrame(pPager-
35b90 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26 69 46  >pWal, pgno, &iF
35ba0 72 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72  rame);.    if( r
35bb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
35bc0 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
35bd0 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
35be0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
35bf0 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26 26 20 69  if( bMmapOk && i
35c00 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Frame==0 ){.    
35c10 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 30 3b  void *pData = 0;
35c20 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
35c30 33 4f 73 46 65 74 63 68 28 70 50 61 67 65 72 2d  3OsFetch(pPager-
35c40 3e 66 64 2c 20 0a 20 20 20 20 20 20 20 20 28 69  >fd, .        (i
35c50 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a 20 70 50  64)(pgno-1) * pP
35c60 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
35c70 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
35c80 2c 20 26 70 44 61 74 61 0a 20 20 20 20 29 3b 0a  , &pData.    );.
35c90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
35ca0 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61 20 29  TE_OK && pData )
35cb0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
35cc0 65 72 2d 3e 65 53 74 61 74 65 3e 50 41 47 45 52  er->eState>PAGER
35cd0 5f 52 45 41 44 45 52 20 7c 7c 20 70 50 61 67 65  _READER || pPage
35ce0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
35cf0 20 20 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c         pPg = sql
35d00 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
35d10 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
35d20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
35d30 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pPg==0 ){.     
35d40 20 20 20 72 63 20 3d 20 70 61 67 65 72 41 63 71     rc = pagerAcq
35d50 75 69 72 65 4d 61 70 50 61 67 65 28 70 50 61 67  uireMapPage(pPag
35d60 65 72 2c 20 70 67 6e 6f 2c 20 70 44 61 74 61 2c  er, pgno, pData,
35d70 20 26 70 50 67 29 3b 0a 20 20 20 20 20 7d 65 6c   &pPg);.     }el
35d80 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
35d90 74 65 33 4f 73 55 6e 66 65 74 63 68 28 70 50 61  te3OsUnfetch(pPa
35da0 67 65 72 2d 3e 66 64 2c 20 28 69 36 34 29 28 70  ger->fd, (i64)(p
35db0 67 6e 6f 2d 31 29 2a 70 50 61 67 65 72 2d 3e 70  gno-1)*pPager->p
35dc0 61 67 65 53 69 7a 65 2c 20 70 44 61 74 61 29 3b  ageSize, pData);
35dd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
35de0 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20  f( pPg ){.      
35df0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
35e00 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
35e10 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67     *ppPage = pPg
35e20 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
35e30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
35e40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
35e50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
35e60 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65  ){.      *ppPage
35e70 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
35e80 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
35e90 0a 20 20 72 65 74 75 72 6e 20 67 65 74 50 61 67  .  return getPag
35ea0 65 4e 6f 72 6d 61 6c 28 70 50 61 67 65 72 2c 20  eNormal(pPager, 
35eb0 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c  pgno, ppPage, fl
35ec0 61 67 73 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ags);.}.#endif /
35ed0 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  * SQLITE_MAX_MMA
35ee0 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 20  P_SIZE>0 */../* 
35ef0 54 68 65 20 70 61 67 65 20 67 65 74 74 65 72 20  The page getter 
35f00 6d 65 74 68 6f 64 20 66 6f 72 20 77 68 65 6e 20  method for when 
35f10 74 68 65 20 70 61 67 65 72 20 69 73 20 61 6e 20  the pager is an 
35f20 65 72 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a 73  error state */.s
35f30 74 61 74 69 63 20 69 6e 74 20 67 65 74 50 61 67  tatic int getPag
35f40 65 45 72 72 6f 72 28 0a 20 20 50 61 67 65 72 20  eError(.  Pager 
35f50 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a  *pPager,      /*
35f60 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20   The pager open 
35f70 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
35f80 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
35f90 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  gno,          /*
35fa0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
35fb0 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67  fetch */.  DbPag
35fc0 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
35fd0 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65  * Write a pointe
35fe0 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  r to the page he
35ff0 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
36000 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  s           /* P
36010 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66 6c 61  AGER_GET_XXX fla
36020 67 73 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45  gs */.){.  UNUSE
36030 44 5f 50 41 52 41 4d 45 54 45 52 28 70 67 6e 6f  D_PARAMETER(pgno
36040 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
36050 4d 45 54 45 52 28 66 6c 61 67 73 29 3b 0a 20 20  METER(flags);.  
36060 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
36070 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
36080 4f 4b 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20  OK );.  *ppPage 
36090 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  = 0;.  return pP
360a0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d  ager->errCode;.}
360b0 0a 0a 0a 2f 2a 20 44 69 73 70 61 74 63 68 20 61  .../* Dispatch a
360c0 6c 6c 20 70 61 67 65 20 66 65 74 63 68 20 72 65  ll page fetch re
360d0 71 75 65 73 74 73 20 74 6f 20 74 68 65 20 61 70  quests to the ap
360e0 70 72 6f 70 72 69 61 74 65 20 67 65 74 74 65 72  propriate getter
360f0 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 69 6e 74 20   method..*/.int 
36100 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
36110 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
36120 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
36130 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ger open on the 
36140 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
36150 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
36160 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
36170 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a  umber to fetch *
36180 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50  /.  DbPage **ppP
36190 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65  age,    /* Write
361a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
361b0 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  e page here */. 
361c0 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
361d0 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45       /* PAGER_GE
361e0 54 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 29  T_XXX flags */.)
361f0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
36200 72 2d 3e 78 47 65 74 28 70 50 61 67 65 72 2c 20  r->xGet(pPager, 
36210 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c  pgno, ppPage, fl
36220 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ags);.}../*.** A
36230 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
36240 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
36250 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
36260 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
36270 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
36280 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
36290 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
362a0 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
362b0 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
362c0 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 0a   not in cache. .
362d0 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
362e0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
362f0 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  .  The differenc
36300 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
36310 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71  outine.** and sq
36320 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
36330 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77  is that _get() w
36340 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69  ill go to the di
36350 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69  sk and read.** i
36360 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68  n the page if th
36370 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
36380 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20  ready in cache. 
36390 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
363a0 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
363b0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
363c0 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20   in cache or if 
363d0 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72  a disk I/O error
363e0 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61   .** has ever ha
363f0 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67  ppened..*/.DbPag
36400 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c  e *sqlite3PagerL
36410 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
36420 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
36430 0a 20 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68  .  sqlite3_pcach
36440 65 5f 70 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  e_page *pPage;. 
36450 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
36460 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
36470 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61 73 73  pgno!=0 );.  ass
36480 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 50 43  ert( pPager->pPC
36490 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 70 50 61  ache!=0 );.  pPa
364a0 67 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  ge = sqlite3Pcac
364b0 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
364c0 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30  pPCache, pgno, 0
364d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
364e0 67 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  ge==0 || pPager-
364f0 3e 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f  >hasHeldSharedLo
36500 63 6b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ck );.  if( pPag
36510 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  e==0 ) return 0;
36520 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
36530 33 50 63 61 63 68 65 46 65 74 63 68 46 69 6e 69  3PcacheFetchFini
36540 73 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  sh(pPager->pPCac
36550 68 65 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65 29  he, pgno, pPage)
36560 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
36570 73 65 20 61 20 70 61 67 65 20 72 65 66 65 72 65  se a page refere
36580 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  nce..**.** The s
36590 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
365a0 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61  () and sqlite3Pa
365b0 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
365c0 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 0a 2a 2a  ) may only be.**
365d0 20 75 73 65 64 20 69 66 20 77 65 20 6b 6e 6f 77   used if we know
365e0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 62   that the page b
365f0 65 69 6e 67 20 72 65 6c 65 61 73 65 64 20 69 73  eing released is
36600 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 20 70 61   not the last pa
36610 67 65 2e 0a 2a 2a 20 54 68 65 20 62 74 72 65 65  ge..** The btree
36620 20 6c 61 79 65 72 20 61 6c 77 61 79 73 20 68 6f   layer always ho
36630 6c 64 73 20 70 61 67 65 31 20 6f 70 65 6e 20 75  lds page1 open u
36640 6e 74 69 6c 20 74 68 65 20 65 6e 64 2c 20 73 6f  ntil the end, so
36650 20 74 68 65 73 65 20 66 69 72 73 74 0a 2a 2a 20   these first.** 
36660 74 6f 20 72 6f 75 74 69 6e 65 73 20 63 61 6e 20  to routines can 
36670 62 65 20 75 73 65 64 20 74 6f 20 72 65 6c 65 61  be used to relea
36680 73 65 20 61 6e 79 20 70 61 67 65 20 6f 74 68 65  se any page othe
36690 72 20 74 68 61 6e 20 42 74 53 68 61 72 65 64 2e  r than BtShared.
366a0 70 50 61 67 65 31 2e 0a 2a 2a 0a 2a 2a 20 55 73  pPage1..**.** Us
366b0 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  e sqlite3PagerUn
366c0 72 65 66 50 61 67 65 4f 6e 65 28 29 20 74 6f 20  refPageOne() to 
366d0 72 65 6c 65 61 73 65 20 70 61 67 65 31 2e 20 20  release page1.  
366e0 54 68 69 73 20 6c 61 74 74 65 72 20 72 6f 75 74  This latter rout
366f0 69 6e 65 0a 2a 2a 20 63 68 65 63 6b 73 20 74 68  ine.** checks th
36700 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
36710 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  f outstanding pa
36720 67 65 73 20 61 6e 64 20 69 66 20 74 68 65 20 6e  ges and if the n
36730 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
36740 73 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 69  s reaches zero i
36750 74 20 64 72 6f 70 73 20 74 68 65 20 64 61 74 61  t drops the data
36760 62 61 73 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f  base lock..*/.vo
36770 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  id sqlite3PagerU
36780 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 44 62 50 61  nrefNotNull(DbPa
36790 67 65 20 2a 70 50 67 29 7b 0a 20 20 54 45 53 54  ge *pPg){.  TEST
367a0 4f 4e 4c 59 28 20 50 61 67 65 72 20 2a 70 50 61  ONLY( Pager *pPa
367b0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
367c0 72 3b 20 29 0a 20 20 61 73 73 65 72 74 28 20 70  r; ).  assert( p
367d0 50 67 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  Pg!=0 );.  if( p
367e0 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
367f0 52 5f 4d 4d 41 50 20 29 7b 0a 20 20 20 20 61 73  R_MMAP ){.    as
36800 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21  sert( pPg->pgno!
36810 3d 31 20 29 3b 20 20 2f 2a 20 50 61 67 65 31 20  =1 );  /* Page1 
36820 69 73 20 6e 65 76 65 72 20 6d 65 6d 6f 72 79 20  is never memory 
36830 6d 61 70 70 65 64 20 2a 2f 0a 20 20 20 20 70 61  mapped */.    pa
36840 67 65 72 52 65 6c 65 61 73 65 4d 61 70 50 61 67  gerReleaseMapPag
36850 65 28 70 50 67 29 3b 0a 20 20 7d 65 6c 73 65 7b  e(pPg);.  }else{
36860 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
36870 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
36880 20 20 7d 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20    }.  /* Do not 
36890 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  use this routine
368a0 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20   to release the 
368b0 6c 61 73 74 20 72 65 66 65 72 65 6e 63 65 20 74  last reference t
368c0 6f 20 70 61 67 65 31 20 2a 2f 0a 20 20 61 73 73  o page1 */.  ass
368d0 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
368e0 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
368f0 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 3b  r->pPCache)>0 );
36900 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  .}.void sqlite3P
36910 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67 65  agerUnref(DbPage
36920 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
36930 67 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72  g ) sqlite3Pager
36940 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67  UnrefNotNull(pPg
36950 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  );.}.void sqlite
36960 33 50 61 67 65 72 55 6e 72 65 66 50 61 67 65 4f  3PagerUnrefPageO
36970 6e 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ne(DbPage *pPg){
36980 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
36990 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 21  ;.  assert( pPg!
369a0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
369b0 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a  pPg->pgno==1 );.
369c0 20 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e    assert( (pPg->
369d0 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4d 4d  flags & PGHDR_MM
369e0 41 50 29 3d 3d 30 20 29 3b 20 2f 2a 20 50 61 67  AP)==0 ); /* Pag
369f0 65 31 20 69 73 20 6e 65 76 65 72 20 6d 65 6d 6f  e1 is never memo
36a00 72 79 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20 70  ry mapped */.  p
36a10 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
36a20 67 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  ger;.  sqlite3Pc
36a30 61 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29  acheRelease(pPg)
36a40 3b 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  ;.  pagerUnlockI
36a50 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b  fUnused(pPager);
36a60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
36a70 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
36a80 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
36a90 66 20 65 76 65 72 79 20 77 72 69 74 65 20 74 72  f every write tr
36aa0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  ansaction..** Th
36ab0 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79  ere must already
36ac0 20 62 65 20 61 20 52 45 53 45 52 56 45 44 20 6f   be a RESERVED o
36ad0 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
36ae0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
36af0 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74   .** file when t
36b00 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
36b10 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65  alled..**.** Ope
36b20 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
36b30 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61  le for pager pPa
36b40 67 65 72 20 61 6e 64 20 77 72 69 74 65 20 61 20  ger and write a 
36b50 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a  journal header.*
36b60 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  * to the start o
36b70 66 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 61  f it. If there a
36b80 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  re active savepo
36b90 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73  ints, open the s
36ba0 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73  ub-journal.** as
36bb0 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63   well. This func
36bc0 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65  tion is only use
36bd0 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  d when the journ
36be0 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67  al file is being
36bf0 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77   .** opened to w
36c00 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  rite a rollback 
36c10 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61  log for a transa
36c20 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74  ction. It is not
36c30 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f   used .** when o
36c40 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75  pening a hot jou
36c50 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c  rnal file to rol
36c60 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  l it back..**.**
36c70 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
36c80 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20  file is already 
36c90 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20  open (as it may 
36ca0 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  be in exclusive 
36cb0 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74  mode),.** then t
36cc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73  his function jus
36cd0 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e  t writes a journ
36ce0 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65  al header to the
36cf0 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a   start of the.**
36d00 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69   already open fi
36d10 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68  le. .**.** Wheth
36d20 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
36d30 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
36d40 65 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ened by this fun
36d50 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61  ction, the.** Pa
36d60 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62  ger.pInJournal b
36d70 69 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20  itvec structure 
36d80 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a  is allocated..**
36d90 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
36da0 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
36db0 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
36dc0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
36dd0 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  urn .** SQLITE_N
36de0 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74 65  OMEM if the atte
36df0 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  mpt to allocate 
36e00 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
36e10 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61   fails, or .** a
36e20 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
36e30 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72  if opening or wr
36e40 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  iting the journa
36e50 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f  l file fails..*/
36e60 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
36e70 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50  r_open_journal(P
36e80 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
36e90 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
36ea0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
36eb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
36ec0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
36ed0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f  sqlite3_vfs * co
36ee0 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65  nst pVfs = pPage
36ef0 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f  r->pVfs;   /* Lo
36f00 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73  cal cache of vfs
36f10 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   pointer */..  a
36f20 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
36f30 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
36f40 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  TER_LOCKED );.  
36f50 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
36f60 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
36f70 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
36f80 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
36f90 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a  al==0 );.  .  /*
36fa0 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74   If already in t
36fb0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
36fc0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
36fd0 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 6f   a no-op.  But o
36fe0 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68 65 72  n.  ** the other
36ff0 20 68 61 6e 64 2c 20 74 68 69 73 20 72 6f 75 74   hand, this rout
37000 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
37010 6c 65 64 20 69 66 20 77 65 20 61 72 65 20 61 6c  led if we are al
37020 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20 61 6e  ready in.  ** an
37030 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f   error state. */
37040 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
37050 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20  ger->errCode) ) 
37060 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
37070 72 72 43 6f 64 65 3b 0a 0a 20 20 69 66 28 20 21  rrCode;..  if( !
37080 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
37090 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  er) && pPager->j
370a0 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
370b0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
370c0 46 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  F ){.    pPager-
370d0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >pInJournal = sq
370e0 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
370f0 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e(pPager->dbSize
37100 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
37110 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
37120 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
37130 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
37140 50 54 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  PT;.    }.  .   
37150 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75   /* Open the jou
37160 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20  rnal file if it 
37170 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
37180 70 65 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  pen. */.    if( 
37190 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
371a0 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66  jfd) ){.      if
371b0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
371c0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
371d0 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
371e0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
371f0 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e  e3MemJournalOpen
37200 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
37210 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
37220 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
37230 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
37240 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
37250 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20 20 20  N_CREATE;.      
37260 20 20 69 6e 74 20 6e 53 70 69 6c 6c 3b 0a 0a 20    int nSpill;.. 
37270 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
37280 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
37290 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c           flags |
372a0 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44  = (SQLITE_OPEN_D
372b0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c  ELETEONCLOSE|SQL
372c0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
372d0 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20  URNAL);.        
372e0 20 20 6e 53 70 69 6c 6c 20 3d 20 73 71 6c 69 74    nSpill = sqlit
372f0 65 33 43 6f 6e 66 69 67 2e 6e 53 74 6d 74 53 70  e3Config.nStmtSp
37300 69 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ill;.        }el
37310 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c  se{.          fl
37320 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
37330 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b  EN_MAIN_JOURNAL;
37340 0a 20 20 20 20 20 20 20 20 20 20 6e 53 70 69 6c  .          nSpil
37350 6c 20 3d 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  l = jrnlBufferSi
37360 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ze(pPager);.    
37370 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
37380 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72 69  .        /* Veri
37390 66 79 20 74 68 61 74 20 74 68 65 20 64 61 74 61  fy that the data
373a0 62 61 73 65 20 73 74 69 6c 6c 20 68 61 73 20 74  base still has t
373b0 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
373c0 69 74 20 64 69 64 20 77 68 65 6e 0a 20 20 20 20  it did when.    
373d0 20 20 20 20 2a 2a 20 69 74 20 77 61 73 20 6f 72      ** it was or
373e0 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 2e  iginally opened.
373f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
37400 20 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f 76   databaseIsUnmov
37410 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ed(pPager);.    
37420 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
37430 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
37440 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
37450 6f 75 72 6e 61 6c 4f 70 65 6e 20 28 0a 20 20 20  ournalOpen (.   
37460 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c             pVfs,
37470 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
37480 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
37490 66 6c 61 67 73 2c 20 6e 53 70 69 6c 6c 0a 20 20  flags, nSpill.  
374a0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
374b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
374c0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
374d0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70  QLITE_OK || isOp
374e0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
374f0 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 0a 20  );.    }.  .  . 
37500 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
37510 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
37520 61 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72  ader to the jour
37530 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65  nal file and ope
37540 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75  n .    ** the su
37550 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  b-journal if nec
37560 65 73 73 61 72 79 2e 0a 20 20 20 20 2a 2f 0a 20  essary..    */. 
37570 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
37580 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
37590 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20   TODO: Check if 
375a0 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65  all of these are
375b0 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64   really required
375c0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65  . */.      pPage
375d0 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
375e0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
375f0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
37600 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
37610 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  er = 0;.      pP
37620 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
37630 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
37640 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
37650 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
37660 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53    }..  if( rc!=S
37670 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
37680 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
37690 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
376a0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50  Journal);.    pP
376b0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
376c0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
376d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
376e0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
376f0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
37700 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53  ;.    pPager->eS
37710 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52 49  tate = PAGER_WRI
37720 54 45 52 5f 43 41 43 48 45 4d 4f 44 3b 0a 20 20  TER_CACHEMOD;.  
37730 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
37740 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
37750 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
37760 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  on on the specif
37770 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74  ied pager object
37780 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65  . If a .** write
37790 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73  -transaction has
377a0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70   already been op
377b0 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ened, this funct
377c0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
377d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46  **.** If the exF
377e0 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20  lag argument is 
377f0 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75  false, then acqu
37800 69 72 65 20 61 74 20 6c 65 61 73 74 20 61 20 52  ire at least a R
37810 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20  ESERVED.** lock 
37820 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
37830 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20  file. If exFlag 
37840 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63  is true, then ac
37850 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a  quire at least.*
37860 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  * an EXCLUSIVE l
37870 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ock. If such a l
37880 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
37890 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20  eld, no locking 
378a0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65  .** functions ne
378b0 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ed be called..**
378c0 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49  .** If the subjI
378d0 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74  nMemory argument
378e0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
378f0 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e  en any sub-journ
37900 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74  al opened.** wit
37910 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hin this transac
37920 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65  tion will be ope
37930 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d  ned as an in-mem
37940 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a  ory file. This.*
37950 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20  * has no effect 
37960 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  if the sub-journ
37970 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  al is already op
37980 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79 20  ened (as it may 
37990 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69  be when.** runni
379a0 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
379b0 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65 20  mode) or if the 
379c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73  transaction does
379d0 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a   not require a.*
379e0 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49  * sub-journal. I
379f0 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f  f the subjInMemo
37a00 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a  ry argument is z
37a10 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65  ero, then any re
37a20 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f  quired.** sub-jo
37a30 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65  urnal is impleme
37a40 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69  nted in-memory i
37a50 66 20 70 50 61 67 65 72 20 69 73 20 61 6e 20 69  f pPager is an i
37a60 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
37a70 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20  e, .** or using 
37a80 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
37a90 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69   otherwise..*/.i
37aa0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42  nt sqlite3PagerB
37ab0 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  egin(Pager *pPag
37ac0 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20  er, int exFlag, 
37ad0 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  int subjInMemory
37ae0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
37af0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
37b00 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
37b10 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
37b20 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 73 73 65  >errCode;.  asse
37b30 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
37b40 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
37b50 20 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61   && pPager->eSta
37b60 74 65 3c 50 41 47 45 52 5f 45 52 52 4f 52 20 29  te<PAGER_ERROR )
37b70 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a  ;.  pPager->subj
37b80 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73  InMemory = (u8)s
37b90 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20  ubjInMemory;..  
37ba0 69 66 28 20 41 4c 57 41 59 53 28 70 50 61 67 65  if( ALWAYS(pPage
37bb0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
37bc0 5f 52 45 41 44 45 52 29 20 29 7b 0a 20 20 20 20  _READER) ){.    
37bd0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
37be0 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
37bf0 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55  ..    if( pagerU
37c00 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
37c10 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
37c20 20 70 61 67 65 72 20 69 73 20 63 6f 6e 66 69 67   pager is config
37c30 75 72 65 64 20 74 6f 20 75 73 65 20 6c 6f 63 6b  ured to use lock
37c40 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
37c50 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20 20 20  ve, and an.     
37c60 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   ** exclusive lo
37c70 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
37c80 73 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  se is not alread
37c90 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e 20 69  y held, obtain i
37ca0 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a 2f 0a  t now..      */.
37cb0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
37cc0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
37cd0 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45 78 63  && sqlite3WalExc
37ce0 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67 65  lusiveMode(pPage
37cf0 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29 7b 0a  r->pWal, -1) ){.
37d00 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
37d10 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65 72 2c  erLockDb(pPager,
37d20 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
37d30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
37d40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
37d50 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
37d60 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
37d70 20 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69        (void)sqli
37d80 74 65 33 57 61 6c 45 78 63 6c 75 73 69 76 65 4d  te3WalExclusiveM
37d90 6f 64 65 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ode(pPager->pWal
37da0 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  , 1);.      }.. 
37db0 20 20 20 20 20 2f 2a 20 47 72 61 62 20 74 68 65       /* Grab the
37dc0 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
37dd0 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 49 66 20  he log file. If 
37de0 73 75 63 63 65 73 73 66 75 6c 2c 20 75 70 67 72  successful, upgr
37df0 61 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ade to.      ** 
37e00 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 73  PAGER_RESERVED s
37e10 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tate. Otherwise,
37e20 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
37e30 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
37e40 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  ler..      ** Th
37e50 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 69  e busy-handler i
37e60 73 20 6e 6f 74 20 69 6e 76 6f 6b 65 64 20 69 66  s not invoked if
37e70 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   another connect
37e80 69 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20  ion already.    
37e90 20 20 2a 2a 20 68 6f 6c 64 73 20 74 68 65 20 77    ** holds the w
37ea0 72 69 74 65 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f  rite-lock. If po
37eb0 73 73 69 62 6c 65 2c 20 74 68 65 20 75 70 70 65  ssible, the uppe
37ec0 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 63 61 6c  r layer will cal
37ed0 6c 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  l it..      */. 
37ee0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
37ef0 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72  3WalBeginWriteTr
37f00 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
37f10 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 7d 65 6c  ->pWal);.    }el
37f20 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74  se{.      /* Obt
37f30 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  ain a RESERVED l
37f40 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
37f50 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
37f60 20 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65   exFlag paramete
37f70 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 72  r.      ** is tr
37f80 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61  ue, then immedia
37f90 74 65 6c 79 20 75 70 67 72 61 64 65 20 74 68 69  tely upgrade thi
37fa0 73 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56  s to an EXCLUSIV
37fb0 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20  E lock. The.    
37fc0 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65    ** busy-handle
37fd0 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62  r callback can b
37fe0 65 20 75 73 65 64 20 77 68 65 6e 20 75 70 67 72  e used when upgr
37ff0 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43  ading to the EXC
38000 4c 55 53 49 56 45 0a 20 20 20 20 20 20 2a 2a 20  LUSIVE.      ** 
38010 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68  lock, but not wh
38020 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65  en obtaining the
38030 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a   RESERVED lock..
38040 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
38050 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  c = pagerLockDb(
38060 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45 44  pPager, RESERVED
38070 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
38080 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
38090 26 26 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20  && exFlag ){.   
380a0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
380b0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
380c0 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
380d0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
380e0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
380f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
38100 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 6f      /* Change to
38110 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73   WRITER_LOCKED s
38120 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  tate..      **. 
38130 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65       ** WAL mode
38140 20 73 65 74 73 20 50 61 67 65 72 2e 65 53 74 61   sets Pager.eSta
38150 74 65 20 74 6f 20 50 41 47 45 52 5f 57 52 49 54  te to PAGER_WRIT
38160 45 52 5f 4c 4f 43 4b 45 44 20 6f 72 20 43 41 43  ER_LOCKED or CAC
38170 48 45 4d 4f 44 0a 20 20 20 20 20 20 2a 2a 20 77  HEMOD.      ** w
38180 68 65 6e 20 69 74 20 68 61 73 20 61 6e 20 6f 70  hen it has an op
38190 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  en transaction, 
381a0 62 75 74 20 6e 65 76 65 72 20 74 6f 20 44 42 4d  but never to DBM
381b0 4f 44 20 6f 72 20 46 49 4e 49 53 48 45 44 2e 0a  OD or FINISHED..
381c0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
381d0 20 62 65 63 61 75 73 65 20 69 6e 20 74 68 6f 73   because in thos
381e0 65 20 73 74 61 74 65 73 20 74 68 65 20 63 6f 64  e states the cod
381f0 65 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73  e to roll back s
38200 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20  avepoint .      
38210 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  ** transactions 
38220 6d 61 79 20 63 6f 70 79 20 64 61 74 61 20 66 72  may copy data fr
38230 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
38240 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  al into the data
38250 62 61 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 66  base .      ** f
38260 69 6c 65 20 61 73 20 77 65 6c 6c 20 61 73 20 69  ile as well as i
38270 6e 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63  nto the page cac
38280 68 65 2e 20 57 68 69 63 68 20 77 6f 75 6c 64 20  he. Which would 
38290 62 65 20 69 6e 63 6f 72 72 65 63 74 20 69 6e 20  be incorrect in 
382a0 0a 20 20 20 20 20 20 2a 2a 20 57 41 4c 20 6d 6f  .      ** WAL mo
382b0 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  de..      */.   
382c0 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
382d0 65 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52  e = PAGER_WRITER
382e0 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20 70  _LOCKED;.      p
382f0 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a  Pager->dbHintSiz
38300 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
38310 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ze;.      pPager
38320 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
38330 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
38340 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f       pPager->dbO
38350 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72  rigSize = pPager
38360 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20  ->dbSize;.      
38370 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
38380 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  ff = 0;.    }.. 
38390 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
383a0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
383b0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
383c0 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 20 20  R_READER );.    
383d0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
383e0 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
383f0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
38400 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a  RITER_LOCKED );.
38410 20 20 20 20 61 73 73 65 72 74 28 20 61 73 73 65      assert( asse
38420 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28 70  rt_pager_state(p
38430 50 61 67 65 72 29 20 29 3b 0a 20 20 7d 0a 0a 20  Pager) );.  }.. 
38440 20 50 41 47 45 52 54 52 41 43 45 28 28 22 54 52   PAGERTRACE(("TR
38450 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c  ANSACTION %d\n",
38460 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
38470 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
38480 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
38490 70 61 67 65 20 70 50 67 20 6f 6e 74 6f 20 74 68  page pPg onto th
384a0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 6f 6c  e end of the rol
384b0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  lback journal..*
384c0 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
384d0 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 70 61 67  NOINLINE int pag
384e0 65 72 41 64 64 50 61 67 65 54 6f 52 6f 6c 6c 62  erAddPageToRollb
384f0 61 63 6b 4a 6f 75 72 6e 61 6c 28 50 67 48 64 72  ackJournal(PgHdr
38500 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
38510 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
38520 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  Pager;.  int rc;
38530 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20  .  u32 cksum;.  
38540 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 20 20  char *pData2;.  
38550 69 36 34 20 69 4f 66 66 20 3d 20 70 50 61 67 65  i64 iOff = pPage
38560 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
38570 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e    /* We should n
38580 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74 68  ever write to th
38590 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
385a0 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20 2a  he page that.  *
385b0 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64  * contains the d
385c0 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20  atabase locks.  
385d0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
385e0 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20  sert verifies.  
385f0 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
38600 74 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  t. */.  assert( 
38610 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52  pPg->pgno!=PAGER
38620 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
38630 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
38640 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
38650 72 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r<=pPager->journ
38660 61 6c 4f 66 66 20 29 3b 0a 20 20 43 4f 44 45 43  alOff );.  CODEC
38670 32 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  2(pPager, pPg->p
38680 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
38690 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54   7, return SQLIT
386a0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70 44  E_NOMEM_BKPT, pD
386b0 61 74 61 32 29 3b 0a 20 20 63 6b 73 75 6d 20 3d  ata2);.  cksum =
386c0 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
386d0 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32  ger, (u8*)pData2
386e0 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 69 66  );..  /* Even if
386f0 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75   an IO or diskfu
38700 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  ll error occurs 
38710 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  wh