/ Hex Artifact Content
Login

Artifact 1bb6a57fa0465296a4d6109a1a64610a0e7adde1f3acf3ef539a9d972908ce8f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 0a 2f 2a 2a 2a 2a 2a  "wal.h".../*****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
0390: 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45 53 49  OTES ON THE DESI
03a0: 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45 52 20  GN OF THE PAGER 
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
03d0: 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62 6c 6f 63  his comment bloc
03e0: 6b 20 64 65 73 63 72 69 62 65 73 20 69 6e 76 61  k describes inva
03f0: 72 69 61 6e 74 73 20 74 68 61 74 20 68 6f 6c 64  riants that hold
0400: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 72 6f   when using a ro
0410: 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61  llback.** journa
0420: 6c 2e 20 20 54 68 65 73 65 20 69 6e 76 61 72 69  l.  These invari
0430: 61 6e 74 73 20 64 6f 20 6e 6f 74 20 61 70 70 6c  ants do not appl
0440: 79 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  y for journal_mo
0450: 64 65 3d 57 41 4c 2c 0a 2a 2a 20 6a 6f 75 72 6e  de=WAL,.** journ
0460: 61 6c 5f 6d 6f 64 65 3d 4d 45 4d 4f 52 59 2c 20  al_mode=MEMORY, 
0470: 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  or journal_mode=
0480: 4f 46 46 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69  OFF..**.** Withi
0490: 6e 20 74 68 69 73 20 63 6f 6d 6d 65 6e 74 20 62  n this comment b
04a0: 6c 6f 63 6b 2c 20 61 20 70 61 67 65 20 69 73 20  lock, a page is 
04b0: 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20 62  deemed to have b
04c0: 65 65 6e 20 73 79 6e 63 65 64 0a 2a 2a 20 61 75  een synced.** au
04d0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 73  tomatically as s
04e0: 6f 6f 6e 20 61 73 20 69 74 20 69 73 20 77 72 69  oon as it is wri
04f0: 74 74 65 6e 20 77 68 65 6e 20 50 52 41 47 4d 41  tten when PRAGMA
0500: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
0510: 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
0520: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
0530: 73 79 6e 63 65 64 20 75 6e 74 69 6c 20 74 68 65  synced until the
0540: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 6f 66   xSync method of
0550: 20 74 68 65 20 56 46 53 0a 2a 2a 20 69 73 20 63   the VFS.** is c
0560: 61 6c 6c 65 64 20 73 75 63 63 65 73 73 66 75 6c  alled successful
0570: 6c 79 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 63  ly on the file c
0580: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 61  ontaining the pa
0590: 67 65 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 69 6e 69  ge..**.** Defini
05a0: 74 69 6f 6e 3a 20 20 41 20 70 61 67 65 20 6f 66  tion:  A page of
05b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
05c0: 6c 65 20 69 73 20 73 61 69 64 20 74 6f 20 62 65  le is said to be
05d0: 20 22 6f 76 65 72 77 72 69 74 65 61 62 6c 65 22   "overwriteable"
05e0: 20 69 66 0a 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f   if.** one or mo
05f0: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
0600: 69 6e 67 20 61 72 65 20 74 72 75 65 20 61 62 6f  ing are true abo
0610: 75 74 20 74 68 65 20 70 61 67 65 3a 0a 2a 2a 20  ut the page:.** 
0620: 0a 2a 2a 20 20 20 20 20 28 61 29 20 20 54 68 65  .**     (a)  The
0630: 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
0640: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 73  t of the page as
0650: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
0660: 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 20  eginning of.**  
0670: 20 20 20 20 20 20 20 20 74 68 65 20 74 72 61 6e          the tran
0680: 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
0690: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
06a0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
06b0: 61 6c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  al and.**       
06c0: 20 20 20 73 79 6e 63 65 64 2e 0a 2a 2a 20 0a 2a     synced..** .*
06d0: 2a 20 20 20 20 20 28 62 29 20 20 54 68 65 20 70  *     (b)  The p
06e0: 61 67 65 20 77 61 73 20 61 20 66 72 65 65 6c 69  age was a freeli
06f0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 61 74 20  st leaf page at 
0700: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0710: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0720: 20 0a 2a 2a 20 20 20 20 20 28 63 29 20 20 54 68   .**     (c)  Th
0730: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
0740: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
0750: 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 74  e largest page t
0760: 68 61 74 20 65 78 69 73 74 65 64 20 69 6e 0a 2a  hat existed in.*
0770: 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20 64  *          the d
0780: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
0790: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
07a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
07b0: 20 0a 2a 2a 20 28 31 29 20 41 20 70 61 67 65 20   .** (1) A page 
07c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07d0: 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 76  file is never ov
07e0: 65 72 77 72 69 74 74 65 6e 20 75 6e 6c 65 73 73  erwritten unless
07f0: 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20   one of the.**  
0800: 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65     following are
0810: 20 74 72 75 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20   true:.** .**   
0820: 20 20 28 61 29 20 54 68 65 20 70 61 67 65 20 61    (a) The page a
0830: 6e 64 20 61 6c 6c 20 6f 74 68 65 72 20 70 61 67  nd all other pag
0840: 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 73  es on the same s
0850: 65 63 74 6f 72 20 61 72 65 20 6f 76 65 72 77 72  ector are overwr
0860: 69 74 65 61 62 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20  iteable..** .** 
0870: 20 20 20 20 28 62 29 20 54 68 65 20 61 74 6f 6d      (b) The atom
0880: 69 63 20 70 61 67 65 20 77 72 69 74 65 20 6f 70  ic page write op
0890: 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e  timization is en
08a0: 61 62 6c 65 64 2c 20 61 6e 64 20 74 68 65 20 65  abled, and the e
08b0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 20 20 20  ntire.**        
08c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 74 68   transaction oth
08d0: 65 72 20 74 68 61 6e 20 74 68 65 20 75 70 64 61  er than the upda
08e0: 74 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  te of the transa
08f0: 63 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 0a 2a  ction sequence.*
0900: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
0910: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
0920: 69 6e 67 6c 65 20 70 61 67 65 20 63 68 61 6e 67  ingle page chang
0930: 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 32 29 20 54 68  e..** .** (2) Th
0940: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
0950: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
0960: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
0970: 75 72 6e 61 6c 20 65 78 61 63 74 6c 79 20 6d 61  urnal exactly ma
0980: 74 63 68 65 73 0a 2a 2a 20 20 20 20 20 62 6f 74  tches.**     bot
0990: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e  h the content in
09a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 68   the database wh
09b0: 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  en the rollback 
09c0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 77 72 69 74  journal was writ
09d0: 74 65 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74  ten.**     and t
09e0: 68 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68  he content in th
09f0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
0a00: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
0a10: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20  he current.**   
0a20: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a    transaction..*
0a30: 2a 20 0a 2a 2a 20 28 33 29 20 57 72 69 74 65 73  * .** (3) Writes
0a40: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0a50: 20 66 69 6c 65 20 61 72 65 20 61 6e 20 69 6e 74   file are an int
0a60: 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
0a70: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
0a80: 2a 20 20 20 20 20 69 6e 20 6c 65 6e 67 74 68 20  *     in length 
0a90: 61 6e 64 20 61 72 65 20 61 6c 69 67 6e 65 64 20  and are aligned 
0aa0: 6f 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61  on a page bounda
0ab0: 72 79 2e 0a 2a 2a 20 0a 2a 2a 20 28 34 29 20 52  ry..** .** (4) R
0ac0: 65 61 64 73 20 66 72 6f 6d 20 74 68 65 20 64 61  eads from the da
0ad0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
0ae0: 65 69 74 68 65 72 20 61 6c 69 67 6e 65 64 20 6f  either aligned o
0af0: 6e 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  n a page boundar
0b00: 79 20 61 6e 64 0a 2a 2a 20 20 20 20 20 61 6e 20  y and.**     an 
0b10: 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
0b20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   of the page siz
0b30: 65 20 69 6e 20 6c 65 6e 67 74 68 20 6f 72 20 61  e in length or a
0b40: 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  re taken from th
0b50: 65 0a 2a 2a 20 20 20 20 20 66 69 72 73 74 20 31  e.**     first 1
0b60: 30 30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  00 bytes of the 
0b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0b80: 2a 20 0a 2a 2a 20 28 35 29 20 41 6c 6c 20 77 72  * .** (5) All wr
0b90: 69 74 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ites to the data
0ba0: 62 61 73 65 20 66 69 6c 65 20 61 72 65 20 73 79  base file are sy
0bb0: 6e 63 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nced prior to th
0bc0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bd0: 61 6c 0a 2a 2a 20 20 20 20 20 62 65 69 6e 67 20  al.**     being 
0be0: 64 65 6c 65 74 65 64 2c 20 74 72 75 6e 63 61 74  deleted, truncat
0bf0: 65 64 2c 20 6f 72 20 7a 65 72 6f 65 64 2e 0a 2a  ed, or zeroed..*
0c00: 2a 20 0a 2a 2a 20 28 36 29 20 49 66 20 61 20 6d  * .** (6) If a m
0c10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
0c20: 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
0c30: 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74   all writes to t
0c40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0c50: 0a 2a 2a 20 20 20 20 20 61 72 65 20 73 79 6e 63  .**     are sync
0c60: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
0c70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 62  master journal b
0c80: 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
0c90: 20 0a 2a 2a 20 44 65 66 69 6e 69 74 69 6f 6e 3a   .** Definition:
0ca0: 20 54 77 6f 20 64 61 74 61 62 61 73 65 73 20 28   Two databases (
0cb0: 6f 72 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  or the same data
0cc0: 62 61 73 65 20 61 74 20 74 77 6f 20 70 6f 69 6e  base at two poin
0cd0: 74 73 20 69 74 20 74 69 6d 65 29 0a 2a 2a 20 61  ts it time).** a
0ce0: 72 65 20 73 61 69 64 20 74 6f 20 62 65 20 22 6c  re said to be "l
0cf0: 6f 67 69 63 61 6c 6c 79 20 65 71 75 69 76 61 6c  ogically equival
0d00: 65 6e 74 22 20 69 66 20 74 68 65 79 20 67 69 76  ent" if they giv
0d10: 65 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65  e the same answe
0d20: 72 20 74 6f 0a 2a 2a 20 61 6c 6c 20 71 75 65 72  r to.** all quer
0d30: 69 65 73 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ies.  Note in pa
0d40: 72 74 69 63 75 6c 61 72 20 74 68 65 20 63 6f 6e  rticular the con
0d50: 74 65 6e 74 20 6f 66 20 66 72 65 65 6c 69 73 74  tent of freelist
0d60: 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 73 20 63   leaf.** pages c
0d70: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 72  an be changed ar
0d80: 62 69 74 72 61 72 69 6c 79 20 77 69 74 68 6f 75  bitrarily withou
0d90: 74 20 61 66 66 65 63 74 69 6e 67 20 74 68 65 20  t affecting the 
0da0: 6c 6f 67 69 63 61 6c 20 65 71 75 69 76 61 6c 65  logical equivale
0db0: 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  nce.** of the da
0dc0: 74 61 62 61 73 65 2e 0a 2a 2a 20 0a 2a 2a 20 28  tabase..** .** (
0dd0: 37 29 20 41 74 20 61 6e 79 20 74 69 6d 65 2c 20  7) At any time, 
0de0: 69 66 20 61 6e 79 20 73 75 62 73 65 74 2c 20 69  if any subset, i
0df0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 65 6d 70  ncluding the emp
0e00: 74 79 20 73 65 74 20 61 6e 64 20 74 68 65 20 74  ty set and the t
0e10: 6f 74 61 6c 20 73 65 74 2c 0a 2a 2a 20 20 20 20  otal set,.**    
0e20: 20 6f 66 20 74 68 65 20 75 6e 73 79 6e 63 65 64   of the unsynced
0e30: 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 72 6f   changes to a ro
0e40: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
0e50: 72 65 20 72 65 6d 6f 76 65 64 20 61 6e 64 20 74  re removed and t
0e60: 68 65 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  he .**     journ
0e70: 61 6c 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  al is rolled bac
0e80: 6b 2c 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  k, the resulting
0e90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
0ea0: 69 6c 6c 20 62 65 20 6c 6f 67 69 63 61 6c 6c 79  ill be logically
0eb0: 0a 2a 2a 20 20 20 20 20 65 71 75 69 76 61 6c 65  .**     equivale
0ec0: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0ed0: 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 62  se file at the b
0ee0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0ef0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
0f00: 0a 2a 2a 20 28 38 29 20 57 68 65 6e 20 61 20 74  .** (8) When a t
0f10: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
0f20: 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 78  lled back, the x
0f30: 54 72 75 6e 63 61 74 65 20 6d 65 74 68 6f 64 20  Truncate method 
0f40: 6f 66 20 74 68 65 20 56 46 53 0a 2a 2a 20 20 20  of the VFS.**   
0f50: 20 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72    is called to r
0f60: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
0f70: 61 73 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  ase file to the 
0f80: 73 61 6d 65 20 73 69 7a 65 20 69 74 20 77 61 73  same size it was
0f90: 20 61 74 0a 2a 2a 20 20 20 20 20 74 68 65 20 62   at.**     the b
0fa0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
0fb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 28 49  transaction.  (I
0fc0: 6e 20 73 6f 6d 65 20 56 46 53 65 73 2c 20 74 68  n some VFSes, th
0fd0: 65 20 78 54 72 75 6e 63 61 74 65 0a 2a 2a 20 20  e xTruncate.**  
0fe0: 20 20 20 6d 65 74 68 6f 64 20 69 73 20 61 20 6e     method is a n
0ff0: 6f 2d 6f 70 2c 20 62 75 74 20 74 68 61 74 20 64  o-op, but that d
1000: 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 20 74  oes not change t
1010: 68 65 20 66 61 63 74 20 74 68 65 20 53 51 4c 69  he fact the SQLi
1020: 74 65 20 77 69 6c 6c 0a 2a 2a 20 20 20 20 20 69  te will.**     i
1030: 6e 76 6f 6b 65 20 69 74 2e 29 0a 2a 2a 20 0a 2a  nvoke it.).** .*
1040: 2a 20 28 39 29 20 57 68 65 6e 65 76 65 72 20 74  * (9) Whenever t
1050: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1060: 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 61 74   is modified, at
1070: 20 6c 65 61 73 74 20 6f 6e 65 20 62 69 74 20 69   least one bit i
1080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 2a 2a 20 20  n the range.**  
1090: 20 20 20 6f 66 20 62 79 74 65 73 20 66 72 6f 6d     of bytes from
10a0: 20 32 34 20 74 68 72 6f 75 67 68 20 33 39 20 69   24 through 39 i
10b0: 6e 63 6c 75 73 69 76 65 20 77 69 6c 6c 20 62 65  nclusive will be
10c0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
10d0: 6f 20 72 65 6c 65 61 73 69 6e 67 0a 2a 2a 20 20  o releasing.**  
10e0: 20 20 20 74 68 65 20 45 58 43 4c 55 53 49 56 45     the EXCLUSIVE
10f0: 20 6c 6f 63 6b 2c 20 74 68 75 73 20 73 69 67 6e   lock, thus sign
1100: 61 6c 69 6e 67 20 6f 74 68 65 72 20 63 6f 6e 6e  aling other conn
1110: 65 63 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 73  ections on the s
1120: 61 6d 65 0a 2a 2a 20 20 20 20 20 64 61 74 61 62  ame.**     datab
1130: 61 73 65 20 74 6f 20 66 6c 75 73 68 20 74 68 65  ase to flush the
1140: 69 72 20 63 61 63 68 65 73 2e 0a 2a 2a 0a 2a 2a  ir caches..**.**
1150: 20 28 31 30 29 20 54 68 65 20 70 61 74 74 65 72   (10) The patter
1160: 6e 20 6f 66 20 62 69 74 73 20 69 6e 20 62 79 74  n of bits in byt
1170: 65 73 20 32 34 20 74 68 72 6f 75 67 68 20 33 39  es 24 through 39
1180: 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65 70 65 61   shall not repea
1190: 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20 20 20 20  t in less.**    
11a0: 20 20 74 68 61 6e 20 6f 6e 65 20 62 69 6c 6c 69    than one billi
11b0: 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  on transactions.
11c0: 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41 20 64 61  .**.** (11) A da
11d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 77  tabase file is w
11e0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74 20 74 68  ell-formed at th
11f0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
1200: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
1210: 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20 65 76 65  n.**      of eve
1220: 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ry transaction..
1230: 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e 20 45 58  **.** (12) An EX
1240: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
1250: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1260: 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 77  base file when w
1270: 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 20 20 20  riting to.**    
1280: 20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66    the database f
1290: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31 33 29 20  ile..**.** (13) 
12a0: 41 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73  A SHARED lock is
12b0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
12c0: 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 6c 65  abase file while
12d0: 20 72 65 61 64 69 6e 67 20 61 6e 79 0a 2a 2a 20   reading any.** 
12e0: 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 6f 75 74       content out
12f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1300: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   file..**.******
1310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1350: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1360: 20 4d 61 63 72 6f 73 20 66 6f 72 20 74 72 6f 75   Macros for trou
1370: 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20 20 4e 6f  bleshooting.  No
1380: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
1390: 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73  f.*/.#if 0.int s
13a0: 71 6c 69 74 65 33 50 61 67 65 72 54 72 61 63 65  qlite3PagerTrace
13b0: 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =1;  /* True to 
13c0: 65 6e 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a  enable tracing *
13d0: 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65  /.#define sqlite
13e0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69  3DebugPrintf pri
13f0: 6e 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45  ntf.#define PAGE
1400: 52 54 52 41 43 45 28 58 29 20 20 20 20 20 69 66  RTRACE(X)     if
1410: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  ( sqlite3PagerTr
1420: 61 63 65 20 29 7b 20 73 71 6c 69 74 65 33 44 65  ace ){ sqlite3De
1430: 62 75 67 50 72 69 6e 74 66 20 58 3b 20 7d 0a 23  bugPrintf X; }.#
1440: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47  else.#define PAG
1450: 45 52 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  ERTRACE(X).#endi
1460: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1470: 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61 63 72 6f  lowing two macro
1480: 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68 69  s are used withi
1490: 6e 20 74 68 65 20 50 41 47 45 52 54 52 41 43 45  n the PAGERTRACE
14a0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
14b0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
14c0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
14d0: 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52 49 44  . .**.** PAGERID
14e0: 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74  () takes a point
14f0: 65 72 20 74 6f 20 61 20 50 61 67 65 72 20 73 74  er to a Pager st
1500: 72 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75  ruct as its argu
1510: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73  ment. The.** ass
1520: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 64 65 73  ociated file-des
1530: 63 72 69 70 74 6f 72 20 69 73 20 72 65 74 75 72  criptor is retur
1540: 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49  ned. FILEHANDLEI
1550: 44 28 29 20 74 61 6b 65 73 20 61 6e 20 73 71 6c  D() takes an sql
1560: 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20 73 74 72  ite3_file.** str
1570: 75 63 74 20 61 73 20 69 74 73 20 61 72 67 75 6d  uct as its argum
1580: 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ent..*/.#define 
1590: 50 41 47 45 52 49 44 28 70 29 20 28 53 51 4c 49  PAGERID(p) (SQLI
15a0: 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 2d  TE_PTR_TO_INT(p-
15b0: 3e 66 64 29 29 0a 23 64 65 66 69 6e 65 20 46 49  >fd)).#define FI
15c0: 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28  LEHANDLEID(fd) (
15d0: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
15e0: 54 28 66 64 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  T(fd))../*.** Th
15f0: 65 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 76  e Pager.eState v
1600: 61 72 69 61 62 6c 65 20 73 74 6f 72 65 73 20 74  ariable stores t
1610: 68 65 20 63 75 72 72 65 6e 74 20 27 73 74 61 74  he current 'stat
1620: 65 27 20 6f 66 20 61 20 70 61 67 65 72 2e 20 41  e' of a pager. A
1630: 0a 2a 2a 20 70 61 67 65 72 20 6d 61 79 20 62 65  .** pager may be
1640: 20 69 6e 20 61 6e 79 20 6f 6e 65 20 6f 66 20 74   in any one of t
1650: 68 65 20 73 65 76 65 6e 20 73 74 61 74 65 73 20  he seven states 
1660: 73 68 6f 77 6e 20 69 6e 20 74 68 65 20 66 6f 6c  shown in the fol
1670: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 20  lowing.** state 
1680: 64 69 61 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 20  diagram..**.**  
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a0: 20 20 20 20 20 20 20 20 20 20 4f 50 45 4e 20 3c            OPEN <
16b0: 2d 2d 2d 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d 2b 0a 2a  ------+------+.*
16c0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
16e0: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
16f0: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 20 20 56 20 20 20 20 20 20 20 20 20 7c 20 20 20    V         |   
1720: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
1730: 20 20 20 20 20 20 2b 2d 2d 2d 2d 2d 2d 2d 2d 2d        +---------
1740: 3e 20 52 45 41 44 45 52 2d 2d 2d 2d 2d 2d 2d 2b  > READER-------+
1750: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
1760: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1770: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1780: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1790: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20              |   
17a0: 20 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20             V    
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a              |.**
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17d0: 3c 2d 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 4c  <-------WRITER_L
17e0: 4f 43 4b 45 44 2d 2d 2d 2d 2d 2d 3e 20 45 52 52  OCKED------> ERR
17f0: 4f 52 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  OR.**           
1800: 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20      |           
1810: 20 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20     |            
1820: 20 20 20 20 5e 20 20 0a 2a 2a 20 20 20 20 20 20      ^  .**      
1830: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
1840: 20 20 20 20 20 20 20 20 56 20 20 20 20 20 20 20          V       
1850: 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
1860: 20 20 20 20 20 20 20 20 20 20 20 20 7c 3c 2d 2d              |<--
1870: 2d 2d 2d 2d 57 52 49 54 45 52 5f 43 41 43 48 45  ----WRITER_CACHE
1880: 4d 4f 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 7c 0a 2a 2a  MOD-------->|.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
18c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
18d0: 20 20 7c 20 20 20 20 20 20 20 20 20 20 20 20 20    |             
18e0: 20 56 20 20 20 20 20 20 20 20 20 20 20 20 20 20   V              
18f0: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
1900: 20 20 20 20 20 7c 3c 2d 2d 2d 2d 2d 2d 2d 57 52       |<-------WR
1910: 49 54 45 52 5f 44 42 4d 4f 44 2d 2d 2d 2d 2d 2d  ITER_DBMOD------
1920: 2d 2d 2d 2d 3e 7c 0a 2a 2a 20 20 20 20 20 20 20  ---->|.**       
1930: 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20          |       
1940: 20 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20         |        
1950: 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20          |.**    
1960: 20 20 20 20 20 20 20 20 20 20 20 7c 20 20 20 20             |    
1970: 20 20 20 20 20 20 20 20 20 20 56 20 20 20 20 20            V     
1980: 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 3c                +<
19a0: 2d 2d 2d 2d 2d 2d 57 52 49 54 45 52 5f 46 49 4e  ------WRITER_FIN
19b0: 49 53 48 45 44 2d 2d 2d 2d 2d 2d 2d 2d 3e 2b 0a  ISHED-------->+.
19c0: 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 69 73 74 20 6f 66  **.**.** List of
19d0: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
19e0: 6e 73 20 61 6e 64 20 74 68 65 20 43 20 5b 66 75  ns and the C [fu
19f0: 6e 63 74 69 6f 6e 5d 20 74 68 61 74 20 70 65 72  nction] that per
1a00: 66 6f 72 6d 73 20 65 61 63 68 3a 0a 2a 2a 20 0a  forms each:.** .
1a10: 2a 2a 20 20 20 4f 50 45 4e 20 20 20 20 20 20 20  **   OPEN       
1a20: 20 20 20 20 20 20 20 2d 3e 20 52 45 41 44 45 52         -> READER
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 73                [s
1a40: 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
1a50: 64 4c 6f 63 6b 5d 0a 2a 2a 20 20 20 52 45 41 44  dLock].**   READ
1a60: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1a70: 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20 20   OPEN           
1a80: 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c 6f       [pager_unlo
1a90: 63 6b 5d 0a 2a 2a 0a 2a 2a 20 20 20 52 45 41 44  ck].**.**   READ
1aa0: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e  ER            ->
1ab0: 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20   WRITER_LOCKED  
1ac0: 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61 67       [sqlite3Pag
1ad0: 65 72 42 65 67 69 6e 5d 0a 2a 2a 20 20 20 57 52  erBegin].**   WR
1ae0: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 20 20 20 20  ITER_LOCKED     
1af0: 2d 3e 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d  -> WRITER_CACHEM
1b00: 4f 44 20 20 20 20 20 5b 70 61 67 65 72 5f 6f 70  OD     [pager_op
1b10: 65 6e 5f 6a 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20  en_journal].**  
1b20: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
1b30: 20 20 20 2d 3e 20 57 52 49 54 45 52 5f 44 42 4d     -> WRITER_DBM
1b40: 4f 44 20 20 20 20 20 20 20 20 5b 73 79 6e 63 4a  OD        [syncJ
1b50: 6f 75 72 6e 61 6c 5d 0a 2a 2a 20 20 20 57 52 49  ournal].**   WRI
1b60: 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20 20 2d  TER_DBMOD      -
1b70: 3e 20 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  > WRITER_FINISHE
1b80: 44 20 20 20 20 20 5b 73 71 6c 69 74 65 33 50 61  D     [sqlite3Pa
1b90: 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
1ba0: 65 5d 0a 2a 2a 20 20 20 57 52 49 54 45 52 5f 2a  e].**   WRITER_*
1bb0: 2a 2a 20 20 20 20 20 20 20 20 2d 3e 20 52 45 41  **        -> REA
1bc0: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
1bd0: 20 5b 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e   [pager_end_tran
1be0: 73 61 63 74 69 6f 6e 5d 0a 2a 2a 0a 2a 2a 20 20  saction].**.**  
1bf0: 20 57 52 49 54 45 52 5f 2a 2a 2a 20 20 20 20 20   WRITER_***     
1c00: 20 20 20 2d 3e 20 45 52 52 4f 52 20 20 20 20 20     -> ERROR     
1c10: 20 20 20 20 20 20 20 20 20 20 5b 70 61 67 65 72            [pager
1c20: 5f 65 72 72 6f 72 5d 0a 2a 2a 20 20 20 45 52 52  _error].**   ERR
1c30: 4f 52 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  OR             -
1c40: 3e 20 4f 50 45 4e 20 20 20 20 20 20 20 20 20 20  > OPEN          
1c50: 20 20 20 20 20 20 5b 70 61 67 65 72 5f 75 6e 6c        [pager_unl
1c60: 6f 63 6b 5d 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 20 20  ock].** .**.**  
1c70: 4f 50 45 4e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  OPEN:.**.**    T
1c80: 68 65 20 70 61 67 65 72 20 73 74 61 72 74 73 20  he pager starts 
1c90: 75 70 20 69 6e 20 74 68 69 73 20 73 74 61 74 65  up in this state
1ca0: 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20 67 75 61  . Nothing is gua
1cb0: 72 61 6e 74 65 65 64 20 69 6e 20 74 68 69 73 0a  ranteed in this.
1cc0: 2a 2a 20 20 20 20 73 74 61 74 65 20 2d 20 74 68  **    state - th
1cd0: 65 20 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61  e file may or ma
1ce0: 79 20 6e 6f 74 20 62 65 20 6c 6f 63 6b 65 64 20  y not be locked 
1cf0: 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
1d00: 20 73 69 7a 65 20 69 73 0a 2a 2a 20 20 20 20 75   size is.**    u
1d10: 6e 6b 6e 6f 77 6e 2e 20 54 68 65 20 64 61 74 61  nknown. The data
1d20: 62 61 73 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  base may not be 
1d30: 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
1d40: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 4e 6f 20 72  .**.**    * No r
1d50: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
1d60: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
1d70: 76 65 2e 0a 2a 2a 20 20 20 20 2a 20 41 6e 79 20  ve..**    * Any 
1d80: 6c 6f 63 6b 2c 20 6f 72 20 6e 6f 20 6c 6f 63 6b  lock, or no lock
1d90: 20 61 74 20 61 6c 6c 2c 20 6d 61 79 20 62 65 20   at all, may be 
1da0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
1db0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
1dc0: 20 2a 20 54 68 65 20 64 62 53 69 7a 65 2c 20 64   * The dbSize, d
1dd0: 62 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62  bOrigSize and db
1de0: 46 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c  FileSize variabl
1df0: 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72  es may not be tr
1e00: 75 73 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 52 45  usted..**.**  RE
1e10: 41 44 45 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 49  ADER:.**.**    I
1e20: 6e 20 74 68 69 73 20 73 74 61 74 65 20 61 6c 6c  n this state all
1e30: 20 74 68 65 20 72 65 71 75 69 72 65 6d 65 6e 74   the requirement
1e40: 73 20 66 6f 72 20 72 65 61 64 69 6e 67 20 74 68  s for reading th
1e50: 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 0a 2a  e database in .*
1e60: 2a 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 28 6e  *    rollback (n
1e70: 6f 6e 2d 57 41 4c 29 20 6d 6f 64 65 20 61 72 65  on-WAL) mode are
1e80: 20 6d 65 74 2e 20 55 6e 6c 65 73 73 20 74 68 65   met. Unless the
1e90: 20 70 61 67 65 72 20 69 73 20 28 6f 72 20 72 65   pager is (or re
1ea0: 63 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 77 61 73  cently.**    was
1eb0: 29 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6c  ) in exclusive-l
1ec0: 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20 61 20 75  ocking mode, a u
1ed0: 73 65 72 2d 6c 65 76 65 6c 20 72 65 61 64 20 74  ser-level read t
1ee0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 0a 2a  ransaction is .*
1ef0: 2a 20 20 20 20 6f 70 65 6e 2e 20 54 68 65 20 64  *    open. The d
1f00: 61 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20  atabase size is 
1f10: 6b 6e 6f 77 6e 20 69 6e 20 74 68 69 73 20 73 74  known in this st
1f20: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20  ate..**.**    A 
1f30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 72 75 6e 6e 69  connection runni
1f40: 6e 67 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 5f  ng with locking_
1f50: 6d 6f 64 65 3d 6e 6f 72 6d 61 6c 20 65 6e 74 65  mode=normal ente
1f60: 72 73 20 74 68 69 73 20 73 74 61 74 65 20 77 68  rs this state wh
1f70: 65 6e 0a 2a 2a 20 20 20 20 69 74 20 6f 70 65 6e  en.**    it open
1f80: 73 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  s a read-transac
1f90: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  tion on the data
1fa0: 62 61 73 65 20 61 6e 64 20 72 65 74 75 72 6e 73  base and returns
1fb0: 20 74 6f 20 73 74 61 74 65 0a 2a 2a 20 20 20 20   to state.**    
1fc0: 4f 50 45 4e 20 61 66 74 65 72 20 74 68 65 20 72  OPEN after the r
1fd0: 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
1fe0: 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e 20 48 6f  is completed. Ho
1ff0: 77 65 76 65 72 20 61 20 63 6f 6e 6e 65 63 74 69  wever a connecti
2000: 6f 6e 0a 2a 2a 20 20 20 20 72 75 6e 6e 69 6e 67  on.**    running
2010: 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
2020: 3d 65 78 63 6c 75 73 69 76 65 20 28 69 6e 63 6c  =exclusive (incl
2030: 75 64 69 6e 67 20 74 65 6d 70 20 64 61 74 61 62  uding temp datab
2040: 61 73 65 73 29 20 72 65 6d 61 69 6e 73 20 69 6e  ases) remains in
2050: 0a 2a 2a 20 20 20 20 74 68 69 73 20 73 74 61 74  .**    this stat
2060: 65 20 65 76 65 6e 20 61 66 74 65 72 20 74 68 65  e even after the
2070: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
2080: 6e 20 69 73 20 63 6c 6f 73 65 64 2e 20 54 68 65  n is closed. The
2090: 20 6f 6e 6c 79 20 77 61 79 0a 2a 2a 20 20 20 20   only way.**    
20a0: 61 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65  a locking_mode=e
20b0: 78 63 6c 75 73 69 76 65 20 63 6f 6e 6e 65 63 74  xclusive connect
20c0: 69 6f 6e 20 63 61 6e 20 74 72 61 6e 73 69 74 69  ion can transiti
20d0: 6f 6e 20 66 72 6f 6d 20 52 45 41 44 45 52 20 74  on from READER t
20e0: 6f 20 4f 50 45 4e 0a 2a 2a 20 20 20 20 69 73 20  o OPEN.**    is 
20f0: 76 69 61 20 74 68 65 20 45 52 52 4f 52 20 73 74  via the ERROR st
2100: 61 74 65 20 28 73 65 65 20 62 65 6c 6f 77 29 2e  ate (see below).
2110: 0a 2a 2a 20 0a 2a 2a 20 20 20 20 2a 20 41 20 72  .** .**    * A r
2120: 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead transaction 
2130: 6d 61 79 20 62 65 20 61 63 74 69 76 65 20 28 62  may be active (b
2140: 75 74 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  ut a write-trans
2150: 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 29 2e 0a  action cannot)..
2160: 2a 2a 20 20 20 20 2a 20 41 20 53 48 41 52 45 44  **    * A SHARED
2170: 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
2180: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2190: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
21a0: 2a 20 20 20 20 2a 20 54 68 65 20 64 62 53 69 7a  *    * The dbSiz
21b0: 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 62  e variable may b
21c0: 65 20 74 72 75 73 74 65 64 20 28 65 76 65 6e 20  e trusted (even 
21d0: 69 66 20 61 20 75 73 65 72 2d 6c 65 76 65 6c 20  if a user-level 
21e0: 72 65 61 64 20 0a 2a 2a 20 20 20 20 20 20 74 72  read .**      tr
21f0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f 74  ansaction is not
2200: 20 61 63 74 69 76 65 29 2e 20 54 68 65 20 64 62   active). The db
2210: 4f 72 69 67 53 69 7a 65 20 61 6e 64 20 64 62 46  OrigSize and dbF
2220: 69 6c 65 53 69 7a 65 20 76 61 72 69 61 62 6c 65  ileSize variable
2230: 73 0a 2a 2a 20 20 20 20 20 20 6d 61 79 20 6e 6f  s.**      may no
2240: 74 20 62 65 20 74 72 75 73 74 65 64 20 61 74 20  t be trusted at 
2250: 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2a 20 20  this point..**  
2260: 20 20 2a 20 49 66 20 74 68 65 20 64 61 74 61 62    * If the datab
2270: 61 73 65 20 69 73 20 61 20 57 41 4c 20 64 61 74  ase is a WAL dat
2280: 61 62 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20  abase, then the 
2290: 57 41 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  WAL connection i
22a0: 73 20 6f 70 65 6e 2e 0a 2a 2a 20 20 20 20 2a 20  s open..**    * 
22b0: 45 76 65 6e 20 69 66 20 61 20 72 65 61 64 2d 74  Even if a read-t
22c0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 6f  ransaction is no
22d0: 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 67 75  t open, it is gu
22e0: 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 0a 2a  aranteed that .*
22f0: 2a 20 20 20 20 20 20 74 68 65 72 65 20 69 73 20  *      there is 
2300: 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69  no hot-journal i
2310: 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
2320: 6d 2e 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52  m..**.**  WRITER
2330: 5f 4c 4f 43 4b 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  _LOCKED:.**.**  
2340: 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76 65    The pager move
2350: 73 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  s to this state 
2360: 66 72 6f 6d 20 52 45 41 44 45 52 20 77 68 65 6e  from READER when
2370: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
2380: 74 69 6f 6e 0a 2a 2a 20 20 20 20 69 73 20 66 69  tion.**    is fi
2390: 72 73 74 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  rst opened on th
23a0: 65 20 64 61 74 61 62 61 73 65 2e 20 49 6e 20 57  e database. In W
23b0: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61  RITER_LOCKED sta
23c0: 74 65 2c 20 61 6c 6c 20 6c 6f 63 6b 73 20 0a 2a  te, all locks .*
23d0: 2a 20 20 20 20 72 65 71 75 69 72 65 64 20 74 6f  *    required to
23e0: 20 73 74 61 72 74 20 61 20 77 72 69 74 65 2d 74   start a write-t
23f0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 68  ransaction are h
2400: 65 6c 64 2c 20 62 75 74 20 6e 6f 20 61 63 74 75  eld, but no actu
2410: 61 6c 20 0a 2a 2a 20 20 20 20 6d 6f 64 69 66 69  al .**    modifi
2420: 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 63  cations to the c
2430: 61 63 68 65 20 6f 72 20 64 61 74 61 62 61 73 65  ache or database
2440: 20 68 61 76 65 20 74 61 6b 65 6e 20 70 6c 61 63   have taken plac
2450: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 72  e..**.**    In r
2460: 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 2c 20 61 20  ollback mode, a 
2470: 52 45 53 45 52 56 45 44 20 6f 72 20 28 69 66 20  RESERVED or (if 
2480: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2490: 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20  was opened with 
24a0: 0a 2a 2a 20 20 20 20 42 45 47 49 4e 20 45 58 43  .**    BEGIN EXC
24b0: 4c 55 53 49 56 45 29 20 45 58 43 4c 55 53 49 56  LUSIVE) EXCLUSIV
24c0: 45 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  E lock is obtain
24d0: 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
24e0: 73 65 20 66 69 6c 65 20 77 68 65 6e 0a 2a 2a 20  se file when.** 
24f0: 20 20 20 6d 6f 76 69 6e 67 20 74 6f 20 74 68 69     moving to thi
2500: 73 20 73 74 61 74 65 2c 20 62 75 74 20 74 68 65  s state, but the
2510: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
2520: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
2530: 6f 72 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 20 20  or opened .**   
2540: 20 74 6f 20 69 6e 20 74 68 69 73 20 73 74 61 74   to in this stat
2550: 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  e. If the transa
2560: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
2570: 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
2580: 6b 20 77 68 69 6c 65 20 0a 2a 2a 20 20 20 20 69  k while .**    i
2590: 6e 20 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20  n WRITER_LOCKED 
25a0: 73 74 61 74 65 2c 20 61 6c 6c 20 74 68 61 74 20  state, all that 
25b0: 69 73 20 72 65 71 75 69 72 65 64 20 69 73 20 74  is required is t
25c0: 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
25d0: 61 62 61 73 65 20 0a 2a 2a 20 20 20 20 66 69 6c  abase .**    fil
25e0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 4e 20 57  e..**.**    IN W
25f0: 41 4c 20 6d 6f 64 65 2c 20 57 61 6c 42 65 67 69  AL mode, WalBegi
2600: 6e 57 72 69 74 65 54 72 61 6e 73 61 63 74 69 6f  nWriteTransactio
2610: 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  n() is called to
2620: 20 6c 6f 63 6b 20 74 68 65 20 6c 6f 67 20 66 69   lock the log fi
2630: 6c 65 2e 0a 2a 2a 20 20 20 20 49 66 20 74 68 65  le..**    If the
2640: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72   connection is r
2650: 75 6e 6e 69 6e 67 20 77 69 74 68 20 6c 6f 63 6b  unning with lock
2660: 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75 73 69  ing_mode=exclusi
2670: 76 65 2c 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ve, an attempt.*
2680: 2a 20 20 20 20 69 73 20 6d 61 64 65 20 74 6f 20  *    is made to 
2690: 6f 62 74 61 69 6e 20 61 6e 20 45 58 43 4c 55 53  obtain an EXCLUS
26a0: 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
26b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
26c0: 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74  *.**    * A writ
26d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
26e0: 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a   active..**    *
26f0: 20 49 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   If the connecti
2700: 6f 6e 20 69 73 20 6f 70 65 6e 20 69 6e 20 72 6f  on is open in ro
2710: 6c 6c 62 61 63 6b 2d 6d 6f 64 65 2c 20 61 20 52  llback-mode, a R
2720: 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61 74  ESERVED or great
2730: 65 72 20 0a 2a 2a 20 20 20 20 20 20 6c 6f 63 6b  er .**      lock
2740: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
2750: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2760: 2a 20 20 20 20 2a 20 49 66 20 74 68 65 20 63 6f  *    * If the co
2770: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
2780: 20 69 6e 20 57 41 4c 2d 6d 6f 64 65 2c 20 61 20   in WAL-mode, a 
2790: 57 41 4c 20 77 72 69 74 65 20 74 72 61 6e 73 61  WAL write transa
27a0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 69 73  ction.**      is
27b0: 20 6f 70 65 6e 20 28 69 2e 65 2e 20 73 71 6c 69   open (i.e. sqli
27c0: 74 65 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65  te3WalBeginWrite
27d0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20 68 61  Transaction() ha
27e0: 73 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75  s been successfu
27f0: 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 63 61 6c 6c  lly.**      call
2800: 65 64 29 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65  ed)..**    * The
2810: 20 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53   dbSize, dbOrigS
2820: 69 7a 65 20 61 6e 64 20 64 62 46 69 6c 65 53 69  ize and dbFileSi
2830: 7a 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  ze variables are
2840: 20 61 6c 6c 20 76 61 6c 69 64 2e 0a 2a 2a 20 20   all valid..**  
2850: 20 20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73    * The contents
2860: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
2870: 63 68 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65  che have not bee
2880: 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 20 20  n modified..**  
2890: 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20    * The journal 
28a0: 66 69 6c 65 20 6d 61 79 20 6f 72 20 6d 61 79 20  file may or may 
28b0: 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20  not be open..** 
28c0: 20 20 20 2a 20 4e 6f 74 68 69 6e 67 20 28 6e 6f     * Nothing (no
28d0: 74 20 65 76 65 6e 20 74 68 65 20 66 69 72 73 74  t even the first
28e0: 20 68 65 61 64 65 72 29 20 68 61 73 20 62 65 65   header) has bee
28f0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
2900: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
2910: 20 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44   WRITER_CACHEMOD
2920: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 41 20 70 61 67  :.**.**    A pag
2930: 65 72 20 6d 6f 76 65 73 20 66 72 6f 6d 20 57 52  er moves from WR
2940: 49 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74  ITER_LOCKED stat
2950: 65 20 74 6f 20 74 68 69 73 20 73 74 61 74 65 20  e to this state 
2960: 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 0a 2a  when a page is.*
2970: 2a 20 20 20 20 66 69 72 73 74 20 6d 6f 64 69 66  *    first modif
2980: 69 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ied by the upper
2990: 20 6c 61 79 65 72 2e 20 49 6e 20 72 6f 6c 6c 62   layer. In rollb
29a0: 61 63 6b 20 6d 6f 64 65 20 74 68 65 20 6a 6f 75  ack mode the jou
29b0: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20  rnal file.**    
29c0: 69 73 20 6f 70 65 6e 65 64 20 28 69 66 20 69 74  is opened (if it
29d0: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
29e0: 6f 70 65 6e 29 20 61 6e 64 20 61 20 68 65 61 64  open) and a head
29f0: 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  er written to th
2a00: 65 0a 2a 2a 20 20 20 20 73 74 61 72 74 20 6f 66  e.**    start of
2a10: 20 69 74 2e 20 54 68 65 20 64 61 74 61 62 61 73   it. The databas
2a20: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 68  e file on disk h
2a30: 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69  as not been modi
2a40: 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  fied..**.**    *
2a50: 20 41 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   A write transac
2a60: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
2a70: 2a 2a 20 20 20 20 2a 20 41 20 52 45 53 45 52 56  **    * A RESERV
2a80: 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
2a90: 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
2aa0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2ab0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 6a 6f 75  .**    * The jou
2ac0: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2ad0: 6e 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  n and the first 
2ae0: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
2af0: 77 72 69 74 74 65 6e 20 0a 2a 2a 20 20 20 20 20  written .**     
2b00: 20 74 6f 20 69 74 2c 20 62 75 74 20 74 68 65 20   to it, but the 
2b10: 68 65 61 64 65 72 20 68 61 73 20 6e 6f 74 20 62  header has not b
2b20: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69  een synced to di
2b30: 73 6b 2e 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20  sk..**    * The 
2b40: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2b50: 70 61 67 65 20 63 61 63 68 65 20 68 61 76 65 20  page cache have 
2b60: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 0a 2a  been modified..*
2b70: 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 44 42 4d  *.**  WRITER_DBM
2b80: 4f 44 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54 68 65  OD:.**.**    The
2b90: 20 70 61 67 65 72 20 74 72 61 6e 73 69 74 69 6f   pager transitio
2ba0: 6e 73 20 66 72 6f 6d 20 57 52 49 54 45 52 5f 43  ns from WRITER_C
2bb0: 41 43 48 45 4d 4f 44 20 69 6e 74 6f 20 57 52 49  ACHEMOD into WRI
2bc0: 54 45 52 5f 44 42 4d 4f 44 20 73 74 61 74 65 0a  TER_DBMOD state.
2bd0: 2a 2a 20 20 20 20 77 68 65 6e 20 69 74 20 6d 6f  **    when it mo
2be0: 64 69 66 69 65 73 20 74 68 65 20 63 6f 6e 74 65  difies the conte
2bf0: 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
2c00: 61 73 65 20 66 69 6c 65 2e 20 57 41 4c 20 63 6f  ase file. WAL co
2c10: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 20 20 20  nnections.**    
2c20: 6e 65 76 65 72 20 65 6e 74 65 72 20 74 68 69 73  never enter this
2c30: 20 73 74 61 74 65 20 28 73 69 6e 63 65 20 74 68   state (since th
2c40: 65 79 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  ey do not modify
2c50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c60: 6c 65 2c 0a 2a 2a 20 20 20 20 6a 75 73 74 20 74  le,.**    just t
2c70: 68 65 20 6c 6f 67 20 66 69 6c 65 29 2e 0a 2a 2a  he log file)..**
2c80: 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72 69 74 65  .**    * A write
2c90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2ca0: 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20 20 2a 20  active..**    * 
2cb0: 41 6e 20 45 58 43 4c 55 53 49 56 45 20 6f 72 20  An EXCLUSIVE or 
2cc0: 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
2cd0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
2ce0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
2cf0: 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66   * The journal f
2d00: 69 6c 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  ile is open and 
2d10: 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
2d20: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
2d30: 6e 20 0a 2a 2a 20 20 20 20 20 20 61 6e 64 20 73  n .**      and s
2d40: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
2d50: 2a 20 20 20 20 2a 20 54 68 65 20 63 6f 6e 74 65  *    * The conte
2d60: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
2d70: 63 61 63 68 65 20 68 61 76 65 20 62 65 65 6e 20  cache have been 
2d80: 6d 6f 64 69 66 69 65 64 20 28 61 6e 64 20 70 6f  modified (and po
2d90: 73 73 69 62 6c 79 0a 2a 2a 20 20 20 20 20 20 77  ssibly.**      w
2da0: 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 29 2e  ritten to disk).
2db0: 0a 2a 2a 0a 2a 2a 20 20 57 52 49 54 45 52 5f 46  .**.**  WRITER_F
2dc0: 49 4e 49 53 48 45 44 3a 0a 2a 2a 0a 2a 2a 20 20  INISHED:.**.**  
2dd0: 20 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73    It is not poss
2de0: 69 62 6c 65 20 66 6f 72 20 61 20 57 41 4c 20 63  ible for a WAL c
2df0: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 65 6e 74  onnection to ent
2e00: 65 72 20 74 68 69 73 20 73 74 61 74 65 2e 0a 2a  er this state..*
2e10: 2a 0a 2a 2a 20 20 20 20 41 20 72 6f 6c 6c 62 61  *.**    A rollba
2e20: 63 6b 2d 6d 6f 64 65 20 70 61 67 65 72 20 63 68  ck-mode pager ch
2e30: 61 6e 67 65 73 20 74 6f 20 57 52 49 54 45 52 5f  anges to WRITER_
2e40: 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 20 66  FINISHED state f
2e50: 72 6f 6d 20 57 52 49 54 45 52 5f 44 42 4d 4f 44  rom WRITER_DBMOD
2e60: 0a 2a 2a 20 20 20 20 73 74 61 74 65 20 61 66 74  .**    state aft
2e70: 65 72 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  er the entire tr
2e80: 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
2e90: 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  en successfully 
2ea0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
2eb0: 0a 2a 2a 20 20 20 20 64 61 74 61 62 61 73 65 20  .**    database 
2ec0: 66 69 6c 65 2e 20 49 6e 20 74 68 69 73 20 73 74  file. In this st
2ed0: 61 74 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ate the transact
2ee0: 69 6f 6e 20 6d 61 79 20 62 65 20 63 6f 6d 6d 69  ion may be commi
2ef0: 74 74 65 64 20 73 69 6d 70 6c 79 0a 2a 2a 20 20  tted simply.**  
2f00: 20 20 62 79 20 66 69 6e 61 6c 69 7a 69 6e 67 20    by finalizing 
2f10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f20: 2e 20 4f 6e 63 65 20 69 6e 20 57 52 49 54 45 52  . Once in WRITER
2f30: 5f 46 49 4e 49 53 48 45 44 20 73 74 61 74 65 2c  _FINISHED state,
2f40: 20 69 74 20 69 73 20 0a 2a 2a 20 20 20 20 6e 6f   it is .**    no
2f50: 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6d 6f  t possible to mo
2f60: 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73  dify the databas
2f70: 65 20 66 75 72 74 68 65 72 2e 20 41 74 20 74 68  e further. At th
2f80: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 75 70  is point, the up
2f90: 70 65 72 20 0a 2a 2a 20 20 20 20 6c 61 79 65 72  per .**    layer
2fa0: 20 6d 75 73 74 20 65 69 74 68 65 72 20 63 6f 6d   must either com
2fb0: 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
2fc0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
2fd0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 41 20 77 72  .**.**    * A wr
2fe0: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
2ff0: 69 73 20 61 63 74 69 76 65 2e 0a 2a 2a 20 20 20  is active..**   
3000: 20 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20   * An EXCLUSIVE 
3010: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
3020: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
3030: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
3040: 20 20 20 20 2a 20 41 6c 6c 20 77 72 69 74 69 6e      * All writin
3050: 67 20 61 6e 64 20 73 79 6e 63 69 6e 67 20 6f 66  g and syncing of
3060: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 61 74   journal and dat
3070: 61 62 61 73 65 20 64 61 74 61 20 68 61 73 20 66  abase data has f
3080: 69 6e 69 73 68 65 64 2e 0a 2a 2a 20 20 20 20 20  inished..**     
3090: 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   If no error occ
30a0: 75 72 72 65 64 2c 20 61 6c 6c 20 74 68 61 74 20  urred, all that 
30b0: 72 65 6d 61 69 6e 73 20 69 73 20 74 6f 20 66 69  remains is to fi
30c0: 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
30d0: 61 6c 20 74 6f 0a 2a 2a 20 20 20 20 20 20 63 6f  al to.**      co
30e0: 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
30f0: 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f  tion. If an erro
3100: 72 20 64 69 64 20 6f 63 63 75 72 2c 20 74 68 65  r did occur, the
3110: 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6e 65 65   caller will nee
3120: 64 0a 2a 2a 20 20 20 20 20 20 74 6f 20 72 6f 6c  d.**      to rol
3130: 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
3140: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 20 45  ction. .**.**  E
3150: 52 52 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 54  RROR:.**.**    T
3160: 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 20 69  he ERROR state i
3170: 73 20 65 6e 74 65 72 65 64 20 77 68 65 6e 20 61  s entered when a
3180: 6e 20 49 4f 20 6f 72 20 64 69 73 6b 2d 66 75 6c  n IO or disk-ful
3190: 6c 20 65 72 72 6f 72 20 28 69 6e 63 6c 75 64 69  l error (includi
31a0: 6e 67 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f  ng.**    SQLITE_
31b0: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29 20 6f 63 63  IOERR_NOMEM) occ
31c0: 75 72 73 20 61 74 20 61 20 70 6f 69 6e 74 20 69  urs at a point i
31d0: 6e 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  n the code that 
31e0: 6d 61 6b 65 73 20 69 74 20 0a 2a 2a 20 20 20 20  makes it .**    
31f0: 64 69 66 66 69 63 75 6c 74 20 74 6f 20 62 65 20  difficult to be 
3200: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 69 6e  sure that the in
3210: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 73 74  -memory pager st
3220: 61 74 65 20 28 63 61 63 68 65 20 63 6f 6e 74 65  ate (cache conte
3230: 6e 74 73 2c 20 0a 2a 2a 20 20 20 20 64 62 20 73  nts, .**    db s
3240: 69 7a 65 20 65 74 63 2e 29 20 61 72 65 20 63 6f  ize etc.) are co
3250: 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 74 68  nsistent with th
3260: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3270: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 2a  e file-system..*
3280: 2a 0a 2a 2a 20 20 20 20 54 65 6d 70 6f 72 61 72  *.**    Temporar
3290: 79 20 70 61 67 65 72 20 66 69 6c 65 73 20 6d 61  y pager files ma
32a0: 79 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f  y enter the ERRO
32b0: 52 20 73 74 61 74 65 2c 20 62 75 74 20 69 6e 2d  R state, but in-
32c0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 73 0a 2a 2a  memory pagers.**
32d0: 20 20 20 20 63 61 6e 6e 6f 74 2e 0a 2a 2a 0a 2a      cannot..**.*
32e0: 2a 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  *    For example
32f0: 2c 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  , if an IO error
3300: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70 65   occurs while pe
3310: 72 66 6f 72 6d 69 6e 67 20 61 20 72 6f 6c 6c 62  rforming a rollb
3320: 61 63 6b 2c 20 0a 2a 2a 20 20 20 20 74 68 65 20  ack, .**    the 
3330: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
3340: 70 61 67 65 2d 63 61 63 68 65 20 6d 61 79 20 62  page-cache may b
3350: 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
3360: 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
3370: 0a 2a 2a 20 20 20 20 41 74 20 74 68 69 73 20 70  .**    At this p
3380: 6f 69 6e 74 20 69 74 20 77 6f 75 6c 64 20 62 65  oint it would be
3390: 20 64 61 6e 67 65 72 6f 75 73 20 74 6f 20 63 68   dangerous to ch
33a0: 61 6e 67 65 20 62 61 63 6b 20 74 6f 20 52 45 41  ange back to REA
33b0: 44 45 52 20 73 74 61 74 65 0a 2a 2a 20 20 20 20  DER state.**    
33c0: 28 61 73 20 75 73 75 61 6c 6c 79 20 68 61 70 70  (as usually happ
33d0: 65 6e 73 20 61 66 74 65 72 20 61 20 72 6f 6c 6c  ens after a roll
33e0: 62 61 63 6b 29 2e 20 41 6e 79 20 73 75 62 73 65  back). Any subse
33f0: 71 75 65 6e 74 20 72 65 61 64 65 72 73 20 6d 69  quent readers mi
3400: 67 68 74 0a 2a 2a 20 20 20 20 72 65 70 6f 72 74  ght.**    report
3410: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
3420: 74 69 6f 6e 20 28 64 75 65 20 74 6f 20 74 68 65  tion (due to the
3430: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61   inconsistent ca
3440: 63 68 65 29 2c 20 61 6e 64 20 69 66 0a 2a 2a 20  che), and if.** 
3450: 20 20 20 74 68 65 79 20 75 70 67 72 61 64 65 20     they upgrade 
3460: 74 6f 20 77 72 69 74 65 72 73 2c 20 74 68 65 79  to writers, they
3470: 20 6d 61 79 20 69 6e 61 64 76 65 72 74 65 6e 74   may inadvertent
3480: 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20 64  ly corrupt the d
3490: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 66 69  atabase.**    fi
34a0: 6c 65 2e 20 54 6f 20 61 76 6f 69 64 20 74 68 69  le. To avoid thi
34b0: 73 20 68 61 7a 61 72 64 2c 20 74 68 65 20 70 61  s hazard, the pa
34c0: 67 65 72 20 73 77 69 74 63 68 65 73 20 69 6e 74  ger switches int
34d0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
34e0: 65 0a 2a 2a 20 20 20 20 69 6e 73 74 65 61 64 20  e.**    instead 
34f0: 6f 66 20 52 45 41 44 45 52 20 66 6f 6c 6c 6f 77  of READER follow
3500: 69 6e 67 20 73 75 63 68 20 61 6e 20 65 72 72 6f  ing such an erro
3510: 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 6e 63 65  r..**.**    Once
3520: 20 69 74 20 68 61 73 20 65 6e 74 65 72 65 64 20   it has entered 
3530: 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2c  the ERROR state,
3540: 20 61 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   any attempt to 
3550: 75 73 65 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  use the pager.**
3560: 20 20 20 20 74 6f 20 72 65 61 64 20 6f 72 20 77      to read or w
3570: 72 69 74 65 20 64 61 74 61 20 72 65 74 75 72 6e  rite data return
3580: 73 20 61 6e 20 65 72 72 6f 72 2e 20 45 76 65 6e  s an error. Even
3590: 74 75 61 6c 6c 79 2c 20 6f 6e 63 65 20 61 6c 6c  tually, once all
35a0: 20 0a 2a 2a 20 20 20 20 6f 75 74 73 74 61 6e 64   .**    outstand
35b0: 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ing transactions
35c0: 20 68 61 76 65 20 62 65 65 6e 20 61 62 61 6e 64   have been aband
35d0: 6f 6e 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  oned, the pager 
35e0: 69 73 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 20 20  is able to.**   
35f0: 20 74 72 61 6e 73 69 74 69 6f 6e 20 62 61 63 6b   transition back
3600: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   to OPEN state, 
3610: 64 69 73 63 61 72 64 69 6e 67 20 74 68 65 20 63  discarding the c
3620: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a  ontents of the .
3630: 2a 2a 20 20 20 20 70 61 67 65 2d 63 61 63 68 65  **    page-cache
3640: 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 69   and any other i
3650: 6e 2d 6d 65 6d 6f 72 79 20 73 74 61 74 65 20 61  n-memory state a
3660: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
3670: 20 45 76 65 72 79 74 68 69 6e 67 0a 2a 2a 20 20   Everything.**  
3680: 20 20 69 73 20 72 65 6c 6f 61 64 65 64 20 66 72    is reloaded fr
3690: 6f 6d 20 64 69 73 6b 20 28 61 6e 64 2c 20 69 66  om disk (and, if
36a0: 20 6e 65 63 65 73 73 61 72 79 2c 20 68 6f 74 2d   necessary, hot-
36b0: 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
36c0: 20 70 65 66 6f 72 6d 65 64 29 0a 2a 2a 20 20 20   peformed).**   
36d0: 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74 72 61   when a read-tra
36e0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6e 65 78 74  nsaction is next
36f0: 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 70   opened on the p
3700: 61 67 65 72 20 28 74 72 61 6e 73 69 74 69 6f 6e  ager (transition
3710: 69 6e 67 0a 2a 2a 20 20 20 20 74 68 65 20 70 61  ing.**    the pa
3720: 67 65 72 20 69 6e 74 6f 20 52 45 41 44 45 52 20  ger into READER 
3730: 73 74 61 74 65 29 2e 20 41 74 20 74 68 61 74 20  state). At that 
3740: 70 6f 69 6e 74 20 74 68 65 20 73 79 73 74 65 6d  point the system
3750: 20 68 61 73 20 72 65 63 6f 76 65 72 65 64 20 0a   has recovered .
3760: 2a 2a 20 20 20 20 66 72 6f 6d 20 74 68 65 20 65  **    from the e
3770: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  rror..**.**    S
3780: 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 65  pecifically, the
3790: 20 70 61 67 65 72 20 6a 75 6d 70 73 20 69 6e 74   pager jumps int
37a0: 6f 20 74 68 65 20 45 52 52 4f 52 20 73 74 61 74  o the ERROR stat
37b0: 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  e if:.**.**     
37c0: 20 31 2e 20 41 6e 20 65 72 72 6f 72 20 6f 63 63   1. An error occ
37d0: 75 72 73 20 77 68 69 6c 65 20 61 74 74 65 6d 70  urs while attemp
37e0: 74 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ting a rollback.
37f0: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e   This happens in
3800: 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 75 6e 63  .**         func
3810: 74 69 6f 6e 20 73 71 6c 69 74 65 33 50 61 67 65  tion sqlite3Page
3820: 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 2a 2a 0a  rRollback()..**.
3830: 2a 2a 20 20 20 20 20 20 32 2e 20 41 6e 20 65 72  **      2. An er
3840: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
3850: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 66   attempting to f
3860: 69 6e 61 6c 69 7a 65 20 61 20 6a 6f 75 72 6e 61  inalize a journa
3870: 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20  l file.**       
3880: 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 63 6f    following a co
3890: 6d 6d 69 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e  mmit in function
38a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
38b0: 6d 69 74 50 68 61 73 65 54 77 6f 28 29 2e 0a 2a  mitPhaseTwo()..*
38c0: 2a 0a 2a 2a 20 20 20 20 20 20 33 2e 20 41 6e 20  *.**      3. An 
38d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
38e0: 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  le attempting to
38f0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
3900: 75 72 6e 61 6c 20 6f 72 0a 2a 2a 20 20 20 20 20  urnal or.**     
3910: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
3920: 65 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 70 61  e in function pa
3930: 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 6f  gerStress() in o
3940: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 0a  rder to free up.
3950: 2a 2a 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72  **         memor
3960: 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 49 6e 20 6f  y..**.**    In o
3970: 74 68 65 72 20 63 61 73 65 73 2c 20 74 68 65 20  ther cases, the 
3980: 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
3990: 64 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20  d to the b-tree 
39a0: 6c 61 79 65 72 2e 20 54 68 65 20 62 2d 74 72 65  layer. The b-tre
39b0: 65 0a 2a 2a 20 20 20 20 6c 61 79 65 72 20 74 68  e.**    layer th
39c0: 65 6e 20 61 74 74 65 6d 70 74 73 20 61 20 72 6f  en attempts a ro
39d0: 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
39e0: 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 63  . If the error c
39f0: 6f 6e 64 69 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  ondition .**    
3a00: 70 65 72 73 69 73 74 73 2c 20 74 68 65 20 70 61  persists, the pa
3a10: 67 65 72 20 65 6e 74 65 72 73 20 74 68 65 20 45  ger enters the E
3a20: 52 52 4f 52 20 73 74 61 74 65 20 76 69 61 20 63  RROR state via c
3a30: 6f 6e 64 69 74 69 6f 6e 20 28 31 29 20 61 62 6f  ondition (1) abo
3a40: 76 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 6f 6e  ve..**.**    Con
3a50: 64 69 74 69 6f 6e 20 28 33 29 20 69 73 20 6e 65  dition (3) is ne
3a60: 63 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20  cessary because 
3a70: 69 74 20 63 61 6e 20 62 65 20 74 72 69 67 67 65  it can be trigge
3a80: 72 65 64 20 62 79 20 61 20 72 65 61 64 2d 6f 6e  red by a read-on
3a90: 6c 79 0a 2a 2a 20 20 20 20 73 74 61 74 65 6d 65  ly.**    stateme
3aa0: 6e 74 20 65 78 65 63 75 74 65 64 20 77 69 74 68  nt executed with
3ab0: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
3ac0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
3ad0: 69 66 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  if the error.** 
3ae0: 20 20 20 63 6f 64 65 20 77 65 72 65 20 73 69 6d     code were sim
3af0: 70 6c 79 20 72 65 74 75 72 6e 65 64 20 74 6f 20  ply returned to 
3b00: 74 68 65 20 75 73 65 72 2c 20 74 68 65 20 62 2d  the user, the b-
3b10: 74 72 65 65 20 6c 61 79 65 72 20 77 6f 75 6c 64  tree layer would
3b20: 20 6e 6f 74 0a 2a 2a 20 20 20 20 61 75 74 6f 6d   not.**    autom
3b30: 61 74 69 63 61 6c 6c 79 20 61 74 74 65 6d 70 74  atically attempt
3b40: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20   a rollback, as 
3b50: 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  it assumes that 
3b60: 61 6e 20 65 72 72 6f 72 20 69 6e 20 61 0a 2a 2a  an error in a.**
3b70: 20 20 20 20 72 65 61 64 2d 6f 6e 6c 79 20 73 74      read-only st
3b80: 61 74 65 6d 65 6e 74 20 63 61 6e 6e 6f 74 20 6c  atement cannot l
3b90: 65 61 76 65 20 74 68 65 20 70 61 67 65 72 20 69  eave the pager i
3ba0: 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 20  n an internally 
3bb0: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 0a 2a 2a  inconsistent .**
3bc0: 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a      state..**.**
3bd0: 20 20 20 20 2a 20 54 68 65 20 50 61 67 65 72 2e      * The Pager.
3be0: 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
3bf0: 20 69 73 20 73 65 74 20 74 6f 20 73 6f 6d 65 74   is set to somet
3c00: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
3c10: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 20 20  SQLITE_OK..**   
3c20: 20 2a 20 54 68 65 72 65 20 61 72 65 20 6f 6e 65   * There are one
3c30: 20 6f 72 20 6d 6f 72 65 20 6f 75 74 73 74 61 6e   or more outstan
3c40: 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
3c50: 74 6f 20 70 61 67 65 73 20 28 61 66 74 65 72 20  to pages (after 
3c60: 74 68 65 0a 2a 2a 20 20 20 20 20 20 6c 61 73 74  the.**      last
3c70: 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 64 72   reference is dr
3c80: 6f 70 70 65 64 20 74 68 65 20 70 61 67 65 72 20  opped the pager 
3c90: 73 68 6f 75 6c 64 20 6d 6f 76 65 20 62 61 63 6b  should move back
3ca0: 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65 29 2e   to OPEN state).
3cb0: 0a 2a 2a 20 20 20 20 2a 20 54 68 65 20 70 61 67  .**    * The pag
3cc0: 65 72 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 2d  er is not an in-
3cd0: 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a 2a 2a  memory pager..**
3ce0: 20 20 20 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 73      .**.** Notes
3cf0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 20 70 61  :.**.**   * A pa
3d00: 67 65 72 20 69 73 20 6e 65 76 65 72 20 69 6e 20  ger is never in 
3d10: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 6f 72 20  WRITER_DBMOD or 
3d20: 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 20  WRITER_FINISHED 
3d30: 73 74 61 74 65 20 69 66 20 74 68 65 0a 2a 2a 20  state if the.** 
3d40: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69      connection i
3d50: 73 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f  s open in WAL mo
3d60: 64 65 2e 20 41 20 57 41 4c 20 63 6f 6e 6e 65 63  de. A WAL connec
3d70: 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69  tion is always i
3d80: 6e 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 6f 66 20  n one.**     of 
3d90: 74 68 65 20 66 69 72 73 74 20 66 6f 75 72 20 73  the first four s
3da0: 74 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  tates..**.**   *
3db0: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 61 20 63 6f 6e   Normally, a con
3dc0: 6e 65 63 74 69 6f 6e 20 6f 70 65 6e 20 69 6e 20  nection open in 
3dd0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 69  exclusive mode i
3de0: 73 20 6e 65 76 65 72 20 69 6e 20 50 41 47 45 52  s never in PAGER
3df0: 5f 4f 50 45 4e 0a 2a 2a 20 20 20 20 20 73 74 61  _OPEN.**     sta
3e00: 74 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  te. There are tw
3e10: 6f 20 65 78 63 65 70 74 69 6f 6e 73 3a 20 69 6d  o exceptions: im
3e20: 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
3e30: 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 68  exclusive-mode h
3e40: 61 73 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 74  as.**     been t
3e50: 75 72 6e 65 64 20 6f 6e 20 28 61 6e 64 20 62 65  urned on (and be
3e60: 66 6f 72 65 20 61 6e 79 20 72 65 61 64 20 6f 72  fore any read or
3e70: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
3e80: 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 20 20 20 20  ons are .**     
3e90: 65 78 65 63 75 74 65 64 29 2c 20 61 6e 64 20 77  executed), and w
3ea0: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
3eb0: 20 6c 65 61 76 69 6e 67 20 74 68 65 20 22 65 72   leaving the "er
3ec0: 72 6f 72 20 73 74 61 74 65 22 2e 0a 2a 2a 0a 2a  ror state"..**.*
3ed0: 2a 20 20 20 2a 20 53 65 65 20 61 6c 73 6f 3a 20  *   * See also: 
3ee0: 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
3ef0: 74 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  te()..*/.#define
3f00: 20 50 41 47 45 52 5f 4f 50 45 4e 20 20 20 20 20   PAGER_OPEN     
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 23               0.#
3f20: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52 45 41  define PAGER_REA
3f30: 44 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20  DER             
3f40: 20 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41 47     1.#define PAG
3f50: 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44  ER_WRITER_LOCKED
3f60: 20 20 20 20 20 20 20 20 20 32 0a 23 64 65 66 69           2.#defi
3f70: 6e 65 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f  ne PAGER_WRITER_
3f80: 43 41 43 48 45 4d 4f 44 20 20 20 20 20 20 20 33  CACHEMOD       3
3f90: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 57  .#define PAGER_W
3fa0: 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20 20  RITER_DBMOD     
3fb0: 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20 50       4.#define P
3fc0: 41 47 45 52 5f 57 52 49 54 45 52 5f 46 49 4e 49  AGER_WRITER_FINI
3fd0: 53 48 45 44 20 20 20 20 20 20 20 35 0a 23 64 65  SHED       5.#de
3fe0: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 4f 52  fine PAGER_ERROR
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 20 36 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 50 61   6../*.** The Pa
4010: 67 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62  ger.eLock variab
4020: 6c 65 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  le is almost alw
4030: 61 79 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6f  ays set to one o
4040: 66 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  f the .** follow
4050: 69 6e 67 20 6c 6f 63 6b 69 6e 67 2d 73 74 61 74  ing locking-stat
4060: 65 73 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  es, according to
4070: 20 74 68 65 20 6c 6f 63 6b 20 63 75 72 72 65 6e   the lock curren
4080: 74 6c 79 20 68 65 6c 64 20 6f 6e 0a 2a 2a 20 74  tly held on.** t
4090: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
40a0: 3a 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45  : NO_LOCK, SHARE
40b0: 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
40c0: 5f 4c 4f 43 4b 20 6f 72 20 45 58 43 4c 55 53 49  _LOCK or EXCLUSI
40d0: 56 45 5f 4c 4f 43 4b 2e 0a 2a 2a 20 54 68 69 73  VE_LOCK..** This
40e0: 20 76 61 72 69 61 62 6c 65 20 69 73 20 6b 65 70   variable is kep
40f0: 74 20 75 70 20 74 6f 20 64 61 74 65 20 61 73 20  t up to date as 
4100: 6c 6f 63 6b 73 20 61 72 65 20 74 61 6b 65 6e 20  locks are taken 
4110: 61 6e 64 20 72 65 6c 65 61 73 65 64 20 62 79 0a  and released by.
4120: 2a 2a 20 74 68 65 20 70 61 67 65 72 4c 6f 63 6b  ** the pagerLock
4130: 44 62 28 29 20 61 6e 64 20 70 61 67 65 72 55 6e  Db() and pagerUn
4140: 6c 6f 63 6b 44 62 28 29 20 77 72 61 70 70 65 72  lockDb() wrapper
4150: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
4160: 56 46 53 20 78 4c 6f 63 6b 28 29 20 6f 72 20 78  VFS xLock() or x
4170: 55 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73  Unlock() returns
4180: 20 61 6e 20 65 72 72 6f 72 20 6f 74 68 65 72 20   an error other 
4190: 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  than SQLITE_BUSY
41a0: 0a 2a 2a 20 28 69 2e 65 2e 20 6f 6e 65 20 6f 66  .** (i.e. one of
41b0: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 45 52   the SQLITE_IOER
41c0: 52 20 73 75 62 74 79 70 65 73 29 2c 20 69 74 20  R subtypes), it 
41d0: 69 73 20 6e 6f 74 20 63 6c 65 61 72 20 77 68 65  is not clear whe
41e0: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74  ther or not.** t
41f0: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 77 61 73  he operation was
4200: 20 73 75 63 63 65 73 73 66 75 6c 2e 20 49 6e 20   successful. In 
4210: 74 68 65 73 65 20 63 69 72 63 75 6d 73 74 61 6e  these circumstan
4220: 63 65 73 20 70 61 67 65 72 4c 6f 63 6b 44 62 28  ces pagerLockDb(
4230: 29 20 61 6e 64 0a 2a 2a 20 70 61 67 65 72 55 6e  ) and.** pagerUn
4240: 6c 6f 63 6b 44 62 28 29 20 74 61 6b 65 20 61 20  lockDb() take a 
4250: 63 6f 6e 73 65 72 76 61 74 69 76 65 20 61 70 70  conservative app
4260: 72 6f 61 63 68 20 2d 20 65 4c 6f 63 6b 20 69 73  roach - eLock is
4270: 20 61 6c 77 61 79 73 20 75 70 64 61 74 65 64 0a   always updated.
4280: 2a 2a 20 77 68 65 6e 20 75 6e 6c 6f 63 6b 69 6e  ** when unlockin
4290: 67 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64 20  g the file, and 
42a0: 6f 6e 6c 79 20 75 70 64 61 74 65 64 20 77 68 65  only updated whe
42b0: 6e 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 66 69  n locking the fi
42c0: 6c 65 20 69 66 20 74 68 65 0a 2a 2a 20 56 46 53  le if the.** VFS
42d0: 20 63 61 6c 6c 20 69 73 20 73 75 63 63 65 73 73   call is success
42e0: 66 75 6c 2e 20 54 68 69 73 20 77 61 79 2c 20 74  ful. This way, t
42f0: 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20 76  he Pager.eLock v
4300: 61 72 69 61 62 6c 65 20 6d 61 79 20 62 65 20 73  ariable may be s
4310: 65 74 0a 2a 2a 20 74 6f 20 61 20 6c 65 73 73 20  et.** to a less 
4320: 65 78 63 6c 75 73 69 76 65 20 28 6c 6f 77 65 72  exclusive (lower
4330: 29 20 76 61 6c 75 65 20 74 68 61 6e 20 74 68 65  ) value than the
4340: 20 6c 6f 63 6b 20 74 68 61 74 20 69 73 20 61 63   lock that is ac
4350: 74 75 61 6c 6c 79 20 68 65 6c 64 0a 2a 2a 20 61  tually held.** a
4360: 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
4370: 65 6c 2c 20 62 75 74 20 69 74 20 69 73 20 6e 65  el, but it is ne
4380: 76 65 72 20 73 65 74 20 74 6f 20 61 20 6d 6f 72  ver set to a mor
4390: 65 20 65 78 63 6c 75 73 69 76 65 20 76 61 6c 75  e exclusive valu
43a0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  e..**.** This is
43b0: 20 75 73 75 61 6c 6c 79 20 73 61 66 65 2e 20 49   usually safe. I
43c0: 66 20 61 6e 20 78 55 6e 6c 6f 63 6b 20 66 61 69  f an xUnlock fai
43d0: 6c 73 20 6f 72 20 61 70 70 65 61 72 73 20 74 6f  ls or appears to
43e0: 20 66 61 69 6c 2c 20 74 68 65 72 65 20 6d 61 79   fail, there may
43f0: 20 0a 2a 2a 20 62 65 20 61 20 66 65 77 20 72 65   .** be a few re
4400: 64 75 6e 64 61 6e 74 20 78 4c 6f 63 6b 28 29 20  dundant xLock() 
4410: 63 61 6c 6c 73 20 6f 72 20 61 20 6c 6f 63 6b 20  calls or a lock 
4420: 6d 61 79 20 62 65 20 68 65 6c 64 20 66 6f 72 20  may be held for 
4430: 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 2a 2a 20 72  longer than.** r
4440: 65 71 75 69 72 65 64 2c 20 62 75 74 20 6e 6f 74  equired, but not
4450: 68 69 6e 67 20 72 65 61 6c 6c 79 20 67 6f 65 73  hing really goes
4460: 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68   wrong..**.** Th
4470: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77  e exception is w
4480: 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
4490: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
44a0: 64 20 61 73 20 74 68 65 20 70 61 67 65 72 20 6d  d as the pager m
44b0: 6f 76 65 73 0a 2a 2a 20 66 72 6f 6d 20 45 52 52  oves.** from ERR
44c0: 4f 52 20 74 6f 20 4f 50 45 4e 20 73 74 61 74 65  OR to OPEN state
44d0: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
44e0: 74 68 65 72 65 20 6d 61 79 20 62 65 20 61 20 68  there may be a h
44f0: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
4500: 0a 2a 2a 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  .** in the file-
4510: 73 79 73 74 65 6d 20 74 68 61 74 20 6e 65 65 64  system that need
4520: 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
4530: 61 63 6b 20 28 61 73 20 70 61 72 74 20 6f 66 20  ack (as part of 
4540: 61 6e 20 4f 50 45 4e 2d 3e 53 48 41 52 45 44 0a  an OPEN->SHARED.
4550: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2c 20 62  ** transition, b
4560: 79 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  y the same pager
4570: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 29 2e 20   or any other). 
4580: 49 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78  If the call to x
4590: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 66 61 69 6c  Unlock().** fail
45a0: 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
45b0: 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
45c0: 20 6c 65 66 74 20 68 6f 6c 64 69 6e 67 20 61 6e   left holding an
45d0: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
45e0: 20 74 68 69 73 0a 2a 2a 20 63 61 6e 20 63 6f 6e   this.** can con
45f0: 66 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  fuse the call to
4600: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4610: 6f 63 6b 28 29 20 63 61 6c 6c 20 6d 61 64 65 20  ock() call made 
4620: 6c 61 74 65 72 20 61 73 20 70 61 72 74 0a 2a 2a  later as part.**
4630: 20 6f 66 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   of hot-journal 
4640: 64 65 74 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  detection..**.**
4650: 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
4660: 6f 63 6b 28 29 20 69 73 20 64 65 66 69 6e 65 64  ock() is defined
4670: 20 61 73 20 72 65 74 75 72 6e 69 6e 67 20 74 72   as returning tr
4680: 75 65 20 22 69 66 20 74 68 65 72 65 20 69 73 20  ue "if there is 
4690: 61 20 52 45 53 45 52 56 45 44 20 0a 2a 2a 20 6c  a RESERVED .** l
46a0: 6f 63 6b 20 68 65 6c 64 20 62 79 20 74 68 69 73  ock held by this
46b0: 20 70 72 6f 63 65 73 73 20 6f 72 20 61 6e 79 20   process or any 
46c0: 6f 74 68 65 72 73 22 2e 20 53 6f 20 78 43 68 65  others". So xChe
46d0: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
46e0: 61 79 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 72  ay .** return tr
46f0: 75 65 20 62 65 63 61 75 73 65 20 74 68 65 20 63  ue because the c
4700: 61 6c 6c 65 72 20 69 74 73 65 6c 66 20 69 73 20  aller itself is 
4710: 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  holding an EXCLU
4720: 53 49 56 45 20 6c 6f 63 6b 20 28 62 75 74 0a 2a  SIVE lock (but.*
4730: 2a 20 64 6f 65 73 6e 27 74 20 6b 6e 6f 77 20 69  * doesn't know i
4740: 74 20 62 65 63 61 75 73 65 20 6f 66 20 61 20 70  t because of a p
4750: 72 65 76 69 6f 75 73 20 65 72 72 6f 72 20 69 6e  revious error in
4760: 20 78 55 6e 6c 6f 63 6b 29 2e 20 49 66 20 74 68   xUnlock). If th
4770: 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 61 20  is happens.** a 
4780: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot-journal may 
4790: 62 65 20 6d 69 73 74 61 6b 65 6e 20 66 6f 72 20  be mistaken for 
47a0: 61 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e 67 20  a journal being 
47b0: 63 72 65 61 74 65 64 20 62 79 20 61 6e 20 61 63  created by an ac
47c0: 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
47d0: 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20 70  ion in another p
47e0: 72 6f 63 65 73 73 2c 20 63 61 75 73 69 6e 67 20  rocess, causing 
47f0: 53 51 4c 69 74 65 20 74 6f 20 72 65 61 64 20 66  SQLite to read f
4800: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
4810: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 72 6f 6c 6c  .** without roll
4820: 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  ing it back..**.
4830: 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ** To work aroun
4840: 64 20 74 68 69 73 2c 20 69 66 20 61 20 63 61 6c  d this, if a cal
4850: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 20 66  l to xUnlock() f
4860: 61 69 6c 73 20 77 68 65 6e 20 75 6e 6c 6f 63 6b  ails when unlock
4870: 69 6e 67 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ing the.** datab
4880: 61 73 65 20 69 6e 20 74 68 65 20 45 52 52 4f 52  ase in the ERROR
4890: 20 73 74 61 74 65 2c 20 50 61 67 65 72 2e 65 4c   state, Pager.eL
48a0: 6f 63 6b 20 69 73 20 73 65 74 20 74 6f 20 55 4e  ock is set to UN
48b0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 49 74 0a 2a  KNOWN_LOCK. It.*
48c0: 2a 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65  * is only change
48d0: 64 20 62 61 63 6b 20 74 6f 20 61 20 72 65 61 6c  d back to a real
48e0: 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65 20 61   locking state a
48f0: 66 74 65 72 20 61 20 73 75 63 63 65 73 73 66 75  fter a successfu
4900: 6c 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 78 4c 6f  l call.** to xLo
4910: 63 6b 28 45 58 43 4c 55 53 49 56 45 29 2e 20 41  ck(EXCLUSIVE). A
4920: 6c 73 6f 2c 20 74 68 65 20 63 6f 64 65 20 74 6f  lso, the code to
4930: 20 64 6f 20 74 68 65 20 4f 50 45 4e 2d 3e 53 48   do the OPEN->SH
4940: 41 52 45 44 20 73 74 61 74 65 20 74 72 61 6e 73  ARED state trans
4950: 69 74 69 6f 6e 0a 2a 2a 20 6f 6d 69 74 73 20 74  ition.** omits t
4960: 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68  he check for a h
4970: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 50 61  ot-journal if Pa
4980: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
4990: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
49a0: 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 6e 73 74 65   .** lock. Inste
49b0: 61 64 2c 20 69 74 20 61 73 73 75 6d 65 73 20 61  ad, it assumes a
49c0: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 65 78 69   hot-journal exi
49d0: 73 74 73 20 61 6e 64 20 6f 62 74 61 69 6e 73 20  sts and obtains 
49e0: 61 6e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  an EXCLUSIVE.** 
49f0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
4a00: 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65  base file before
4a10: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 72   attempting to r
4a20: 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 53 65 65  oll it back. See
4a30: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 50 61 67   function.** Pag
4a40: 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 66  erSharedLock() f
4a50: 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 2e 0a  or more detail..
4a60: 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 4c 6f 63  **.** Pager.eLoc
4a70: 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 73 65  k may only be se
4a80: 74 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43  t to UNKNOWN_LOC
4a90: 4b 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  K when the pager
4aa0: 20 69 73 20 69 6e 20 0a 2a 2a 20 50 41 47 45 52   is in .** PAGER
4ab0: 5f 4f 50 45 4e 20 73 74 61 74 65 2e 0a 2a 2f 0a  _OPEN state..*/.
4ac0: 23 64 65 66 69 6e 65 20 55 4e 4b 4e 4f 57 4e 5f  #define UNKNOWN_
4ad0: 4c 4f 43 4b 20 20 20 20 20 20 20 20 20 20 20 20  LOCK            
4ae0: 20 20 20 20 28 45 58 43 4c 55 53 49 56 45 5f 4c      (EXCLUSIVE_L
4af0: 4f 43 4b 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 41 20  OCK+1)../*.** A 
4b00: 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69  macro used for i
4b10: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65  nvoking the code
4b20: 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  c if there is on
4b30: 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e.*/.#ifdef SQLI
4b40: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64  TE_HAS_CODEC.# d
4b50: 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44  efine CODEC1(P,D
4b60: 2c 4e 2c 58 2c 45 29 20 5c 0a 20 20 20 20 69 66  ,N,X,E) \.    if
4b70: 28 20 50 2d 3e 78 43 6f 64 65 63 20 26 26 20 50  ( P->xCodec && P
4b80: 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64  ->xCodec(P->pCod
4b90: 65 63 2c 44 2c 4e 2c 58 29 3d 3d 30 20 29 7b 20  ec,D,N,X)==0 ){ 
4ba0: 45 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f  E; }.# define CO
4bb0: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f  DEC2(P,D,N,X,E,O
4bc0: 29 20 5c 0a 20 20 20 20 69 66 28 20 50 2d 3e 78  ) \.    if( P->x
4bd0: 43 6f 64 65 63 3d 3d 30 20 29 7b 20 4f 3d 28 63  Codec==0 ){ O=(c
4be0: 68 61 72 2a 29 44 3b 20 7d 65 6c 73 65 20 5c 0a  har*)D; }else \.
4bf0: 20 20 20 20 69 66 28 20 28 4f 3d 28 63 68 61 72      if( (O=(char
4c00: 2a 29 28 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  *)(P->xCodec(P->
4c10: 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29 29 29 3d  pCodec,D,N,X)))=
4c20: 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 65 6c 73 65  =0 ){ E; }.#else
4c30: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31  .# define CODEC1
4c40: 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 20 20 2f 2a  (P,D,N,X,E)   /*
4c50: 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69   NO-OP */.# defi
4c60: 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c  ne CODEC2(P,D,N,
4c70: 58 2c 45 2c 4f 29 20 4f 3d 28 63 68 61 72 2a 29  X,E,O) O=(char*)
4c80: 44 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  D.#endif../*.** 
4c90: 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  The maximum allo
4ca0: 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  wed sector size.
4cb0: 20 36 34 4b 69 42 2e 20 49 66 20 74 68 65 20 78   64KiB. If the x
4cc0: 53 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74  Sectorsize() met
4cd0: 68 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20  hod .** returns 
4ce0: 61 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74  a value larger t
4cf0: 68 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d  han this, then M
4d00: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69  AX_SECTOR_SIZE i
4d10: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
4d20: 2a 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f  ** This could co
4d30: 6e 63 65 69 76 61 62 6c 79 20 63 61 75 73 65 20  nceivably cause 
4d40: 63 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f  corruption follo
4d50: 77 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69  wing a power fai
4d60: 6c 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20  lure on.** such 
4d70: 61 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69  a system. This i
4d80: 73 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75  s currently an u
4d90: 6e 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69  ndocumented limi
4da0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41  t..*/.#define MA
4db0: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78  X_SECTOR_SIZE 0x
4dc0: 31 30 30 30 30 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e  10000.../*.** An
4dd0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4de0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
4df0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
4e00: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
4e10: 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61  e.** savepoint a
4e20: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  nd statement tra
4e30: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
4e40: 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68  system. All such
4e50: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61   structures.** a
4e60: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
4e70: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
4e80: 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68  t[] array, which
4e90: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
4ea0: 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69  d.** resized usi
4eb0: 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  ng sqlite3Reallo
4ec0: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  c()..**.** When 
4ed0: 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63  a savepoint is c
4ee0: 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65  reated, the Page
4ef0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
4f00: 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a  ffset field is.*
4f10: 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61  * set to 0. If a
4f20: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
4f30: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
4f40: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
4f50: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61   while.** the sa
4f60: 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
4f70: 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73  e, then iHdrOffs
4f80: 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
4f90: 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a   byte offset .**
4fa0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
4fb0: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
4fc0: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
4fd0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
4fe0: 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
4ff0: 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e  before the journ
5000: 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20  al-header. This 
5010: 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69  is required duri
5020: 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  ng savepoint.** 
5030: 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61  rollback (see pa
5040: 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
5050: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65  oint())..*/.type
5060: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
5070: 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53  Savepoint PagerS
5080: 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74  avepoint;.struct
5090: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
50a0: 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  {.  i64 iOffset;
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66   /* Starting off
50d0: 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72  set in main jour
50e0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
50f0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
5100: 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
5110: 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ve */.  Bitvec *
5120: 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  pInSavepoint;   
5130: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70       /* Set of p
5140: 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76  ages in this sav
5150: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f  epoint */.  Pgno
5160: 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20   nOrig;         
5170: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
5180: 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  inal number of p
5190: 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a  ages in file */.
51a0: 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20    Pgno iSubRec; 
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51c0: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
51d0: 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a   record in sub-j
51e0: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65  ournal */.#ifnde
51f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
5200: 4c 0a 20 20 75 33 32 20 61 57 61 6c 44 61 74 61  L.  u32 aWalData
5210: 5b 57 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e  [WAL_SAVEPOINT_N
5220: 44 41 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a  DATA];        /*
5230: 20 57 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63   WAL savepoint c
5240: 6f 6e 74 65 78 74 20 2a 2f 0a 23 65 6e 64 69 66  ontext */.#endif
5250: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 73 20  .};../*.** Bits 
5260: 6f 66 20 74 68 65 20 50 61 67 65 72 2e 64 6f 4e  of the Pager.doN
5270: 6f 74 53 70 69 6c 6c 20 66 6c 61 67 2e 20 20 53  otSpill flag.  S
5280: 65 65 20 66 75 72 74 68 65 72 20 64 65 73 63 72  ee further descr
5290: 69 70 74 69 6f 6e 20 62 65 6c 6f 77 2e 0a 2a 2f  iption below..*/
52a0: 0a 23 64 65 66 69 6e 65 20 53 50 49 4c 4c 46 4c  .#define SPILLFL
52b0: 41 47 5f 4f 46 46 20 20 20 20 20 20 20 20 20 30  AG_OFF         0
52c0: 78 30 31 20 2f 2a 20 4e 65 76 65 72 20 73 70 69  x01 /* Never spi
52d0: 6c 6c 20 63 61 63 68 65 2e 20 20 53 65 74 20 76  ll cache.  Set v
52e0: 69 61 20 70 72 61 67 6d 61 20 2a 2f 0a 23 64 65  ia pragma */.#de
52f0: 66 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 52  fine SPILLFLAG_R
5300: 4f 4c 4c 42 41 43 4b 20 20 20 20 30 78 30 32 20  OLLBACK    0x02 
5310: 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 6c 6c 69  /* Current rolli
5320: 6e 67 20 62 61 63 6b 2c 20 73 6f 20 64 6f 20 6e  ng back, so do n
5330: 6f 74 20 73 70 69 6c 6c 20 2a 2f 0a 23 64 65 66  ot spill */.#def
5340: 69 6e 65 20 53 50 49 4c 4c 46 4c 41 47 5f 4e 4f  ine SPILLFLAG_NO
5350: 53 59 4e 43 20 20 20 20 20 20 30 78 30 34 20 2f  SYNC      0x04 /
5360: 2a 20 53 70 69 6c 6c 20 69 73 20 6f 6b 2c 20 62  * Spill is ok, b
5370: 75 74 20 64 6f 20 6e 6f 74 20 73 79 6e 63 20 2a  ut do not sync *
5380: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 70 65 6e  /../*.** An open
5390: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61   page cache is a
53a0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 73 74  n instance of st
53b0: 72 75 63 74 20 50 61 67 65 72 2e 20 41 20 64 65  ruct Pager. A de
53c0: 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20  scription of.** 
53d0: 73 6f 6d 65 20 6f 66 20 74 68 65 20 6d 6f 72 65  some of the more
53e0: 20 69 6d 70 6f 72 74 61 6e 74 20 6d 65 6d 62 65   important membe
53f0: 72 20 76 61 72 69 61 62 6c 65 73 20 66 6f 6c 6c  r variables foll
5400: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 65 53 74 61 74  ows:.**.** eStat
5410: 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 63 75  e.**.**   The cu
5420: 72 72 65 6e 74 20 27 73 74 61 74 65 27 20 6f 66  rrent 'state' of
5430: 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63   the pager objec
5440: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
5450: 6e 74 20 61 6e 64 20 73 74 61 74 65 0a 2a 2a 20  nt and state.** 
5460: 20 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20    diagram above 
5470: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
5480: 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 73  n of the pager s
5490: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 65 4c 6f 63  tate..**.** eLoc
54a0: 6b 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20  k.**.**   For a 
54b0: 72 65 61 6c 20 6f 6e 2d 64 69 73 6b 20 64 61 74  real on-disk dat
54c0: 61 62 61 73 65 2c 20 74 68 65 20 63 75 72 72 65  abase, the curre
54d0: 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  nt lock held on 
54e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
54f0: 65 20 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b  e -.**   NO_LOCK
5500: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52  , SHARED_LOCK, R
5510: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6f 72 20  ESERVED_LOCK or 
5520: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a  EXCLUSIVE_LOCK..
5530: 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 61 20 74 65  **.**   For a te
5540: 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65  mporary or in-me
5550: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 28 6e  mory database (n
5560: 65 69 74 68 65 72 20 6f 66 20 77 68 69 63 68 20  either of which 
5570: 72 65 71 75 69 72 65 20 61 6e 79 0a 2a 2a 20 20  require any.**  
5580: 20 6c 6f 63 6b 73 29 2c 20 74 68 69 73 20 76 61   locks), this va
5590: 72 69 61 62 6c 65 20 69 73 20 61 6c 77 61 79 73  riable is always
55a0: 20 73 65 74 20 74 6f 20 45 58 43 4c 55 53 49 56   set to EXCLUSIV
55b0: 45 5f 4c 4f 43 4b 2e 20 53 69 6e 63 65 20 73 75  E_LOCK. Since su
55c0: 63 68 0a 2a 2a 20 20 20 64 61 74 61 62 61 73 65  ch.**   database
55d0: 73 20 61 6c 77 61 79 73 20 68 61 76 65 20 50 61  s always have Pa
55e0: 67 65 72 2e 65 78 63 6c 75 73 69 76 65 4d 6f 64  ger.exclusiveMod
55f0: 65 3d 3d 31 2c 20 74 68 69 73 20 74 72 69 63 6b  e==1, this trick
5600: 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 20  s the pager.**  
5610: 20 6c 6f 67 69 63 20 69 6e 74 6f 20 74 68 69 6e   logic into thin
5620: 6b 69 6e 67 20 74 68 61 74 20 69 74 20 61 6c 72  king that it alr
5630: 65 61 64 79 20 68 61 73 20 61 6c 6c 20 74 68 65  eady has all the
5640: 20 6c 6f 63 6b 73 20 69 74 20 77 69 6c 6c 20 65   locks it will e
5650: 76 65 72 0a 2a 2a 20 20 20 6e 65 65 64 20 28 61  ver.**   need (a
5660: 6e 64 20 6e 6f 20 72 65 61 73 6f 6e 20 74 6f 20  nd no reason to 
5670: 72 65 6c 65 61 73 65 20 74 68 65 6d 29 2e 0a 2a  release them)..*
5680: 2a 0a 2a 2a 20 20 20 49 6e 20 73 6f 6d 65 20 28  *.**   In some (
5690: 6f 62 73 63 75 72 65 29 20 63 69 72 63 75 6d 73  obscure) circums
56a0: 74 61 6e 63 65 73 2c 20 74 68 69 73 20 76 61 72  tances, this var
56b0: 69 61 62 6c 65 20 6d 61 79 20 61 6c 73 6f 20 62  iable may also b
56c0: 65 20 73 65 74 20 74 6f 0a 2a 2a 20 20 20 55 4e  e set to.**   UN
56d0: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 2e 20 53 65 65 20  KNOWN_LOCK. See 
56e0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  the comment abov
56f0: 65 20 74 68 65 20 23 64 65 66 69 6e 65 20 6f 66  e the #define of
5700: 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
5710: 72 0a 2a 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a  r.**   details..
5720: 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e  **.** changeCoun
5730: 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  tDone.**.**   Th
5740: 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  is boolean varia
5750: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ble is used to m
5760: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
5770: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
5780: 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79   .**   (the 4-by
5790: 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  te header field 
57a0: 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32  at byte offset 2
57b0: 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  4 of the databas
57c0: 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20  e file) is .**  
57d0: 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72   not updated mor
57e0: 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63  e often than nec
57f0: 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20  essary. .**.**  
5800: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72   It is set to tr
5810: 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e  ue when the chan
5820: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
5830: 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69   is updated, whi
5840: 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c  ch .**   can onl
5850: 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65  y happen if an e
5860: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
5870: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
5880: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
5890: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28   It is cleared (
58a0: 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68  set to false) wh
58b0: 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73  enever an exclus
58c0: 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  ive lock is .** 
58d0: 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f    relinquished o
58e0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
58f0: 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61  ile. Each time a
5900: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
5910: 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20  committed,.**   
5920: 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  The changeCountD
5930: 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70  one flag is insp
5940: 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20  ected. If it is 
5950: 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f  true, the work o
5960: 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20  f.**   updating 
5970: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
5980: 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f  er is omitted fo
5990: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  r the current tr
59a0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
59b0: 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73     This mechanis
59c0: 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65  m means that whe
59d0: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  n running in exc
59e0: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63  lusive mode, a c
59f0: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  onnection .**   
5a00: 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65  need only update
5a10: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
5a20: 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68  ter once, for th
5a30: 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74  e first transact
5a40: 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74  ion.**   committ
5a50: 65 64 2e 0a 2a 2a 0a 2a 2a 20 73 65 74 4d 61 73  ed..**.** setMas
5a60: 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e  ter.**.**   When
5a70: 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73   PagerCommitPhas
5a80: 65 4f 6e 65 28 29 20 69 73 20 63 61 6c 6c 65 64  eOne() is called
5a90: 20 74 6f 20 63 6f 6d 6d 69 74 20 61 20 74 72 61   to commit a tra
5aa0: 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79  nsaction, it may
5ab0: 0a 2a 2a 20 20 20 28 6f 72 20 6d 61 79 20 6e 6f  .**   (or may no
5ac0: 74 29 20 73 70 65 63 69 66 79 20 61 20 6d 61 73  t) specify a mas
5ad0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
5ae0: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
5af0: 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 6a 6f  nto the .**   jo
5b00: 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
5b10: 65 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 74  e it is synced t
5b20: 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  o disk..**.**   
5b30: 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
5b40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
5b50: 6e 74 61 69 6e 73 20 61 20 6d 61 73 74 65 72 2d  ntains a master-
5b60: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
5b70: 61 66 66 65 63 74 73 20 0a 2a 2a 20 20 20 74 68  affects .**   th
5b80: 65 20 77 61 79 20 69 6e 20 77 68 69 63 68 20 74  e way in which t
5b90: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ba0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 61 66 74  is finalized aft
5bb0: 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  er the transacti
5bc0: 6f 6e 20 69 73 20 0a 2a 2a 20 20 20 63 6f 6d 6d  on is .**   comm
5bd0: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
5be0: 62 61 63 6b 20 77 68 65 6e 20 72 75 6e 6e 69 6e  back when runnin
5bf0: 67 20 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  g in "journal_mo
5c00: 64 65 3d 50 45 52 53 49 53 54 22 20 6d 6f 64 65  de=PERSIST" mode
5c10: 2e 0a 2a 2a 20 20 20 49 66 20 61 20 6a 6f 75 72  ..**   If a jour
5c20: 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
5c30: 74 20 63 6f 6e 74 61 69 6e 20 61 20 6d 61 73 74  t contain a mast
5c40: 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er-journal point
5c50: 65 72 2c 20 69 74 20 69 73 0a 2a 2a 20 20 20 66  er, it is.**   f
5c60: 69 6e 61 6c 69 7a 65 64 20 62 79 20 6f 76 65 72  inalized by over
5c70: 77 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73  writing the firs
5c80: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
5c90: 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 20 49 66   with zeroes. If
5ca0: 0a 2a 2a 20 20 20 69 74 20 64 6f 65 73 20 63 6f  .**   it does co
5cb0: 6e 74 61 69 6e 20 61 20 6d 61 73 74 65 72 2d 6a  ntain a master-j
5cc0: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 74  ournal pointer t
5cd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5ce0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 20 0a 2a 2a  is finalized .**
5cf0: 20 20 20 62 79 20 74 72 75 6e 63 61 74 69 6e 67     by truncating
5d00: 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65   it to zero byte
5d10: 73 2c 20 6a 75 73 74 20 61 73 20 69 66 20 74 68  s, just as if th
5d20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 65 72  e connection wer
5d30: 65 20 0a 2a 2a 20 20 20 72 75 6e 6e 69 6e 67 20  e .**   running 
5d40: 69 6e 20 22 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  in "journal_mode
5d50: 3d 74 72 75 6e 63 61 74 65 22 20 6d 6f 64 65 2e  =truncate" mode.
5d60: 0a 2a 2a 0a 2a 2a 20 20 20 4a 6f 75 72 6e 61 6c  .**.**   Journal
5d70: 20 66 69 6c 65 73 20 74 68 61 74 20 63 6f 6e 74   files that cont
5d80: 61 69 6e 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ain master journ
5d90: 61 6c 20 70 6f 69 6e 74 65 72 73 20 63 61 6e 6e  al pointers cann
5da0: 6f 74 20 62 65 20 66 69 6e 61 6c 69 7a 65 64 0a  ot be finalized.
5db0: 2a 2a 20 20 20 73 69 6d 70 6c 79 20 62 79 20 6f  **   simply by o
5dc0: 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 66  verwriting the f
5dd0: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
5de0: 64 65 72 20 77 69 74 68 20 7a 65 72 6f 65 73 2c  der with zeroes,
5df0: 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 6d 61 73   as the.**   mas
5e00: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
5e10: 74 65 72 20 63 6f 75 6c 64 20 69 6e 74 65 72 66  ter could interf
5e20: 65 72 65 20 77 69 74 68 20 68 6f 74 2d 6a 6f 75  ere with hot-jou
5e30: 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  rnal rollback of
5e40: 20 61 6e 79 0a 2a 2a 20 20 20 73 75 62 73 65 71   any.**   subseq
5e50: 75 65 6e 74 6c 79 20 69 6e 74 65 72 72 75 70 74  uently interrupt
5e60: 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ed transaction t
5e70: 68 61 74 20 72 65 75 73 65 73 20 74 68 65 20 6a  hat reuses the j
5e80: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
5e90: 2a 2a 20 20 20 54 68 65 20 66 6c 61 67 20 69 73  **   The flag is
5ea0: 20 63 6c 65 61 72 65 64 20 61 73 20 73 6f 6f 6e   cleared as soon
5eb0: 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
5ec0: 66 69 6c 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  file is finalize
5ed0: 64 20 28 65 69 74 68 65 72 0a 2a 2a 20 20 20 62  d (either.**   b
5ee0: 79 20 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  y PagerCommitPha
5ef0: 73 65 54 77 6f 20 6f 72 20 50 61 67 65 72 52 6f  seTwo or PagerRo
5f00: 6c 6c 62 61 63 6b 29 2e 20 49 66 20 61 6e 20 49  llback). If an I
5f10: 4f 20 65 72 72 6f 72 20 70 72 65 76 65 6e 74 73  O error prevents
5f20: 20 74 68 65 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61   the.**   journa
5f30: 6c 20 66 69 6c 65 20 66 72 6f 6d 20 62 65 69 6e  l file from bein
5f40: 67 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 66  g successfully f
5f50: 69 6e 61 6c 69 7a 65 64 2c 20 74 68 65 20 73 65  inalized, the se
5f60: 74 4d 61 73 74 65 72 20 66 6c 61 67 0a 2a 2a 20  tMaster flag.** 
5f70: 20 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e 79    is cleared any
5f80: 77 61 79 20 28 61 6e 64 20 74 68 65 20 70 61 67  way (and the pag
5f90: 65 72 20 77 69 6c 6c 20 6d 6f 76 65 20 74 6f 20  er will move to 
5fa0: 45 52 52 4f 52 20 73 74 61 74 65 29 2e 0a 2a 2a  ERROR state)..**
5fb0: 0a 2a 2a 20 64 6f 4e 6f 74 53 70 69 6c 6c 0a 2a  .** doNotSpill.*
5fc0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69  *.**   This vari
5fd0: 61 62 6c 65 73 20 63 6f 6e 74 72 6f 6c 20 74 68  ables control th
5fe0: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 63 61  e behavior of ca
5ff0: 63 68 65 2d 73 70 69 6c 6c 73 20 20 28 63 61 6c  che-spills  (cal
6000: 6c 73 20 6d 61 64 65 20 62 79 0a 2a 2a 20 20 20  ls made by.**   
6010: 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64 75 6c  the pcache modul
6020: 65 20 74 6f 20 74 68 65 20 70 61 67 65 72 53 74  e to the pagerSt
6030: 72 65 73 73 28 29 20 72 6f 75 74 69 6e 65 20 74  ress() routine t
6040: 6f 20 77 72 69 74 65 20 63 61 63 68 65 64 20 64  o write cached d
6050: 61 74 61 0a 2a 2a 20 20 20 74 6f 20 74 68 65 20  ata.**   to the 
6060: 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 6e 20 6f  file-system in o
6070: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20  rder to free up 
6080: 6d 65 6d 6f 72 79 29 2e 0a 2a 2a 0a 2a 2a 20 20  memory)..**.**  
6090: 20 57 68 65 6e 20 62 69 74 73 20 53 50 49 4c 4c   When bits SPILL
60a0: 46 4c 41 47 5f 4f 46 46 20 6f 72 20 53 50 49 4c  FLAG_OFF or SPIL
60b0: 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43 4b 20 6f  LFLAG_ROLLBACK o
60c0: 66 20 64 6f 4e 6f 74 53 70 69 6c 6c 20 61 72 65  f doNotSpill are
60d0: 20 73 65 74 2c 0a 2a 2a 20 20 20 77 72 69 74 69   set,.**   writi
60e0: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
60f0: 73 65 20 66 72 6f 6d 20 70 61 67 65 72 53 74 72  se from pagerStr
6100: 65 73 73 28 29 20 69 73 20 64 69 73 61 62 6c 65  ess() is disable
6110: 64 20 61 6c 74 6f 67 65 74 68 65 72 2e 0a 2a 2a  d altogether..**
6120: 20 20 20 54 68 65 20 53 50 49 4c 4c 46 4c 41 47     The SPILLFLAG
6130: 5f 52 4f 4c 4c 42 41 43 4b 20 63 61 73 65 20 69  _ROLLBACK case i
6140: 73 20 64 6f 6e 65 20 69 6e 20 61 20 76 65 72 79  s done in a very
6150: 20 6f 62 73 63 75 72 65 20 63 61 73 65 20 74 68   obscure case th
6160: 61 74 0a 2a 2a 20 20 20 63 6f 6d 65 73 20 75 70  at.**   comes up
6170: 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69 6e   during savepoin
6180: 74 20 72 6f 6c 6c 62 61 63 6b 20 74 68 61 74 20  t rollback that 
6190: 72 65 71 75 69 72 65 73 20 74 68 65 20 70 63 61  requires the pca
61a0: 63 68 65 20 6d 6f 64 75 6c 65 0a 2a 2a 20 20 20  che module.**   
61b0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  to allocate a ne
61c0: 77 20 70 61 67 65 20 74 6f 20 70 72 65 76 65 6e  w page to preven
61d0: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  t the journal fi
61e0: 6c 65 20 66 72 6f 6d 20 62 65 69 6e 67 20 77 72  le from being wr
61f0: 69 74 74 65 6e 0a 2a 2a 20 20 20 77 68 69 6c 65  itten.**   while
6200: 20 69 74 20 69 73 20 62 65 69 6e 67 20 74 72 61   it is being tra
6210: 76 65 72 73 65 64 20 62 79 20 63 6f 64 65 20 69  versed by code i
6220: 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
6230: 28 29 2e 20 20 54 68 65 20 53 50 49 4c 4c 46 4c  ().  The SPILLFL
6240: 41 47 5f 4f 46 46 0a 2a 2a 20 20 20 63 61 73 65  AG_OFF.**   case
6250: 20 69 73 20 61 20 75 73 65 72 20 70 72 65 66 65   is a user prefe
6260: 72 65 6e 63 65 2e 0a 2a 2a 20 0a 2a 2a 20 20 20  rence..** .**   
6270: 49 66 20 74 68 65 20 53 50 49 4c 4c 46 4c 41 47  If the SPILLFLAG
6280: 5f 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73  _NOSYNC bit is s
6290: 65 74 2c 20 77 72 69 74 69 6e 67 20 74 6f 20 74  et, writing to t
62a0: 68 65 20 64 61 74 61 62 61 73 65 20 66 72 6f 6d  he database from
62b0: 0a 2a 2a 20 20 20 70 61 67 65 72 53 74 72 65 73  .**   pagerStres
62c0: 73 28 29 20 69 73 20 70 65 72 6d 69 74 74 65 64  s() is permitted
62d0: 2c 20 62 75 74 20 73 79 6e 63 69 6e 67 20 74 68  , but syncing th
62e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
62f0: 73 20 6e 6f 74 2e 0a 2a 2a 20 20 20 54 68 69 73  s not..**   This
6300: 20 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20   flag is set by 
6310: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
6320: 65 28 29 20 77 68 65 6e 20 74 68 65 20 66 69 6c  e() when the fil
6330: 65 2d 73 79 73 74 65 6d 20 73 65 63 74 6f 72 2d  e-system sector-
6340: 73 69 7a 65 0a 2a 2a 20 20 20 69 73 20 6c 61 72  size.**   is lar
6350: 67 65 72 20 74 68 61 6e 20 74 68 65 20 64 61 74  ger than the dat
6360: 61 62 61 73 65 20 70 61 67 65 2d 73 69 7a 65 20  abase page-size 
6370: 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65 76  in order to prev
6380: 65 6e 74 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79  ent a journal sy
6390: 6e 63 0a 2a 2a 20 20 20 66 72 6f 6d 20 68 61 70  nc.**   from hap
63a0: 70 65 6e 69 6e 67 20 69 6e 20 62 65 74 77 65 65  pening in betwee
63b0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e  n the journallin
63c0: 67 20 6f 66 20 74 77 6f 20 70 61 67 65 73 20 6f  g of two pages o
63d0: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 74 6f  n the same secto
63e0: 72 2e 20 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e  r. .**.** subjIn
63f0: 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54  Memory.**.**   T
6400: 68 69 73 20 69 73 20 61 20 62 6f 6f 6c 65 61 6e  his is a boolean
6410: 20 76 61 72 69 61 62 6c 65 2e 20 49 66 20 74 72   variable. If tr
6420: 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71  ue, then any req
6430: 75 69 72 65 64 20 73 75 62 2d 6a 6f 75 72 6e 61  uired sub-journa
6440: 6c 0a 2a 2a 20 20 20 69 73 20 6f 70 65 6e 65 64  l.**   is opened
6450: 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
6460: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
6470: 66 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e  f false, then in
6480: 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 20 20 73 75 62  -memory.**   sub
6490: 2d 6a 6f 75 72 6e 61 6c 73 20 61 72 65 20 6f 6e  -journals are on
64a0: 6c 79 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ly used for in-m
64b0: 65 6d 6f 72 79 20 70 61 67 65 72 20 66 69 6c 65  emory pager file
64c0: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  s..**.**   This 
64d0: 76 61 72 69 61 62 6c 65 20 69 73 20 75 70 64 61  variable is upda
64e0: 74 65 64 20 62 79 20 74 68 65 20 75 70 70 65 72  ted by the upper
64f0: 20 6c 61 79 65 72 20 65 61 63 68 20 74 69 6d 65   layer each time
6500: 20 61 20 6e 65 77 20 0a 2a 2a 20 20 20 77 72 69   a new .**   wri
6510: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
6520: 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  s opened..**.** 
6530: 64 62 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69  dbSize, dbOrigSi
6540: 7a 65 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a  ze, dbFileSize.*
6550: 2a 0a 2a 2a 20 20 20 56 61 72 69 61 62 6c 65 20  *.**   Variable 
6560: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
6570: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
6580: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
6590: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
65a0: 49 74 20 69 73 20 76 61 6c 69 64 20 69 6e 20 50  It is valid in P
65b0: 41 47 45 52 5f 52 45 41 44 45 52 20 61 6e 64 20  AGER_READER and 
65c0: 68 69 67 68 65 72 20 73 74 61 74 65 73 20 28 61  higher states (a
65d0: 6c 6c 20 73 74 61 74 65 73 20 65 78 63 65 70 74  ll states except
65e0: 20 66 6f 72 0a 2a 2a 20 20 20 4f 50 45 4e 20 61   for.**   OPEN a
65f0: 6e 64 20 45 52 52 4f 52 29 2e 20 0a 2a 2a 0a 2a  nd ERROR). .**.*
6600: 2a 20 20 20 64 62 53 69 7a 65 20 69 73 20 73 65  *   dbSize is se
6610: 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73  t based on the s
6620: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
6630: 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20  ase file, which 
6640: 6d 61 79 20 62 65 20 0a 2a 2a 20 20 20 6c 61 72  may be .**   lar
6650: 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 69 7a  ger than the siz
6660: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
6670: 65 20 28 74 68 65 20 76 61 6c 75 65 20 73 74 6f  e (the value sto
6680: 72 65 64 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a  red at offset.**
6690: 20 20 20 32 38 20 6f 66 20 74 68 65 20 64 61 74     28 of the dat
66a0: 61 62 61 73 65 20 68 65 61 64 65 72 20 62 79 20  abase header by 
66b0: 74 68 65 20 62 74 72 65 65 29 2e 20 49 66 20 74  the btree). If t
66c0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
66d0: 69 6c 65 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20  ile.**   is not 
66e0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
66f0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 2d  ple of the page-
6700: 73 69 7a 65 2c 20 74 68 65 20 76 61 6c 75 65 20  size, the value 
6710: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 20 20 64  stored in.**   d
6720: 62 53 69 7a 65 20 69 73 20 72 6f 75 6e 64 65 64  bSize is rounded
6730: 20 64 6f 77 6e 20 28 69 2e 65 2e 20 61 20 35 4b   down (i.e. a 5K
6740: 42 20 66 69 6c 65 20 77 69 74 68 20 32 4b 20 70  B file with 2K p
6750: 61 67 65 2d 73 69 7a 65 20 68 61 73 20 64 62 53  age-size has dbS
6760: 69 7a 65 3d 3d 32 29 2e 0a 2a 2a 20 20 20 45 78  ize==2)..**   Ex
6770: 63 65 70 74 2c 20 61 6e 79 20 66 69 6c 65 20 74  cept, any file t
6780: 68 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74  hat is greater t
6790: 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
67a0: 69 7a 65 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ize is considere
67b0: 64 0a 2a 2a 20 20 20 74 6f 20 68 61 76 65 20 61  d.**   to have a
67c0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 70 61 67 65  t least one page
67d0: 2e 20 28 69 2e 65 2e 20 61 20 31 4b 42 20 66 69  . (i.e. a 1KB fi
67e0: 6c 65 20 77 69 74 68 20 32 4b 20 70 61 67 65 2d  le with 2K page-
67f0: 73 69 7a 65 20 6c 65 61 64 73 0a 2a 2a 20 20 20  size leads.**   
6800: 74 6f 20 64 62 53 69 7a 65 3d 3d 31 29 2e 0a 2a  to dbSize==1)..*
6810: 2a 0a 2a 2a 20 20 20 44 75 72 69 6e 67 20 61 20  *.**   During a 
6820: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
6830: 6e 2c 20 69 66 20 70 61 67 65 73 20 77 69 74 68  n, if pages with
6840: 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 67 72   page-numbers gr
6850: 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 20 20  eater than.**   
6860: 64 62 53 69 7a 65 20 61 72 65 20 6d 6f 64 69 66  dbSize are modif
6870: 69 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  ied in the cache
6880: 2c 20 64 62 53 69 7a 65 20 69 73 20 75 70 64 61  , dbSize is upda
6890: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
68a0: 0a 2a 2a 20 20 20 53 69 6d 69 6c 61 72 6c 79 2c  .**   Similarly,
68b0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
68c0: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 75 73   is truncated us
68d0: 69 6e 67 20 50 61 67 65 72 54 72 75 6e 63 61 74  ing PagerTruncat
68e0: 65 49 6d 61 67 65 28 29 2c 20 0a 2a 2a 20 20 20  eImage(), .**   
68f0: 64 62 53 69 7a 65 20 69 73 20 75 70 64 61 74 65  dbSize is update
6900: 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 56 61 72 69 61  d..**.**   Varia
6910: 62 6c 65 73 20 64 62 4f 72 69 67 53 69 7a 65 20  bles dbOrigSize 
6920: 61 6e 64 20 64 62 46 69 6c 65 53 69 7a 65 20 61  and dbFileSize a
6930: 72 65 20 76 61 6c 69 64 20 69 6e 20 73 74 61 74  re valid in stat
6940: 65 73 20 0a 2a 2a 20 20 20 50 41 47 45 52 5f 57  es .**   PAGER_W
6950: 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 61 6e 64  RITER_LOCKED and
6960: 20 68 69 67 68 65 72 2e 20 64 62 4f 72 69 67 53   higher. dbOrigS
6970: 69 7a 65 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ize is a copy of
6980: 20 74 68 65 20 64 62 53 69 7a 65 0a 2a 2a 20 20   the dbSize.**  
6990: 20 76 61 72 69 61 62 6c 65 20 61 74 20 74 68 65   variable at the
69a0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
69b0: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73  ansaction. It is
69c0: 20 75 73 65 64 20 64 75 72 69 6e 67 20 72 6f 6c   used during rol
69d0: 6c 62 61 63 6b 2c 0a 2a 2a 20 20 20 61 6e 64 20  lback,.**   and 
69e0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
69f0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 70 61 67 65  ther or not page
6a00: 73 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  s need to be jou
6a10: 72 6e 61 6c 6c 65 64 20 62 65 66 6f 72 65 0a 2a  rnalled before.*
6a20: 2a 20 20 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  *   being modifi
6a30: 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 72 6f  ed..**.**   Thro
6a40: 75 67 68 6f 75 74 20 61 20 77 72 69 74 65 2d 74  ughout a write-t
6a50: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 64 62 46 69  ransaction, dbFi
6a60: 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20  leSize contains 
6a70: 74 68 65 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 20  the size of.**  
6a80: 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
6a90: 6b 20 69 6e 20 70 61 67 65 73 2e 20 49 74 20 69  k in pages. It i
6aa0: 73 20 73 65 74 20 74 6f 20 61 20 63 6f 70 79 20  s set to a copy 
6ab0: 6f 66 20 64 62 53 69 7a 65 20 77 68 65 6e 20 74  of dbSize when t
6ac0: 68 65 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72  he.**   write-tr
6ad0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72  ansaction is fir
6ae0: 73 74 20 6f 70 65 6e 65 64 2c 20 61 6e 64 20 75  st opened, and u
6af0: 70 64 61 74 65 64 20 77 68 65 6e 20 56 46 53 20  pdated when VFS 
6b00: 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a 2a  calls are made.*
6b10: 2a 20 20 20 74 6f 20 77 72 69 74 65 20 6f 72 20  *   to write or 
6b20: 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  truncate the dat
6b30: 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69  abase file on di
6b40: 73 6b 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  sk. .**.**   The
6b50: 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 68 65   only reason the
6b60: 20 64 62 46 69 6c 65 53 69 7a 65 20 76 61 72 69   dbFileSize vari
6b70: 61 62 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  able is required
6b80: 20 69 73 20 74 6f 20 73 75 70 70 72 65 73 73 20   is to suppress 
6b90: 0a 2a 2a 20 20 20 75 6e 6e 65 63 65 73 73 61 72  .**   unnecessar
6ba0: 79 20 63 61 6c 6c 73 20 74 6f 20 78 54 72 75 6e  y calls to xTrun
6bb0: 63 61 74 65 28 29 20 61 66 74 65 72 20 63 6f 6d  cate() after com
6bc0: 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
6bd0: 63 74 69 6f 6e 2e 20 49 66 2c 20 0a 2a 2a 20 20  ction. If, .**  
6be0: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
6bf0: 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
6c00: 2c 20 74 68 65 20 64 62 46 69 6c 65 53 69 7a 65  , the dbFileSize
6c10: 20 76 61 72 69 61 62 6c 65 20 69 6e 64 69 63 61   variable indica
6c20: 74 65 73 20 0a 2a 2a 20 20 20 74 68 61 74 20 74  tes .**   that t
6c30: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
6c40: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
6c50: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
6c60: 67 65 20 28 50 61 67 65 72 2e 64 62 53 69 7a 65  ge (Pager.dbSize
6c70: 29 2c 20 0a 2a 2a 20 20 20 70 61 67 65 72 5f 74  ), .**   pager_t
6c80: 72 75 6e 63 61 74 65 28 29 20 69 73 20 63 61 6c  runcate() is cal
6c90: 6c 65 64 2e 20 54 68 65 20 70 61 67 65 72 5f 74  led. The pager_t
6ca0: 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75  runcate() call u
6cb0: 73 65 73 20 78 46 69 6c 65 73 69 7a 65 28 29 0a  ses xFilesize().
6cc0: 2a 2a 20 20 20 74 6f 20 6d 65 61 73 75 72 65 20  **   to measure 
6cd0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
6ce0: 65 20 6f 6e 20 64 69 73 6b 2c 20 61 6e 64 20 74  e on disk, and t
6cf0: 68 65 6e 20 74 72 75 6e 63 61 74 65 73 20 69 74  hen truncates it
6d00: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
6d10: 20 20 20 64 62 46 69 6c 65 53 69 7a 65 20 69 73     dbFileSize is
6d20: 20 6e 6f 74 20 75 73 65 64 20 77 68 65 6e 20 72   not used when r
6d30: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 74 72  olling back a tr
6d40: 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
6d50: 69 73 20 63 61 73 65 0a 2a 2a 20 20 20 70 61 67  is case.**   pag
6d60: 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 69 73  er_truncate() is
6d70: 20 63 61 6c 6c 65 64 20 75 6e 63 6f 6e 64 69 74   called uncondit
6d80: 69 6f 6e 61 6c 6c 79 20 28 77 68 69 63 68 20 6d  ionally (which m
6d90: 65 61 6e 73 20 74 68 65 72 65 20 6d 61 79 20 62  eans there may b
6da0: 65 0a 2a 2a 20 20 20 61 20 63 61 6c 6c 20 74 6f  e.**   a call to
6db0: 20 78 46 69 6c 65 73 69 7a 65 28 29 20 74 68 61   xFilesize() tha
6dc0: 74 20 69 73 20 6e 6f 74 20 73 74 72 69 63 74 6c  t is not strictl
6dd0: 79 20 72 65 71 75 69 72 65 64 29 2e 20 49 6e 20  y required). In 
6de0: 65 69 74 68 65 72 20 63 61 73 65 2c 0a 2a 2a 20  either case,.** 
6df0: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
6e00: 28 29 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  () may cause the
6e10: 20 66 69 6c 65 20 74 6f 20 62 65 63 6f 6d 65 20   file to become 
6e20: 73 6d 61 6c 6c 65 72 20 6f 72 20 6c 61 72 67 65  smaller or large
6e30: 72 2e 0a 2a 2a 0a 2a 2a 20 64 62 48 69 6e 74 53  r..**.** dbHintS
6e40: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ize.**.**   The 
6e50: 64 62 48 69 6e 74 53 69 7a 65 20 76 61 72 69 61  dbHintSize varia
6e60: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6c  ble is used to l
6e70: 69 6d 69 74 20 74 68 65 20 6e 75 6d 62 65 72 20  imit the number 
6e80: 6f 66 20 63 61 6c 6c 73 20 6d 61 64 65 20 74 6f  of calls made to
6e90: 0a 2a 2a 20 20 20 74 68 65 20 56 46 53 20 78 46  .**   the VFS xF
6ea0: 69 6c 65 43 6f 6e 74 72 6f 6c 28 46 43 4e 54 4c  ileControl(FCNTL
6eb0: 5f 53 49 5a 45 5f 48 49 4e 54 29 20 6d 65 74 68  _SIZE_HINT) meth
6ec0: 6f 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 64 62 48  od. .**.**   dbH
6ed0: 69 6e 74 53 69 7a 65 20 69 73 20 73 65 74 20 74  intSize is set t
6ee0: 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  o a copy of the 
6ef0: 64 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  dbSize variable 
6f00: 77 68 65 6e 20 61 0a 2a 2a 20 20 20 77 72 69 74  when a.**   writ
6f10: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
6f20: 20 6f 70 65 6e 65 64 20 28 61 74 20 74 68 65 20   opened (at the 
6f30: 73 61 6d 65 20 74 69 6d 65 20 61 73 20 64 62 46  same time as dbF
6f40: 69 6c 65 53 69 7a 65 20 61 6e 64 0a 2a 2a 20 20  ileSize and.**  
6f50: 20 64 62 4f 72 69 67 53 69 7a 65 29 2e 20 49 66   dbOrigSize). If
6f60: 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f   the xFileContro
6f70: 6c 28 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  l(FCNTL_SIZE_HIN
6f80: 54 29 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c  T) method is cal
6f90: 6c 65 64 2c 0a 2a 2a 20 20 20 64 62 48 69 6e 74  led,.**   dbHint
6fa0: 53 69 7a 65 20 69 73 20 69 6e 63 72 65 61 73 65  Size is increase
6fb0: 64 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  d to the number 
6fc0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 63 6f  of pages that co
6fd0: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 0a  rrespond to the.
6fe0: 2a 2a 20 20 20 73 69 7a 65 2d 68 69 6e 74 20 70  **   size-hint p
6ff0: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 65 74  assed to the met
7000: 68 6f 64 20 63 61 6c 6c 2e 20 53 65 65 20 70 61  hod call. See pa
7010: 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
7020: 73 74 28 29 20 66 6f 72 20 0a 2a 2a 20 20 20 64  st() for .**   d
7030: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 65 72  etails..**.** er
7040: 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  rCode.**.**   Th
7050: 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  e Pager.errCode 
7060: 76 61 72 69 61 62 6c 65 20 69 73 20 6f 6e 6c 79  variable is only
7070: 20 65 76 65 72 20 75 73 65 64 20 69 6e 20 50 41   ever used in PA
7080: 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e  GER_ERROR state.
7090: 20 49 74 0a 2a 2a 20 20 20 69 73 20 73 65 74 20   It.**   is set 
70a0: 74 6f 20 7a 65 72 6f 20 69 6e 20 61 6c 6c 20 6f  to zero in all o
70b0: 74 68 65 72 20 73 74 61 74 65 73 2e 20 49 6e 20  ther states. In 
70c0: 50 41 47 45 52 5f 45 52 52 4f 52 20 73 74 61 74  PAGER_ERROR stat
70d0: 65 2c 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  e, Pager.errCode
70e0: 20 0a 2a 2a 20 20 20 69 73 20 61 6c 77 61 79 73   .**   is always
70f0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 46   set to SQLITE_F
7100: 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  ULL, SQLITE_IOER
7110: 52 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  R or one of the 
7120: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
7130: 20 0a 2a 2a 20 20 20 73 75 62 2d 63 6f 64 65 73   .**   sub-codes
7140: 2e 0a 2a 2a 0a 2a 2a 20 73 79 6e 63 46 6c 61 67  ..**.** syncFlag
7150: 73 2c 20 77 61 6c 53 79 6e 63 46 6c 61 67 73 0a  s, walSyncFlags.
7160: 2a 2a 0a 2a 2a 20 20 20 73 79 6e 63 46 6c 61 67  **.**   syncFlag
7170: 73 20 69 73 20 65 69 74 68 65 72 20 53 51 4c 49  s is either SQLI
7180: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 28  TE_SYNC_NORMAL (
7190: 30 78 30 32 29 20 6f 72 20 53 51 4c 49 54 45 5f  0x02) or SQLITE_
71a0: 53 59 4e 43 5f 46 55 4c 4c 20 28 30 78 30 33 29  SYNC_FULL (0x03)
71b0: 2e 0a 2a 2a 20 20 20 73 79 6e 63 46 6c 61 67 73  ..**   syncFlags
71c0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 72 6f 6c   is used for rol
71d0: 6c 62 61 63 6b 20 6d 6f 64 65 2e 20 20 77 61 6c  lback mode.  wal
71e0: 53 79 6e 63 46 6c 61 67 73 20 69 73 20 75 73 65  SyncFlags is use
71f0: 64 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65 0a 2a  d for WAL mode.*
7200: 2a 20 20 20 61 6e 64 20 63 6f 6e 74 61 69 6e 73  *   and contains
7210: 20 74 68 65 20 66 6c 61 67 73 20 75 73 65 64 20   the flags used 
7220: 74 6f 20 73 79 6e 63 20 74 68 65 20 63 68 65 63  to sync the chec
7230: 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69 6f 6e  kpoint operation
7240: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 6c 6f  s in the.**   lo
7250: 77 65 72 20 74 77 6f 20 62 69 74 73 2c 20 61 6e  wer two bits, an
7260: 64 20 73 79 6e 63 20 66 6c 61 67 73 20 75 73 65  d sync flags use
7270: 64 20 66 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  d for transactio
7280: 6e 20 63 6f 6d 6d 69 74 73 20 69 6e 20 74 68 65  n commits in the
7290: 20 57 41 4c 0a 2a 2a 20 20 20 66 69 6c 65 20 69   WAL.**   file i
72a0: 6e 20 62 69 74 73 20 30 78 30 34 20 61 6e 64 20  n bits 0x04 and 
72b0: 30 78 30 38 2e 20 20 49 6e 20 6f 74 68 65 72 20  0x08.  In other 
72c0: 77 6f 72 64 73 2c 20 74 6f 20 67 65 74 20 74 68  words, to get th
72d0: 65 20 63 6f 72 72 65 63 74 20 73 79 6e 63 20 66  e correct sync f
72e0: 6c 61 67 73 0a 2a 2a 20 20 20 66 6f 72 20 63 68  lags.**   for ch
72f0: 65 63 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69  eckpoint operati
7300: 6f 6e 73 2c 20 75 73 65 20 28 77 61 6c 53 79 6e  ons, use (walSyn
7310: 63 46 6c 61 67 73 26 30 78 30 33 29 20 61 6e 64  cFlags&0x03) and
7320: 20 74 6f 20 67 65 74 20 74 68 65 20 63 6f 72 72   to get the corr
7330: 65 63 74 0a 2a 2a 20 20 20 73 79 6e 63 20 66 6c  ect.**   sync fl
7340: 61 67 73 20 66 6f 72 20 74 72 61 6e 73 61 63 74  ags for transact
7350: 69 6f 6e 20 63 6f 6d 6d 69 74 2c 20 75 73 65 20  ion commit, use 
7360: 28 28 77 61 6c 53 79 6e 63 46 6c 61 67 73 3e 3e  ((walSyncFlags>>
7370: 32 29 26 30 78 30 33 29 2e 20 20 4e 6f 74 65 0a  2)&0x03).  Note.
7380: 2a 2a 20 20 20 74 68 61 74 20 77 69 74 68 20 73  **   that with s
7390: 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41  ynchronous=NORMA
73a0: 4c 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 74  L in WAL mode, t
73b0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
73c0: 74 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 0a  t is not synced.
73d0: 2a 2a 20 20 20 6d 65 61 6e 69 6e 67 20 74 68 61  **   meaning tha
73e0: 74 20 74 68 65 20 30 78 30 34 20 61 6e 64 20 30  t the 0x04 and 0
73f0: 78 30 38 20 62 69 74 73 20 61 72 65 20 62 6f 74  x08 bits are bot
7400: 68 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 72 75 63  h zero..*/.struc
7410: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
7420: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
7430: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
7440: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
7450: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
7460: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
7470: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
7480: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
7490: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
74a0: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
74b0: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
74c0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
74d0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
74e0: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
74f0: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7510: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
7520: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
7530: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 53  file */.  u8 noS
7540: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
7550: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7560: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
7570: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
7580: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
7590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
75a0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
75b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
75c0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
75d0: 38 20 65 78 74 72 61 53 79 6e 63 3b 20 20 20 20  8 extraSync;    
75e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 79             /* sy
75f0: 6e 63 20 64 69 72 65 63 74 6f 72 79 20 61 66 74  nc directory aft
7600: 65 72 20 6a 6f 75 72 6e 61 6c 20 64 65 6c 65 74  er journal delet
7610: 65 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 46 6c  e */.  u8 syncFl
7620: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
7630: 20 20 20 2f 2a 20 53 59 4e 43 5f 4e 4f 52 4d 41     /* SYNC_NORMA
7640: 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c 4c 20 6f  L or SYNC_FULL o
7650: 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 75 38  therwise */.  u8
7660: 20 77 61 6c 53 79 6e 63 46 6c 61 67 73 3b 20 20   walSyncFlags;  
7670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65            /* See
7680: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 61 62 6f   description abo
7690: 76 65 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  ve */.  u8 tempF
76a0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
76b0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
76c0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
76d0: 6f 72 20 69 6d 6d 75 74 61 62 6c 65 20 66 69 6c  or immutable fil
76e0: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 4c 6f 63 6b  e */.  u8 noLock
76f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7700: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 63     /* Do not loc
7710: 6b 20 28 65 78 63 65 70 74 20 69 6e 20 57 41 4c  k (except in WAL
7720: 20 6d 6f 64 65 29 20 2a 2f 0a 20 20 75 38 20 72   mode) */.  u8 r
7730: 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20  eadOnly;        
7740: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7750: 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  for a read-only 
7760: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
7770: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
7780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7790: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
77a0: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20   file I/O */..  
77b0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
77c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
77f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 20 2a 2a  ***********.  **
7800: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
7810: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
7820: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
7830: 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 64 75  s that change du
7840: 72 69 6e 67 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  ring.  ** routin
7850: 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 43 6c  e operation.  Cl
7860: 61 73 73 20 6d 65 6d 62 65 72 73 20 6e 6f 74 20  ass members not 
7870: 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 72  in this block ar
7880: 65 20 65 69 74 68 65 72 20 66 69 78 65 64 0a 20  e either fixed. 
7890: 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 70 61 67   ** when the pag
78a0: 65 72 20 69 73 20 66 69 72 73 74 20 63 72 65 61  er is first crea
78b0: 74 65 64 20 6f 72 20 65 6c 73 65 20 6f 6e 6c 79  ted or else only
78c0: 20 63 68 61 6e 67 65 20 77 68 65 6e 20 74 68 65   change when the
78d0: 72 65 20 69 73 20 61 0a 20 20 2a 2a 20 73 69 67  re is a.  ** sig
78e0: 6e 69 66 69 63 61 6e 74 20 6d 6f 64 65 20 63 68  nificant mode ch
78f0: 61 6e 67 65 20 28 73 75 63 68 20 61 73 20 63 68  ange (such as ch
7900: 61 6e 67 69 6e 67 20 74 68 65 20 70 61 67 65 5f  anging the page_
7910: 73 69 7a 65 2c 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  size, locking_mo
7920: 64 65 2c 0a 20 20 2a 2a 20 6f 72 20 74 68 65 20  de,.  ** or the 
7930: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 29 2e 20 20  journal_mode).  
7940: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 76 69 65  From another vie
7950: 77 2c 20 74 68 65 73 65 20 63 6c 61 73 73 20 6d  w, these class m
7960: 65 6d 62 65 72 73 20 64 65 73 63 72 69 62 65 0a  embers describe.
7970: 20 20 2a 2a 20 74 68 65 20 22 73 74 61 74 65 22    ** the "state"
7980: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2c 20 77   of the pager, w
7990: 68 69 6c 65 20 6f 74 68 65 72 20 63 6c 61 73 73  hile other class
79a0: 20 6d 65 6d 62 65 72 73 20 64 65 73 63 72 69 62   members describ
79b0: 65 20 74 68 65 0a 20 20 2a 2a 20 22 63 6f 6e 66  e the.  ** "conf
79c0: 69 67 75 72 61 74 69 6f 6e 22 20 6f 66 20 74 68  iguration" of th
79d0: 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20  e pager..  */.  
79e0: 75 38 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  u8 eState;      
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7a00: 61 67 65 72 20 73 74 61 74 65 20 28 4f 50 45 4e  ager state (OPEN
7a10: 2c 20 52 45 41 44 45 52 2c 20 57 52 49 54 45 52  , READER, WRITER
7a20: 5f 4c 4f 43 4b 45 44 2e 2e 29 20 2a 2f 0a 20 20  _LOCKED..) */.  
7a30: 75 38 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20  u8 eLock;       
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
7a50: 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64  urrent lock held
7a60: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
7a70: 65 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  e */.  u8 change
7a80: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
7a90: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
7aa0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
7ab0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
7ac0: 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65  */.  u8 setMaste
7ad0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
7ae0: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d   /* True if a m-
7af0: 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20  j name has been 
7b00: 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20  written to jrnl 
7b10: 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 70 69  */.  u8 doNotSpi
7b20: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
7b30: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 70 69 6c 6c   /* Do not spill
7b40: 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
7b50: 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f 0a 20 20 75 38  non-zero */.  u8
7b60: 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20   subjInMemory;  
7b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7b80: 65 20 74 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f  e to use in-memo
7b90: 72 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20  ry sub-journals 
7ba0: 2a 2f 0a 20 20 75 38 20 62 55 73 65 46 65 74 63  */.  u8 bUseFetc
7bb0: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
7bc0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
7bd0: 78 46 65 74 63 68 28 29 20 2a 2f 0a 20 20 75 38  xFetch() */.  u8
7be0: 20 68 61 73 48 65 6c 64 53 68 61 72 65 64 4c 6f   hasHeldSharedLo
7bf0: 63 6b 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ck;       /* Tru
7c00: 65 20 69 66 20 61 20 73 68 61 72 65 64 20 6c 6f  e if a shared lo
7c10: 63 6b 20 68 61 73 20 65 76 65 72 20 62 65 65 6e  ck has ever been
7c20: 20 68 65 6c 64 20 2a 2f 0a 20 20 50 67 6e 6f 20   held */.  Pgno 
7c30: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
7c40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7c50: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
7c60: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
7c70: 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20  gno dbOrigSize; 
7c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
7c90: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
7ca0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
7cb0: 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ion */.  Pgno db
7cc0: 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  FileSize;       
7cd0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7ce0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
7cf0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7d00: 20 20 50 67 6e 6f 20 64 62 48 69 6e 74 53 69 7a    Pgno dbHintSiz
7d10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
7d20: 20 56 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f   Value passed to
7d30: 20 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54   FCNTL_SIZE_HINT
7d40: 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 65   call */.  int e
7d50: 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20  rrCode;         
7d60: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
7d70: 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f   several kinds o
7d80: 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e  f errors */.  in
7d90: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
7da0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
7db0: 65 73 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69  es journalled si
7dc0: 6e 63 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65  nce last j-heade
7dd0: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75  r written */.  u
7de0: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
7df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
7e00: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
7e10: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
7e20: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33  checksum */.  u3
7e30: 32 20 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20  2 nSubRec;      
7e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7e50: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77  ber of records w
7e60: 72 69 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f  ritten to sub-jo
7e70: 75 72 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65  urnal */.  Bitve
7e80: 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20  c *pInJournal;  
7e90: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
7ea0: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
7eb0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7ec0: 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  file */.  sqlite
7ed0: 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20  3_file *fd;     
7ee0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
7ef0: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74  scriptor for dat
7f00: 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
7f10: 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20  e3_file *jfd;   
7f20: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
7f30: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61  escriptor for ma
7f40: 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
7f50: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a  sqlite3_file *sj
7f60: 66 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46  fd;         /* F
7f70: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
7f80: 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a  or sub-journal *
7f90: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f  /.  i64 journalO
7fa0: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
7fb0: 2f 2a 20 43 75 72 72 65 6e 74 20 77 72 69 74 65  /* Current write
7fc0: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a   offset in the j
7fd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
7fe0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b   i64 journalHdr;
7ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8000: 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70  Byte offset to p
8010: 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20  revious journal 
8020: 68 65 61 64 65 72 20 2a 2f 0a 20 20 73 71 6c 69  header */.  sqli
8030: 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
8040: 6b 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  kup;    /* Point
8050: 65 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e  er to list of on
8060: 67 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f  going backup pro
8070: 63 65 73 73 65 73 20 2a 2f 0a 20 20 50 61 67 65  cesses */.  Page
8080: 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76  rSavepoint *aSav
8090: 65 70 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79  epoint; /* Array
80a0: 20 6f 66 20 61 63 74 69 76 65 20 73 61 76 65 70   of active savep
80b0: 6f 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  oints */.  int n
80c0: 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20  Savepoint;      
80d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
80e0: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
80f0: 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a  aSavepoint[] */.
8100: 20 20 75 33 32 20 69 44 61 74 61 56 65 72 73 69    u32 iDataVersi
8110: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  on;           /*
8120: 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65   Changes wheneve
8130: 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65  r database conte
8140: 6e 74 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20  nt changes */.  
8150: 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
8160: 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  16];        /* C
8170: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
8180: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
8190: 61 6e 67 65 73 20 2a 2f 0a 0a 20 20 69 6e 74 20  anges */..  int 
81a0: 6e 4d 6d 61 70 4f 75 74 3b 20 20 20 20 20 20 20  nMmapOut;       
81b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
81c0: 72 20 6f 66 20 6d 6d 61 70 20 70 61 67 65 73 20  r of mmap pages 
81d0: 63 75 72 72 65 6e 74 6c 79 20 6f 75 74 73 74 61  currently outsta
81e0: 6e 64 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74  nding */.  sqlit
81f0: 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 3b  e3_int64 szMmap;
8200: 20 20 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65         /* Desire
8210: 64 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73  d maximum mmap s
8220: 69 7a 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ize */.  PgHdr *
8230: 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 20 20  pMmapFreelist;  
8240: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
8250: 66 72 65 65 20 6d 6d 61 70 20 70 61 67 65 20 68  free mmap page h
8260: 65 61 64 65 72 73 20 28 70 44 69 72 74 79 29 20  eaders (pDirty) 
8270: 2a 2f 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 6e 64  */.  /*.  ** End
8280: 20 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 6c   of the routinel
8290: 79 2d 63 68 61 6e 67 69 6e 67 20 63 6c 61 73 73  y-changing class
82a0: 20 6d 65 6d 62 65 72 73 0a 20 20 2a 2a 2a 2a 2a   members.  *****
82b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
82f0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 20 20 75 31 36 20 6e  ******/..  u16 n
8300: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
8310: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
8320: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
8330: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
8340: 70 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52  page */.  i16 nR
8350: 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
8360: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8370: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
8380: 61 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70  at end of each p
8390: 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73  age */.  u32 vfs
83a0: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
83b0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
83c0: 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  r sqlite3_vfs.xO
83d0: 70 65 6e 28 29 20 2a 2f 0a 20 20 75 33 32 20 73  pen() */.  u32 s
83e0: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
83f0: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
8400: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
8410: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
8420: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8440: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
8450: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
8460: 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20   Pgno mxPgno;   
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8480: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
8490: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
84a0: 62 61 73 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  base */.  i64 jo
84b0: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20  urnalSizeLimit; 
84c0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69        /* Size li
84d0: 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65  mit for persiste
84e0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nt journal files
84f0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
8500: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
8510: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
8520: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
8530: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
8540: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
8550: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
8560: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
8570: 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
8580: 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20  ler)(void*); /* 
8590: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c  Function to call
85a0: 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20   when busy */.  
85b0: 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
85c0: 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43  erArg;      /* C
85d0: 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20  ontext argument 
85e0: 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72  for xBusyHandler
85f0: 20 2a 2f 0a 20 20 69 6e 74 20 61 53 74 61 74 5b   */.  int aStat[
8600: 34 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  4];             
8610: 20 20 2f 2a 20 54 6f 74 61 6c 20 63 61 63 68 65    /* Total cache
8620: 20 68 69 74 73 2c 20 6d 69 73 73 65 73 2c 20 77   hits, misses, w
8630: 72 69 74 65 73 2c 20 73 70 69 6c 6c 73 20 2a 2f  rites, spills */
8640: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
8650: 45 53 54 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b  EST.  int nRead;
8660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8670: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61    /* Database pa
8680: 67 65 73 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64  ges read */.#end
8690: 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  if.  void (*xRei
86a0: 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 29 3b  niter)(DbPage*);
86b0: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
86c0: 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61  utine when reloa
86d0: 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20  ding pages */.  
86e0: 69 6e 74 20 28 2a 78 47 65 74 29 28 50 61 67 65  int (*xGet)(Page
86f0: 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a  r*,Pgno,DbPage**
8700: 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e  ,int); /* Routin
8710: 65 20 74 6f 20 66 65 74 63 68 20 61 20 70 61 74  e to fetch a pat
8720: 63 68 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ch */.#ifdef SQL
8730: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
8740: 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28  void *(*xCodec)(
8750: 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
8760: 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e  ,int); /* Routin
8770: 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e  e for en/decodin
8780: 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  g data */.  void
8790: 20 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68 6e   (*xCodecSizeChn
87a0: 67 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74  g)(void*,int,int
87b0: 29 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20  ); /* Notify of 
87c0: 70 61 67 65 20 73 69 7a 65 20 63 68 61 6e 67 65  page size change
87d0: 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  s */.  void (*xC
87e0: 6f 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a 29  odecFree)(void*)
87f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
8800: 20 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   Destructor for 
8810: 74 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76  the codec */.  v
8820: 6f 69 64 20 2a 70 43 6f 64 65 63 3b 20 20 20 20  oid *pCodec;    
8830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
8840: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
8850: 78 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64  xCodec... method
8860: 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68  s */.#endif.  ch
8870: 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20  ar *pTmpSpace;  
8880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
8890: 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65  er.pageSize byte
88a0: 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74  s of space for t
88b0: 6d 70 20 75 73 65 20 2a 2f 0a 20 20 50 43 61 63  mp use */.  PCac
88c0: 68 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20  he *pPCache;    
88d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
88e0: 65 72 20 74 6f 20 70 61 67 65 20 63 61 63 68 65  er to page cache
88f0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 69 66 6e 64   object */.#ifnd
8900: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
8910: 41 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20  AL.  Wal *pWal; 
8920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8930: 20 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64 20   /* Write-ahead 
8940: 6c 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f 75  log used by "jou
8950: 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a  rnal_mode=wal" *
8960: 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b 20  /.  char *zWal; 
8970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8980: 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 66 6f 72  /* File name for
8990: 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
89a0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
89b0: 2a 0a 2a 2a 20 49 6e 64 65 78 65 73 20 66 6f 72  *.** Indexes for
89c0: 20 75 73 65 20 77 69 74 68 20 50 61 67 65 72 2e   use with Pager.
89d0: 61 53 74 61 74 5b 5d 2e 20 54 68 65 20 50 61 67  aStat[]. The Pag
89e0: 65 72 2e 61 53 74 61 74 5b 5d 20 61 72 72 61 79  er.aStat[] array
89f0: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65   contains.** the
8a00: 20 76 61 6c 75 65 73 20 61 63 63 65 73 73 65 64   values accessed
8a10: 20 62 79 20 70 61 73 73 69 6e 67 20 53 51 4c 49   by passing SQLI
8a20: 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48  TE_DBSTATUS_CACH
8a30: 45 5f 48 49 54 2c 20 43 41 43 48 45 5f 4d 49 53  E_HIT, CACHE_MIS
8a40: 53 20 0a 2a 2a 20 6f 72 20 43 41 43 48 45 5f 57  S .** or CACHE_W
8a50: 52 49 54 45 20 74 6f 20 73 71 6c 69 74 65 33 5f  RITE to sqlite3_
8a60: 64 62 5f 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a  db_status()..*/.
8a70: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 54  #define PAGER_ST
8a80: 41 54 5f 48 49 54 20 20 20 30 0a 23 64 65 66 69  AT_HIT   0.#defi
8a90: 6e 65 20 50 41 47 45 52 5f 53 54 41 54 5f 4d 49  ne PAGER_STAT_MI
8aa0: 53 53 20 20 31 0a 23 64 65 66 69 6e 65 20 50 41  SS  1.#define PA
8ab0: 47 45 52 5f 53 54 41 54 5f 57 52 49 54 45 20 32  GER_STAT_WRITE 2
8ac0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53  .#define PAGER_S
8ad0: 54 41 54 5f 53 50 49 4c 4c 20 33 0a 0a 2f 2a 0a  TAT_SPILL 3../*.
8ae0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
8af0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
8b00: 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20  s hold counters 
8b10: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
8b20: 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c  ing purposes onl
8b30: 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  y.  These variab
8b40: 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  les do not exist
8b50: 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73   in.** a non-tes
8b60: 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65  ting build.  The
8b70: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
8b80: 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65   not thread-safe
8b90: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
8ba0: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
8bb0: 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
8bc0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
8bd0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
8be0: 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d   pages read from
8bf0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
8c00: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
8c10: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a  _count = 0;   /*
8c20: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
8c30: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
8c40: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
8c50: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
8c60: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
8c70: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
8c80: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
8c90: 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  nal */.# define 
8ca0: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76  PAGER_INCR(v)  v
8cb0: 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ++.#else.# defin
8cc0: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a  e PAGER_INCR(v).
8cd0: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
8ce0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
8cf0: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
8d00: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
8d10: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
8d20: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
8d30: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
8d40: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
8d50: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
8d60: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
8d70: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
8d80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
8d90: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
8da0: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
8db0: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
8dc0: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
8dd0: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
8de0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
8df0: 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e  being.** written
8e00: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
8e10: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
8e20: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
8e30: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
8e40: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
8e50: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
8e60: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
8e70: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
8e80: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
8e90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
8ea0: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
8eb0: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
8ec0: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
8ed0: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
8ee0: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
8ef0: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
8f00: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
8f10: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
8f20: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
8f30: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
8f40: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
8f50: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
8f60: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
8f70: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
8f80: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
8f90: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
8fa0: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
8fb0: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
8fc0: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
8fd0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
8fe0: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
8ff0: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
9000: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
9010: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
9020: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
9030: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
9040: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
9050: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
9060: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
9070: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
9080: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
9090: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
90a0: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
90b0: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
90c0: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
90d0: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
90e0: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
90f0: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
9100: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
9110: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
9120: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
9130: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
9140: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
9150: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
9160: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
9170: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
9180: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
9190: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
91a0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
91b0: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
91c0: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
91d0: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
91e0: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
91f0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
9200: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
9210: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
9220: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
9230: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
9240: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
9250: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
9260: 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63  ze of the of eac
9270: 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e  h page record in
9280: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
9290: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20  given by.** the 
92a0: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e  following macro.
92b0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
92c0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
92d0: 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67  )  ((pPager->pag
92e0: 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a  eSize) + 8)../*.
92f0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** The journal h
9300: 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74  eader size for t
9310: 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20  his pager. This 
9320: 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73  is usually the s
9330: 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20  ame .** size as 
9340: 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
9350: 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73  ctor. See also s
9360: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a  etSectorSize()..
9370: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
9380: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
9390: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
93a0: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
93b0: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
93c0: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
93d0: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
93e0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
93f0: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
9400: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
9410: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
9420: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
9430: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
9440: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
9450: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
9460: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
9470: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
9480: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
9490: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
94a0: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
94b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
94c0: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
94d0: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
94e0: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
94f0: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
9500: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
9510: 65 20 6d 61 63 72 6f 20 55 53 45 46 45 54 43 48  e macro USEFETCH
9520: 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61   is true if we a
9530: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 75 73  re allowed to us
9540: 65 20 74 68 65 20 78 46 65 74 63 68 20 61 6e 64  e the xFetch and
9550: 20 78 55 6e 66 65 74 63 68 0a 2a 2a 20 69 6e 74   xUnfetch.** int
9560: 65 72 66 61 63 65 73 20 74 6f 20 61 63 63 65 73  erfaces to acces
9570: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75  s the database u
9580: 73 69 6e 67 20 6d 65 6d 6f 72 79 2d 6d 61 70 70  sing memory-mapp
9590: 65 64 20 49 2f 4f 2e 0a 2a 2f 0a 23 69 66 20 53  ed I/O..*/.#if S
95a0: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
95b0: 49 5a 45 3e 30 0a 23 20 64 65 66 69 6e 65 20 55  IZE>0.# define U
95c0: 53 45 46 45 54 43 48 28 78 29 20 28 28 78 29 2d  SEFETCH(x) ((x)-
95d0: 3e 62 55 73 65 46 65 74 63 68 29 0a 23 65 6c 73  >bUseFetch).#els
95e0: 65 0a 23 20 64 65 66 69 6e 65 20 55 53 45 46 45  e.# define USEFE
95f0: 54 43 48 28 78 29 20 30 0a 23 65 6e 64 69 66 0a  TCH(x) 0.#endif.
9600: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
9610: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
9620: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
9630: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
9640: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
9650: 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20  47483647../*.** 
9660: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  The argument to 
9670: 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20  this macro is a 
9680: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
9690: 28 74 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69  (type sqlite3_fi
96a0: 6c 65 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  le*)..** Return 
96b0: 30 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f  0 if it is not o
96c0: 70 65 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  pen, or non-zero
96d0: 20 28 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20   (but not 1) if 
96e0: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  it is..**.** Thi
96f0: 73 20 69 73 20 73 6f 20 74 68 61 74 20 65 78 70  s is so that exp
9700: 72 65 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20  ressions can be 
9710: 77 72 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a  written as:.**.*
9720: 2a 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  *   if( isOpen(p
9730: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e  Pager->jfd) ){ .
9740: 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64  ...**.** instead
9750: 20 6f 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20   of.**.**   if( 
9760: 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65  pPager->jfd->pMe
9770: 74 68 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a  thods ){ ....*/.
9780: 23 64 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70  #define isOpen(p
9790: 46 64 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74  Fd) ((pFd)->pMet
97a0: 68 6f 64 73 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20  hods!=0)../*.** 
97b0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
97c0: 68 69 73 20 70 61 67 65 72 20 75 73 65 73 20 61  his pager uses a
97d0: 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
97e0: 20 74 6f 20 72 65 61 64 20 70 61 67 65 20 70 67   to read page pg
97f0: 6e 6f 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61  no..** Return fa
9800: 6c 73 65 20 69 66 20 74 68 65 20 70 61 67 65 72  lse if the pager
9810: 20 72 65 61 64 73 20 70 67 6e 6f 20 64 69 72 65   reads pgno dire
9820: 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61  ctly from the da
9830: 74 61 62 61 73 65 2e 0a 2a 2f 0a 23 69 66 20 21  tabase..*/.#if !
9840: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9850: 4d 49 54 5f 57 41 4c 29 20 26 26 20 64 65 66 69  MIT_WAL) && defi
9860: 6e 65 64 28 53 51 4c 49 54 45 5f 44 49 52 45 43  ned(SQLITE_DIREC
9870: 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 29  T_OVERFLOW_READ)
9880: 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
9890: 72 55 73 65 57 61 6c 28 50 61 67 65 72 20 2a 70  rUseWal(Pager *p
98a0: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
98b0: 29 7b 0a 20 20 75 33 32 20 69 52 65 61 64 20 3d  ){.  u32 iRead =
98c0: 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
98d0: 69 66 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  if( pPager->pWal
98e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
98f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61    rc = sqlite3Wa
9900: 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65  lFindFrame(pPage
9910: 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20 26  r->pWal, pgno, &
9920: 69 52 65 61 64 29 3b 0a 20 20 72 65 74 75 72 6e  iRead);.  return
9930: 20 72 63 20 7c 7c 20 69 52 65 61 64 3b 0a 7d 0a   rc || iRead;.}.
9940: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
9950: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 23  QLITE_OMIT_WAL.#
9960: 20 64 65 66 69 6e 65 20 70 61 67 65 72 55 73 65   define pagerUse
9970: 57 61 6c 28 78 29 20 28 28 78 29 2d 3e 70 57 61  Wal(x) ((x)->pWa
9980: 6c 21 3d 30 29 0a 23 65 6c 73 65 0a 23 20 64 65  l!=0).#else.# de
9990: 66 69 6e 65 20 70 61 67 65 72 55 73 65 57 61 6c  fine pagerUseWal
99a0: 28 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70  (x) 0.# define p
99b0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 57 61 6c 28  agerRollbackWal(
99c0: 78 29 20 30 0a 23 20 64 65 66 69 6e 65 20 70 61  x) 0.# define pa
99d0: 67 65 72 57 61 6c 46 72 61 6d 65 73 28 76 2c 77  gerWalFrames(v,w
99e0: 2c 78 2c 79 29 20 30 0a 23 20 64 65 66 69 6e 65  ,x,y) 0.# define
99f0: 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
9a00: 72 65 73 65 6e 74 28 7a 29 20 53 51 4c 49 54 45  resent(z) SQLITE
9a10: 5f 4f 4b 0a 23 20 64 65 66 69 6e 65 20 70 61 67  _OK.# define pag
9a20: 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e 73  erBeginReadTrans
9a30: 61 63 74 69 6f 6e 28 7a 29 20 53 51 4c 49 54 45  action(z) SQLITE
9a40: 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  _OK.#endif..#ifn
9a50: 64 65 66 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a  def NDEBUG ./*.*
9a60: 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20  * Usage:.**.**  
9a70: 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
9a80: 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
9a90: 65 72 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69  er) );.**.** Thi
9aa0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 75 6e 73 20  s function runs 
9ab0: 6d 61 6e 79 20 61 73 73 65 72 74 73 20 74 6f 20  many asserts to 
9ac0: 74 72 79 20 74 6f 20 66 69 6e 64 20 69 6e 63 6f  try to find inco
9ad0: 6e 73 69 73 74 65 6e 63 69 65 73 20 69 6e 0a 2a  nsistencies in.*
9ae0: 2a 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  * the internal s
9af0: 74 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65  tate of the Page
9b00: 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  r object..*/.sta
9b10: 74 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f 70  tic int assert_p
9b20: 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65 72  ager_state(Pager
9b30: 20 2a 70 29 7b 0a 20 20 50 61 67 65 72 20 2a 70   *p){.  Pager *p
9b40: 50 61 67 65 72 20 3d 20 70 3b 0a 0a 20 20 2f 2a  Pager = p;..  /*
9b50: 20 53 74 61 74 65 20 6d 75 73 74 20 62 65 20 76   State must be v
9b60: 61 6c 69 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72  alid. */.  asser
9b70: 74 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  t( p->eState==PA
9b80: 47 45 52 5f 4f 50 45 4e 0a 20 20 20 20 20 20 20  GER_OPEN.       
9b90: 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41  || p->eState==PA
9ba0: 47 45 52 5f 52 45 41 44 45 52 0a 20 20 20 20 20  GER_READER.     
9bb0: 20 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d    || p->eState==
9bc0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
9bd0: 4b 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d  KED.       || p-
9be0: 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57  >eState==PAGER_W
9bf0: 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 0a 20  RITER_CACHEMOD. 
9c00: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65 53 74 61        || p->eSta
9c10: 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te==PAGER_WRITER
9c20: 5f 44 42 4d 4f 44 0a 20 20 20 20 20 20 20 7c 7c  _DBMOD.       ||
9c30: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45   p->eState==PAGE
9c40: 52 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45  R_WRITER_FINISHE
9c50: 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 65  D.       || p->e
9c60: 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52  State==PAGER_ERR
9c70: 4f 52 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  OR.  );..  /* Re
9c80: 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
9c90: 63 75 72 72 65 6e 74 20 73 74 61 74 65 2c 20 61  current state, a
9ca0: 20 74 65 6d 70 2d 66 69 6c 65 20 63 6f 6e 6e 65   temp-file conne
9cb0: 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 62 65 68  ction always beh
9cc0: 61 76 65 73 0a 20 20 2a 2a 20 61 73 20 69 66 20  aves.  ** as if 
9cd0: 69 74 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73  it has an exclus
9ce0: 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
9cf0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
9d00: 74 20 6e 65 76 65 72 20 75 70 64 61 74 65 73 0a  t never updates.
9d10: 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 67 65 2d    ** the change-
9d20: 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 2c 20 73  counter field, s
9d30: 6f 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e  o the changeCoun
9d40: 74 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 61 6c  tDone flag is al
9d50: 77 61 79 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  ways set..  */. 
9d60: 20 61 73 73 65 72 74 28 20 70 2d 3e 74 65 6d 70   assert( p->temp
9d70: 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 2d 3e 65 4c  File==0 || p->eL
9d80: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
9d90: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
9da0: 20 70 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20   p->tempFile==0 
9db0: 7c 7c 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  || pPager->chang
9dc0: 65 43 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20  eCountDone );.. 
9dd0: 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 4a 6f   /* If the useJo
9de0: 75 72 6e 61 6c 20 66 6c 61 67 20 69 73 20 63 6c  urnal flag is cl
9df0: 65 61 72 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ear, the journal
9e00: 2d 6d 6f 64 65 20 6d 75 73 74 20 62 65 20 22 4f  -mode must be "O
9e10: 46 46 22 2e 20 0a 20 20 2a 2a 20 41 6e 64 20 69  FF". .  ** And i
9e20: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  f the journal-mo
9e30: 64 65 20 69 73 20 22 4f 46 46 22 2c 20 74 68 65  de is "OFF", the
9e40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
9e50: 73 74 20 6e 6f 74 20 62 65 20 6f 70 65 6e 2e 0a  st not be open..
9e60: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
9e70: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
9e80: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
9e90: 5f 4f 46 46 20 7c 7c 20 70 2d 3e 75 73 65 4a 6f  _OFF || p->useJo
9ea0: 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
9eb0: 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  t( p->journalMod
9ec0: 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
9ed0: 4d 4f 44 45 5f 4f 46 46 20 7c 7c 20 21 69 73 4f  MODE_OFF || !isO
9ee0: 70 65 6e 28 70 2d 3e 6a 66 64 29 20 29 3b 0a 0a  pen(p->jfd) );..
9ef0: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
9f00: 4d 45 4d 44 42 20 69 6d 70 6c 69 65 73 20 6e 6f  MEMDB implies no
9f10: 53 79 6e 63 2e 20 41 6e 64 20 61 6e 20 69 6e 2d  Sync. And an in-
9f20: 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 20  memory journal. 
9f30: 53 69 6e 63 65 20 0a 20 20 2a 2a 20 74 68 69 73  Since .  ** this
9f40: 20 6d 65 61 6e 73 20 61 6e 20 69 6e 2d 6d 65 6d   means an in-mem
9f50: 6f 72 79 20 70 61 67 65 72 20 70 65 72 66 6f 72  ory pager perfor
9f60: 6d 73 20 6e 6f 20 49 4f 20 61 74 20 61 6c 6c 2c  ms no IO at all,
9f70: 20 69 74 20 63 61 6e 6e 6f 74 20 65 6e 63 6f 75   it cannot encou
9f80: 6e 74 65 72 20 0a 20 20 2a 2a 20 65 69 74 68 65  nter .  ** eithe
9f90: 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f  r SQLITE_IOERR o
9fa0: 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 75  r SQLITE_FULL du
9fb0: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  ring rollback or
9fc0: 20 77 68 69 6c 65 20 66 69 6e 61 6c 69 7a 69 6e   while finalizin
9fd0: 67 20 0a 20 20 2a 2a 20 61 20 6a 6f 75 72 6e 61  g .  ** a journa
9fe0: 6c 20 66 69 6c 65 2e 20 28 61 6c 74 68 6f 75 67  l file. (althoug
9ff0: 68 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  h the in-memory 
a000: 6a 6f 75 72 6e 61 6c 20 69 6d 70 6c 65 6d 65 6e  journal implemen
a010: 74 61 74 69 6f 6e 20 6d 61 79 20 0a 20 20 2a 2a  tation may .  **
a020: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
a030: 4f 45 52 52 5f 4e 4f 4d 45 4d 20 77 68 69 6c 65  OERR_NOMEM while
a040: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
a050: 65 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  e is being writt
a060: 65 6e 29 2e 20 49 74 20 0a 20 20 2a 2a 20 69 73  en). It .  ** is
a070: 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 70   therefore not p
a080: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 6e 20 69  ossible for an i
a090: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 20 74  n-memory pager t
a0a0: 6f 20 65 6e 74 65 72 20 74 68 65 20 45 52 52 4f  o enter the ERRO
a0b0: 52 20 0a 20 20 2a 2a 20 73 74 61 74 65 2e 0a 20  R .  ** state.. 
a0c0: 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20   */.  if( MEMDB 
a0d0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
a0e0: 69 73 4f 70 65 6e 28 70 2d 3e 66 64 29 20 29 3b  isOpen(p->fd) );
a0f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
a100: 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 20 20 61 73  noSync );.    as
a110: 73 65 72 74 28 20 70 2d 3e 6a 6f 75 72 6e 61 6c  sert( p->journal
a120: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
a130: 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20  NALMODE_OFF .   
a140: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a150: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a160: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
a170: 59 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73  Y .    );.    as
a180: 73 65 72 74 28 20 70 2d 3e 65 53 74 61 74 65 21  sert( p->eState!
a190: 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 26 26 20  =PAGER_ERROR && 
a1a0: 70 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  p->eState!=PAGER
a1b0: 5f 4f 50 45 4e 20 29 3b 0a 20 20 20 20 61 73 73  _OPEN );.    ass
a1c0: 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
a1d0: 28 70 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  (p)==0 );.  }.. 
a1e0: 20 2f 2a 20 49 66 20 63 68 61 6e 67 65 43 6f 75   /* If changeCou
a1f0: 6e 74 44 6f 6e 65 20 69 73 20 73 65 74 2c 20 61  ntDone is set, a
a200: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
a210: 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62  r greater must b
a220: 65 20 68 65 6c 64 0a 20 20 2a 2a 20 6f 6e 20 74  e held.  ** on t
a230: 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
a240: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a250: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3d  changeCountDone=
a260: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c  =0 || pPager->eL
a270: 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
a280: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
a290: 70 2d 3e 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  p->eLock!=PENDIN
a2a0: 47 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 73 77 69  G_LOCK );..  swi
a2b0: 74 63 68 28 20 70 2d 3e 65 53 74 61 74 65 20 29  tch( p->eState )
a2c0: 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  {.    case PAGER
a2d0: 5f 4f 50 45 4e 3a 0a 20 20 20 20 20 20 61 73 73  _OPEN:.      ass
a2e0: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
a2f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a300: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a310: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a320: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a330: 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
a340: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
a350: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =0 || pPager->te
a360: 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
a370: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a380: 20 50 41 47 45 52 5f 52 45 41 44 45 52 3a 0a 20   PAGER_READER:. 
a390: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a3a0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a3b0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a3c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 4c 6f 63   assert( p->eLoc
a3d0: 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k!=UNKNOWN_LOCK 
a3e0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a3f0: 20 70 2d 3e 65 4c 6f 63 6b 3e 3d 53 48 41 52 45   p->eLock>=SHARE
a400: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  D_LOCK );.      
a410: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a420: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f   PAGER_WRITER_LO
a430: 43 4b 45 44 3a 0a 20 20 20 20 20 20 61 73 73 65  CKED:.      asse
a440: 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55 4e  rt( p->eLock!=UN
a450: 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20  KNOWN_LOCK );.  
a460: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a470: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
a480: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
a490: 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  if( !pagerUseWal
a4a0: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
a4b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65      assert( p->e
a4c0: 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c  Lock>=RESERVED_L
a4d0: 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OCK );.      }. 
a4e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a4f0: 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 61  ger->dbSize==pPa
a500: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
a510: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a520: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
a530: 69 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 46  ize==pPager->dbF
a540: 69 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ileSize );.     
a550: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
a560: 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61  >dbOrigSize==pPa
a570: 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20  ger->dbHintSize 
a580: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a590: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
a5a0: 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  er==0 );.      b
a5b0: 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20  reak;..    case 
a5c0: 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43  PAGER_WRITER_CAC
a5d0: 48 45 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73  HEMOD:.      ass
a5e0: 65 72 74 28 20 70 2d 3e 65 4c 6f 63 6b 21 3d 55  ert( p->eLock!=U
a5f0: 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20  NKNOWN_LOCK );. 
a600: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a610: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a620: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a630: 20 69 66 28 20 21 70 61 67 65 72 55 73 65 57 61   if( !pagerUseWa
a640: 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
a650: 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 70 6f       /* It is po
a660: 73 73 69 62 6c 65 20 74 68 61 74 20 69 66 20 6a  ssible that if j
a670: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 20  ournal_mode=wal 
a680: 68 65 72 65 20 74 68 61 74 20 6e 65 69 74 68 65  here that neithe
a690: 72 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  r the.        **
a6a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f   journal file no
a6b0: 72 20 74 68 65 20 57 41 4c 20 66 69 6c 65 20 61  r the WAL file a
a6c0: 72 65 20 6f 70 65 6e 2e 20 54 68 69 73 20 68 61  re open. This ha
a6d0: 70 70 65 6e 73 20 64 75 72 69 6e 67 0a 20 20 20  ppens during.   
a6e0: 20 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61       ** a rollba
a6f0: 63 6b 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ck transaction t
a700: 68 61 74 20 73 77 69 74 63 68 65 73 20 66 72 6f  hat switches fro
a710: 6d 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 6f  m journal_mode=o
a720: 66 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ff.        ** to
a730: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61   journal_mode=wa
a740: 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
a750: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
a760: 3e 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44  >eLock>=RESERVED
a770: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20  _LOCK );.       
a780: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a790: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a7a0: 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72        || p->jour
a7b0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
a7c0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
a7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a7e0: 70 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  p->journalMode==
a7f0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
a800: 45 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 29  E_WAL .        )
a810: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a820: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
a830: 64 62 4f 72 69 67 53 69 7a 65 3d 3d 70 50 61 67  dbOrigSize==pPag
a840: 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
a850: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a860: 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
a870: 7a 65 3d 3d 70 50 61 67 65 72 2d 3e 64 62 48 69  ze==pPager->dbHi
a880: 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
a890: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
a8a0: 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42   PAGER_WRITER_DB
a8b0: 4d 4f 44 3a 0a 20 20 20 20 20 20 61 73 73 65 72  MOD:.      asser
a8c0: 74 28 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  t( p->eLock==EXC
a8d0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
a8e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a8f0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
a900: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
a910: 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72 55   assert( !pagerU
a920: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b  seWal(pPager) );
a930: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a940: 2d 3e 65 4c 6f 63 6b 3e 3d 45 58 43 4c 55 53 49  ->eLock>=EXCLUSI
a950: 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  VE_LOCK );.     
a960: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
a970: 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20 20  p->jfd) .       
a980: 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61      || p->journa
a990: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
a9a0: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
a9b0: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a           || p->j
a9c0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
a9d0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41  R_JOURNALMODE_WA
a9e0: 4c 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L .           ||
a9f0: 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63   (sqlite3OsDevic
aa00: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
aa10: 28 70 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  (p->fd)&SQLITE_I
aa20: 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49  OCAP_BATCH_ATOMI
aa30: 43 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  C).      );.    
aa40: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
aa50: 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c 3d 70 50  ->dbOrigSize<=pP
aa60: 61 67 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65  ager->dbHintSize
aa70: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
aa80: 0a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  ..    case PAGER
aa90: 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
aaa0: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  :.      assert( 
aab0: 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  p->eLock==EXCLUS
aac0: 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
aad0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
aae0: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
aaf0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
ab00: 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57  sert( !pagerUseW
ab10: 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  al(pPager) );.  
ab20: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
ab30: 65 6e 28 70 2d 3e 6a 66 64 29 20 0a 20 20 20 20  en(p->jfd) .    
ab40: 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6a 6f 75         || p->jou
ab50: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
ab60: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
ab70: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
ab80: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
ab90: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
aba0: 5f 57 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  _WAL .          
abb0: 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
abc0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
abd0: 69 63 73 28 70 2d 3e 66 64 29 26 53 51 4c 49 54  ics(p->fd)&SQLIT
abe0: 45 5f 49 4f 43 41 50 5f 42 41 54 43 48 5f 41 54  E_IOCAP_BATCH_AT
abf0: 4f 4d 49 43 29 0a 20 20 20 20 20 20 29 3b 0a 20  OMIC).      );. 
ac00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
ac10: 20 63 61 73 65 20 50 41 47 45 52 5f 45 52 52 4f   case PAGER_ERRO
ac20: 52 3a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  R:.      /* Ther
ac30: 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  e must be at lea
ac40: 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69  st one outstandi
ac50: 6e 67 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ng reference to 
ac60: 74 68 65 20 70 61 67 65 72 20 69 66 0a 20 20 20  the pager if.   
ac70: 20 20 20 2a 2a 20 69 6e 20 45 52 52 4f 52 20 73     ** in ERROR s
ac80: 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 20  tate. Otherwise 
ac90: 74 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  the pager should
aca0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 72   have already dr
acb0: 6f 70 70 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  opped.      ** b
acc0: 61 63 6b 20 74 6f 20 4f 50 45 4e 20 73 74 61 74  ack to OPEN stat
acd0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
ace0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
acf0: 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
ad00: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
ad10: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61  sert( sqlite3Pca
ad20: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
ad30: 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 7c  er->pPCache)>0 |
ad40: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
ad50: 6c 65 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  le );.      brea
ad60: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
ad70: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
ad80: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 2a 2f  ifndef NDEBUG */
ad90: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
ada0: 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 52 65 74  DEBUG ./*.** Ret
adb0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
adc0: 20 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c   a human readabl
add0: 65 20 73 74 72 69 6e 67 20 69 6e 20 61 20 73 74  e string in a st
ade0: 61 74 69 63 20 62 75 66 66 65 72 0a 2a 2a 20 63  atic buffer.** c
adf0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 74  ontaining the st
ae00: 61 74 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  ate of the Pager
ae10: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
ae20: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54  s an argument. T
ae30: 68 69 73 0a 2a 2a 20 69 73 20 69 6e 74 65 6e 64  his.** is intend
ae40: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 77 69  ed to be used wi
ae50: 74 68 69 6e 20 64 65 62 75 67 67 65 72 73 2e 20  thin debuggers. 
ae60: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 20  For example, as 
ae70: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a  an alternative.*
ae80: 2a 20 74 6f 20 22 70 72 69 6e 74 20 2a 70 50 61  * to "print *pPa
ae90: 67 65 72 22 20 69 6e 20 67 64 62 3a 0a 2a 2a 0a  ger" in gdb:.**.
aea0: 2a 2a 20 28 67 64 62 29 20 70 72 69 6e 74 66 20  ** (gdb) printf 
aeb0: 22 25 73 22 2c 20 70 72 69 6e 74 5f 70 61 67 65  "%s", print_page
aec0: 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 0a  r_state(pPager).
aed0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
aee0: 70 72 69 6e 74 5f 70 61 67 65 72 5f 73 74 61 74  print_pager_stat
aef0: 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 73  e(Pager *p){.  s
af00: 74 61 74 69 63 20 63 68 61 72 20 7a 52 65 74 5b  tatic char zRet[
af10: 31 30 32 34 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  1024];..  sqlite
af20: 33 5f 73 6e 70 72 69 6e 74 66 28 31 30 32 34 2c  3_snprintf(1024,
af30: 20 7a 52 65 74 2c 0a 20 20 20 20 20 20 22 46 69   zRet,.      "Fi
af40: 6c 65 6e 61 6d 65 3a 20 20 20 20 20 20 25 73 5c  lename:      %s\
af50: 6e 22 0a 20 20 20 20 20 20 22 53 74 61 74 65 3a  n".      "State:
af60: 20 20 20 20 20 20 20 20 20 25 73 20 65 72 72 43           %s errC
af70: 6f 64 65 3d 25 64 5c 6e 22 0a 20 20 20 20 20 20  ode=%d\n".      
af80: 22 4c 6f 63 6b 3a 20 20 20 20 20 20 20 20 20 20  "Lock:          
af90: 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 4c 6f 63  %s\n".      "Loc
afa0: 6b 69 6e 67 20 6d 6f 64 65 3a 20 20 6c 6f 63 6b  king mode:  lock
afb0: 69 6e 67 5f 6d 6f 64 65 3d 25 73 5c 6e 22 0a 20  ing_mode=%s\n". 
afc0: 20 20 20 20 20 22 4a 6f 75 72 6e 61 6c 20 6d 6f       "Journal mo
afd0: 64 65 3a 20 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  de:  journal_mod
afe0: 65 3d 25 73 5c 6e 22 0a 20 20 20 20 20 20 22 42  e=%s\n".      "B
aff0: 61 63 6b 69 6e 67 20 73 74 6f 72 65 3a 20 74 65  acking store: te
b000: 6d 70 46 69 6c 65 3d 25 64 20 6d 65 6d 44 62 3d  mpFile=%d memDb=
b010: 25 64 20 75 73 65 4a 6f 75 72 6e 61 6c 3d 25 64  %d useJournal=%d
b020: 5c 6e 22 0a 20 20 20 20 20 20 22 4a 6f 75 72 6e  \n".      "Journ
b030: 61 6c 3a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  al:       journa
b040: 6c 4f 66 66 3d 25 6c 6c 64 20 6a 6f 75 72 6e 61  lOff=%lld journa
b050: 6c 48 64 72 3d 25 6c 6c 64 5c 6e 22 0a 20 20 20  lHdr=%lld\n".   
b060: 20 20 20 22 53 69 7a 65 3a 20 20 20 20 20 20 20     "Size:       
b070: 20 20 20 64 62 73 69 7a 65 3d 25 64 20 64 62 4f     dbsize=%d dbO
b080: 72 69 67 53 69 7a 65 3d 25 64 20 64 62 46 69 6c  rigSize=%d dbFil
b090: 65 53 69 7a 65 3d 25 64 5c 6e 22 0a 20 20 20 20  eSize=%d\n".    
b0a0: 20 20 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65    , p->zFilename
b0b0: 0a 20 20 20 20 20 20 2c 20 70 2d 3e 65 53 74 61  .      , p->eSta
b0c0: 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 20  te==PAGER_OPEN  
b0d0: 20 20 20 20 20 20 20 20 20 20 3f 20 22 4f 50 45            ? "OPE
b0e0: 4e 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  N" :.        p->
b0f0: 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
b100: 41 44 45 52 20 20 20 20 20 20 20 20 20 20 3f 20  ADER          ? 
b110: 22 52 45 41 44 45 52 22 20 3a 0a 20 20 20 20 20  "READER" :.     
b120: 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41     p->eState==PA
b130: 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45  GER_WRITER_LOCKE
b140: 44 20 20 20 3f 20 22 57 52 49 54 45 52 5f 4c 4f  D   ? "WRITER_LO
b150: 43 4b 45 44 22 20 3a 0a 20 20 20 20 20 20 20 20  CKED" :.        
b160: 70 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  p->eState==PAGER
b170: 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
b180: 20 3f 20 22 57 52 49 54 45 52 5f 43 41 43 48 45   ? "WRITER_CACHE
b190: 4d 4f 44 22 20 3a 0a 20 20 20 20 20 20 20 20 70  MOD" :.        p
b1a0: 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f  ->eState==PAGER_
b1b0: 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 20 20 20  WRITER_DBMOD    
b1c0: 3f 20 22 57 52 49 54 45 52 5f 44 42 4d 4f 44 22  ? "WRITER_DBMOD"
b1d0: 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53   :.        p->eS
b1e0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54  tate==PAGER_WRIT
b1f0: 45 52 5f 46 49 4e 49 53 48 45 44 20 3f 20 22 57  ER_FINISHED ? "W
b200: 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44 22 20  RITER_FINISHED" 
b210: 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  :.        p->eSt
b220: 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate==PAGER_ERROR
b230: 20 20 20 20 20 20 20 20 20 20 20 3f 20 22 45 52             ? "ER
b240: 52 4f 52 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22  ROR" : "?error?"
b250: 0a 20 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d  .      , (int)p-
b260: 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 2c  >errCode.      ,
b270: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f   p->eLock==NO_LO
b280: 43 4b 20 20 20 20 20 20 20 20 20 3f 20 22 4e 4f  CK         ? "NO
b290: 5f 4c 4f 43 4b 22 20 3a 0a 20 20 20 20 20 20 20  _LOCK" :.       
b2a0: 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 53 45 52   p->eLock==RESER
b2b0: 56 45 44 5f 4c 4f 43 4b 20 20 20 3f 20 22 52 45  VED_LOCK   ? "RE
b2c0: 53 45 52 56 45 44 22 20 3a 0a 20 20 20 20 20 20  SERVED" :.      
b2d0: 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43 4c    p->eLock==EXCL
b2e0: 55 53 49 56 45 5f 4c 4f 43 4b 20 20 3f 20 22 45  USIVE_LOCK  ? "E
b2f0: 58 43 4c 55 53 49 56 45 22 20 3a 0a 20 20 20 20  XCLUSIVE" :.    
b300: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 53 48      p->eLock==SH
b310: 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 3f 20  ARED_LOCK     ? 
b320: 22 53 48 41 52 45 44 22 20 3a 0a 20 20 20 20 20  "SHARED" :.     
b330: 20 20 20 70 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b     p->eLock==UNK
b340: 4e 4f 57 4e 5f 4c 4f 43 4b 20 20 20 20 3f 20 22  NOWN_LOCK    ? "
b350: 55 4e 4b 4e 4f 57 4e 22 20 3a 20 22 3f 65 72 72  UNKNOWN" : "?err
b360: 6f 72 3f 22 0a 20 20 20 20 20 20 2c 20 70 2d 3e  or?".      , p->
b370: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3f 20  exclusiveMode ? 
b380: 22 65 78 63 6c 75 73 69 76 65 22 20 3a 20 22 6e  "exclusive" : "n
b390: 6f 72 6d 61 6c 22 0a 20 20 20 20 20 20 2c 20 70  ormal".      , p
b3a0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b3b0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b3c0: 5f 4d 45 4d 4f 52 59 20 20 20 3f 20 22 6d 65 6d  _MEMORY   ? "mem
b3d0: 6f 72 79 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ory" :.        p
b3e0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b3f0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b400: 5f 4f 46 46 20 20 20 20 20 20 3f 20 22 6f 66 66  _OFF      ? "off
b410: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
b420: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
b430: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
b440: 4c 45 54 45 20 20 20 3f 20 22 64 65 6c 65 74 65  LETE   ? "delete
b450: 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e 6a  " :.        p->j
b460: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
b470: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
b480: 52 53 49 53 54 20 20 3f 20 22 70 65 72 73 69 73  RSIST  ? "persis
b490: 74 22 20 3a 0a 20 20 20 20 20 20 20 20 70 2d 3e  t" :.        p->
b4a0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
b4b0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
b4c0: 52 55 4e 43 41 54 45 20 3f 20 22 74 72 75 6e 63  RUNCATE ? "trunc
b4d0: 61 74 65 22 20 3a 0a 20 20 20 20 20 20 20 20 70  ate" :.        p
b4e0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
b4f0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
b500: 5f 57 41 4c 20 20 20 20 20 20 3f 20 22 77 61 6c  _WAL      ? "wal
b510: 22 20 3a 20 22 3f 65 72 72 6f 72 3f 22 0a 20 20  " : "?error?".  
b520: 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 74 65      , (int)p->te
b530: 6d 70 46 69 6c 65 2c 20 28 69 6e 74 29 70 2d 3e  mpFile, (int)p->
b540: 6d 65 6d 44 62 2c 20 28 69 6e 74 29 70 2d 3e 75  memDb, (int)p->u
b550: 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  seJournal.      
b560: 2c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  , p->journalOff,
b570: 20 70 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 0a 20   p->journalHdr. 
b580: 20 20 20 20 20 2c 20 28 69 6e 74 29 70 2d 3e 64       , (int)p->d
b590: 62 53 69 7a 65 2c 20 28 69 6e 74 29 70 2d 3e 64  bSize, (int)p->d
b5a0: 62 4f 72 69 67 53 69 7a 65 2c 20 28 69 6e 74 29  bOrigSize, (int)
b5b0: 70 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20  p->dbFileSize.  
b5c0: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 7a 52 65  );..  return zRe
b5d0: 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  t;.}.#endif../* 
b5e0: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
b5f0: 65 73 20 74 6f 20 74 68 65 20 76 61 72 69 6f 75  es to the variou
b600: 73 20 70 61 67 65 20 67 65 74 74 65 72 73 20 2a  s page getters *
b610: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
b620: 50 61 67 65 4e 6f 72 6d 61 6c 28 50 61 67 65 72  PageNormal(Pager
b630: 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c  *,Pgno,DbPage**,
b640: 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
b650: 20 67 65 74 50 61 67 65 45 72 72 6f 72 28 50 61   getPageError(Pa
b660: 67 65 72 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65  ger*,Pgno,DbPage
b670: 2a 2a 2c 69 6e 74 29 3b 0a 23 69 66 20 53 51 4c  **,int);.#if SQL
b680: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
b690: 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74 20 67  E>0.static int g
b6a0: 65 74 50 61 67 65 4d 4d 61 70 28 50 61 67 65 72  etPageMMap(Pager
b6b0: 2a 2c 50 67 6e 6f 2c 44 62 50 61 67 65 2a 2a 2c  *,Pgno,DbPage**,
b6c0: 69 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  int);.#endif../*
b6d0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 50 61 67 65  .** Set the Page
b6e0: 72 2e 78 47 65 74 20 6d 65 74 68 6f 64 20 66 6f  r.xGet method fo
b6f0: 72 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  r the appropriat
b700: 65 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74  e routine used t
b710: 6f 20 66 65 74 63 68 0a 2a 2a 20 63 6f 6e 74 65  o fetch.** conte
b720: 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  nt from the page
b730: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
b740: 64 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f  d setGetterMetho
b750: 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  d(Pager *pPager)
b760: 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
b770: 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 70  errCode ){.    p
b780: 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20 67 65  Pager->xGet = ge
b790: 74 50 61 67 65 45 72 72 6f 72 3b 0a 23 69 66 20  tPageError;.#if 
b7a0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
b7b0: 53 49 5a 45 3e 30 0a 20 20 7d 65 6c 73 65 20 69  SIZE>0.  }else i
b7c0: 66 28 20 55 53 45 46 45 54 43 48 28 70 50 61 67  f( USEFETCH(pPag
b7d0: 65 72 29 0a 23 69 66 64 65 66 20 53 51 4c 49 54  er).#ifdef SQLIT
b7e0: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 26  E_HAS_CODEC.   &
b7f0: 26 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63  & pPager->xCodec
b800: 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a  ==0.#endif.  ){.
b810: 20 20 20 20 70 50 61 67 65 72 2d 3e 78 47 65 74      pPager->xGet
b820: 20 3d 20 67 65 74 50 61 67 65 4d 4d 61 70 3b 0a   = getPageMMap;.
b830: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
b840: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
b850: 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
b860: 20 70 50 61 67 65 72 2d 3e 78 47 65 74 20 3d 20   pPager->xGet = 
b870: 67 65 74 50 61 67 65 4e 6f 72 6d 61 6c 3b 0a 20  getPageNormal;. 
b880: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
b890: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73  rn true if it is
b8a0: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72   necessary to wr
b8b0: 69 74 65 20 70 61 67 65 20 2a 70 50 67 20 69 6e  ite page *pPg in
b8c0: 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
b8d0: 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65  al..** A page ne
b8e0: 65 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65  eds to be writte
b8f0: 6e 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  n into the sub-j
b900: 6f 75 72 6e 61 6c 20 69 66 20 74 68 65 72 65 20  ournal if there 
b910: 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72  exists one.** or
b920: 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61 76 65 70   more open savep
b930: 6f 69 6e 74 73 20 66 6f 72 20 77 68 69 63 68 3a  oints for which:
b940: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70  .**.**   * The p
b950: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65  age-number is le
b960: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
b970: 20 74 6f 20 50 61 67 65 72 53 61 76 65 70 6f 69   to PagerSavepoi
b980: 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a  nt.nOrig, and.**
b990: 20 20 20 2a 20 54 68 65 20 62 69 74 20 63 6f 72     * The bit cor
b9a0: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
b9b0: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
b9c0: 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20   not set in.**  
b9d0: 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
b9e0: 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a  t.pInSavepoint..
b9f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
ba00: 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 50  bjRequiresPage(P
ba10: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
ba20: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
ba30: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 61 67  g->pPager;.  Pag
ba40: 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 3b 0a  erSavepoint *p;.
ba50: 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
ba60: 67 2d 3e 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 69  g->pgno;.  int i
ba70: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
ba80: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
ba90: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  t; i++){.    p =
baa0: 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
bab0: 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28  oint[i];.    if(
bac0: 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20   p->nOrig>=pgno 
bad0: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74  && 0==sqlite3Bit
bae0: 76 65 63 54 65 73 74 4e 6f 74 4e 75 6c 6c 28 70  vecTestNotNull(p
baf0: 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20  ->pInSavepoint, 
bb00: 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 72  pgno) ){.      r
bb10: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
bb20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
bb30: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
bb40: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
bb50: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70  rn true if the p
bb60: 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
bb70: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
bb80: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
bb90: 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  t pageInJournal(
bba0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
bbb0: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65  gHdr *pPg){.  re
bbc0: 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76  turn sqlite3Bitv
bbd0: 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
bbe0: 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
bbf0: 70 67 6e 6f 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  pgno);.}.#endif.
bc00: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32  ./*.** Read a 32
bc10: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f  -bit integer fro
bc20: 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  m the given file
bc30: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74   descriptor.  St
bc40: 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a  ore the integer.
bc50: 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20  ** that is read 
bc60: 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72  in *pRes.  Retur
bc70: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
bc80: 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64  verything worked
bc90: 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  , or an.** error
bca0: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
bcb0: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
bcc0: 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20  *.** All values 
bcd0: 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69  are stored on di
bce0: 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e  sk as big-endian
bcf0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bd00: 72 65 61 64 33 32 62 69 74 73 28 73 71 6c 69 74  read32bits(sqlit
bd10: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
bd20: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52   offset, u32 *pR
bd30: 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  es){.  unsigned 
bd40: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e  char ac[4];.  in
bd50: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  t rc = sqlite3Os
bd60: 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a  Read(fd, ac, siz
bd70: 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29  eof(ac), offset)
bd80: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
bd90: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
bda0: 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34  es = sqlite3Get4
bdb0: 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20  byte(ac);.  }.  
bdc0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
bdd0: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
bde0: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
bdf0: 61 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 20  a string buffer 
be00: 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79  in big-endian by
be10: 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65  te order..*/.#de
be20: 66 69 6e 65 20 70 75 74 33 32 62 69 74 73 28 41  fine put32bits(A
be30: 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75 74 34  ,B)  sqlite3Put4
be40: 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a  byte((u8*)A,B)..
be50: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
be60: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
be70: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  to the given fil
be80: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52  e descriptor.  R
be90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
bea0: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  ** on success or
beb0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
bec0: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
bed0: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
bee0: 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69 74  c int write32bit
bef0: 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
bf00: 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  fd, i64 offset, 
bf10: 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61 72  u32 val){.  char
bf20: 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62   ac[4];.  put32b
bf30: 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20  its(ac, val);.  
bf40: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
bf50: 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 2c  Write(fd, ac, 4,
bf60: 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a   offset);.}../*.
bf70: 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ** Unlock the da
bf80: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6c  tabase file to l
bf90: 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77 68 69 63  evel eLock, whic
bfa0: 68 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  h must be either
bfb0: 20 4e 4f 5f 4c 4f 43 4b 0a 2a 2a 20 6f 72 20 53   NO_LOCK.** or S
bfc0: 48 41 52 45 44 5f 4c 4f 43 4b 2e 20 52 65 67 61  HARED_LOCK. Rega
bfd0: 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
bfe0: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 63 61 6c  r or not the cal
bff0: 6c 20 74 6f 20 78 55 6e 6c 6f 63 6b 28 29 0a 2a  l to xUnlock().*
c000: 2a 20 73 75 63 63 65 65 64 73 2c 20 73 65 74 20  * succeeds, set 
c010: 74 68 65 20 50 61 67 65 72 2e 65 4c 6f 63 6b 20  the Pager.eLock 
c020: 76 61 72 69 61 62 6c 65 20 74 6f 20 6d 61 74 63  variable to matc
c030: 68 20 74 68 65 20 28 61 74 74 65 6d 70 74 65 64  h the (attempted
c040: 29 20 6e 65 77 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  ) new lock..**.*
c050: 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61 67  * Except, if Pag
c060: 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74 20  er.eLock is set 
c070: 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  to UNKNOWN_LOCK 
c080: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
c090: 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c  on is.** called,
c0a0: 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79 20 69   do not modify i
c0b0: 74 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d 65  t. See the comme
c0c0: 6e 74 20 61 62 6f 76 65 20 74 68 65 20 23 64 65  nt above the #de
c0d0: 66 69 6e 65 20 6f 66 20 0a 2a 2a 20 55 4e 4b 4e  fine of .** UNKN
c0e0: 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e 20  OWN_LOCK for an 
c0f0: 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74  explanation of t
c100: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  his..*/.static i
c110: 6e 74 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62  nt pagerUnlockDb
c120: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
c130: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  int eLock){.  in
c140: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c150: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  ;..  assert( !pP
c160: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
c170: 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ode || pPager->e
c180: 4c 6f 63 6b 3d 3d 65 4c 6f 63 6b 20 29 3b 0a 20  Lock==eLock );. 
c190: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
c1a0: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  NO_LOCK || eLock
c1b0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
c1c0: 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b  .  assert( eLock
c1d0: 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 61 67  !=NO_LOCK || pag
c1e0: 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
c1f0: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f  ==0 );.  if( isO
c200: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
c210: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
c220: 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c  Pager->eLock>=eL
c230: 6f 63 6b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ock );.    rc = 
c240: 70 50 61 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f  pPager->noLock ?
c250: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c   SQLITE_OK : sql
c260: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
c270: 67 65 72 2d 3e 66 64 2c 20 65 4c 6f 63 6b 29 3b  ger->fd, eLock);
c280: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
c290: 3e 65 4c 6f 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f  >eLock!=UNKNOWN_
c2a0: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
c2b0: 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 28 75  ager->eLock = (u
c2c0: 38 29 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  8)eLock;.    }. 
c2d0: 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c     IOTRACE(("UNL
c2e0: 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
c2f0: 61 67 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20  ager, eLock)).  
c300: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
c310: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
c320: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
c330: 6f 20 6c 65 76 65 6c 20 65 4c 6f 63 6b 2c 20 77  o level eLock, w
c340: 68 69 63 68 20 6d 75 73 74 20 62 65 20 65 69 74  hich must be eit
c350: 68 65 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c  her SHARED_LOCK,
c360: 0a 2a 2a 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  .** RESERVED_LOC
c370: 4b 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  K or EXCLUSIVE_L
c380: 4f 43 4b 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  OCK. If the call
c390: 65 72 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  er is successful
c3a0: 2c 20 73 65 74 20 74 68 65 0a 2a 2a 20 50 61 67  , set the.** Pag
c3b0: 65 72 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c  er.eLock variabl
c3c0: 65 20 74 6f 20 74 68 65 20 6e 65 77 20 6c 6f 63  e to the new loc
c3d0: 6b 69 6e 67 20 73 74 61 74 65 2e 20 0a 2a 2a 0a  king state. .**.
c3e0: 2a 2a 20 45 78 63 65 70 74 2c 20 69 66 20 50 61  ** Except, if Pa
c3f0: 67 65 72 2e 65 4c 6f 63 6b 20 69 73 20 73 65 74  ger.eLock is set
c400: 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b   to UNKNOWN_LOCK
c410: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
c420: 69 6f 6e 20 69 73 20 0a 2a 2a 20 63 61 6c 6c 65  ion is .** calle
c430: 64 2c 20 64 6f 20 6e 6f 74 20 6d 6f 64 69 66 79  d, do not modify
c440: 20 69 74 20 75 6e 6c 65 73 73 20 74 68 65 20 6e   it unless the n
c450: 65 77 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65  ew locking state
c460: 20 69 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   is EXCLUSIVE_LO
c470: 43 4b 2e 20 0a 2a 2a 20 53 65 65 20 74 68 65 20  CK. .** See the 
c480: 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 74 68  comment above th
c490: 65 20 23 64 65 66 69 6e 65 20 6f 66 20 55 4e 4b  e #define of UNK
c4a0: 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f 72 20 61 6e  NOWN_LOCK for an
c4b0: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 0a 2a 2a   explanation .**
c4c0: 20 6f 66 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61   of this..*/.sta
c4d0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 4c 6f 63  tic int pagerLoc
c4e0: 6b 44 62 28 50 61 67 65 72 20 2a 70 50 61 67 65  kDb(Pager *pPage
c4f0: 72 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  r, int eLock){. 
c500: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c510: 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
c520: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
c530: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 52 45 53  CK || eLock==RES
c540: 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  ERVED_LOCK || eL
c550: 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
c560: 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61  OCK );.  if( pPa
c570: 67 65 72 2d 3e 65 4c 6f 63 6b 3c 65 4c 6f 63 6b  ger->eLock<eLock
c580: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63   || pPager->eLoc
c590: 6b 3d 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20  k==UNKNOWN_LOCK 
c5a0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
c5b0: 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3f 20 53 51 4c  er->noLock ? SQL
c5c0: 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33  ITE_OK : sqlite3
c5d0: 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
c5e0: 64 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 69  d, eLock);.    i
c5f0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
c600: 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f   && (pPager->eLo
c610: 63 6b 21 3d 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b  ck!=UNKNOWN_LOCK
c620: 7c 7c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ||eLock==EXCLUSI
c630: 56 45 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  VE_LOCK) ){.    
c640: 20 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20    pPager->eLock 
c650: 3d 20 28 75 38 29 65 4c 6f 63 6b 3b 0a 20 20 20  = (u8)eLock;.   
c660: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43     IOTRACE(("LOC
c670: 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  K %p %d\n", pPag
c680: 65 72 2c 20 65 4c 6f 63 6b 29 29 0a 20 20 20 20  er, eLock)).    
c690: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
c6a0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
c6b0: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
c6c0: 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20  ines whether or 
c6d0: 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  not the atomic-w
c6e0: 72 69 74 65 20 6f 72 0a 2a 2a 20 61 74 6f 6d 69  rite or.** atomi
c6f0: 63 2d 62 61 74 63 68 2d 77 72 69 74 65 20 6f 70  c-batch-write op
c700: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 63 61 6e 20  timizations can 
c710: 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69  be used with thi
c720: 73 20 70 61 67 65 72 2e 20 54 68 65 0a 2a 2a 20  s pager. The.** 
c730: 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
c740: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
c750: 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20   used if:.**.** 
c760: 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72   (a) the value r
c770: 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76  eturned by OsDev
c780: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
c790: 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74  cs() indicates t
c7a0: 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61  hat.**      a da
c7b0: 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20  tabase page may 
c7c0: 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
c7d0: 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28  cally, and.**  (
c7e0: 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  b) the value ret
c7f0: 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f  urned by OsSecto
c800: 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20  rSize() is less 
c810: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
c820: 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67        to the pag
c830: 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e size..**.** If
c840: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
c850: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
c860: 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
c870: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
c880: 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65  nal .** file whe
c890: 6e 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 72 6f  n it contains ro
c8a0: 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20  llback data for 
c8b0: 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65  exactly one page
c8c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 74 6f 6d  ..**.** The atom
c8d0: 69 63 2d 62 61 74 63 68 2d 77 72 69 74 65 20 6f  ic-batch-write o
c8e0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
c8f0: 62 65 20 75 73 65 64 20 69 66 20 4f 73 44 65 76  be used if OsDev
c900: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
c910: 63 73 28 29 0a 2a 2a 20 72 65 74 75 72 6e 73 20  cs().** returns 
c920: 61 20 76 61 6c 75 65 20 77 69 74 68 20 74 68 65  a value with the
c930: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41   SQLITE_IOCAP_BA
c940: 54 43 48 5f 41 54 4f 4d 49 43 20 62 69 74 20 73  TCH_ATOMIC bit s
c950: 65 74 2e 20 2d 31 20 69 73 0a 2a 2a 20 72 65 74  et. -1 is.** ret
c960: 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  urned in this ca
c970: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 65 69  se..**.** If nei
c980: 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ther optimizatio
c990: 6e 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20 30  n can be used, 0
c9a0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
c9b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c  .static int jrnl
c9c0: 42 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72  BufferSize(Pager
c9d0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
c9e0: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 0a  ert( !MEMDB );..
c9f0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
ca00: 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
ca10: 5f 57 52 49 54 45 29 20 5c 0a 20 7c 7c 20 64 65  _WRITE) \. || de
ca20: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
ca30: 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  BLE_BATCH_ATOMIC
ca40: 5f 57 52 49 54 45 29 0a 20 20 69 6e 74 20 64 63  _WRITE).  int dc
ca50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
ca70: 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
ca80: 73 74 69 63 73 20 2a 2f 0a 0a 20 20 61 73 73 65  stics */..  asse
ca90: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
caa0: 72 2d 3e 66 64 29 20 29 3b 0a 20 20 64 63 20 3d  r->fd) );.  dc =
cab0: 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
cac0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
cad0: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 23 65 6c  pPager->fd);.#el
cae0: 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
caf0: 4d 45 54 45 52 28 70 50 61 67 65 72 29 3b 0a 23  METER(pPager);.#
cb00: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
cb10: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43  LITE_ENABLE_BATC
cb20: 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  H_ATOMIC_WRITE. 
cb30: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
cb40: 69 7a 65 3e 30 20 26 26 20 28 64 63 26 53 51 4c  ize>0 && (dc&SQL
cb50: 49 54 45 5f 49 4f 43 41 50 5f 42 41 54 43 48 5f  ITE_IOCAP_BATCH_
cb60: 41 54 4f 4d 49 43 29 20 29 7b 0a 20 20 20 20 72  ATOMIC) ){.    r
cb70: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65  eturn -1;.  }.#e
cb80: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
cb90: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
cba0: 43 5f 57 52 49 54 45 0a 20 20 7b 0a 20 20 20 20  C_WRITE.  {.    
cbb0: 69 6e 74 20 6e 53 65 63 74 6f 72 20 3d 20 70 50  int nSector = pP
cbc0: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
cbd0: 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67 65  ;.    int szPage
cbe0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
cbf0: 69 7a 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  ize;..    assert
cc00: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
cc10: 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
cc20: 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53  ));.    assert(S
cc30: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
cc40: 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38  IC64K==(65536>>8
cc50: 29 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28  ));.    if( 0==(
cc60: 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  dc&(SQLITE_IOCAP
cc70: 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e  _ATOMIC|(szPage>
cc80: 3e 38 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e  >8)) || nSector>
cc90: 73 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20  szPage) ){.     
cca0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
ccb0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a  .  }..  return J
ccc0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
ccd0: 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f  ager) + JOURNAL_
cce0: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 23  PG_SZ(pPager);.#
ccf0: 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
cd00: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53  0;.}../*.** If S
cd10: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
cd20: 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65  S is defined the
cd30: 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e  n we do some san
cd40: 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20  ity checking.** 
cd50: 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69  on the cache usi
cd60: 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69  ng a hash functi
cd70: 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  on.  This is use
cd80: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a  d for testing.**
cd90: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
cda0: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nly..*/.#ifdef S
cdb0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
cdc0: 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  S./*.** Return a
cdd0: 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20   32-bit hash of 
cde0: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f  the page data fo
cdf0: 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  r pPage..*/.stat
ce00: 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74  ic u32 pager_dat
ce10: 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c  ahash(int nByte,
ce20: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
ce30: 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61  pData){.  u32 ha
ce40: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
ce50: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42  .  for(i=0; i<nB
ce60: 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68  yte; i++){.    h
ce70: 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39  ash = (hash*1039
ce80: 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20  ) + pData[i];.  
ce90: 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b  }.  return hash;
cea0: 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  .}.static u32 pa
ceb0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48  ger_pagehash(PgH
cec0: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  dr *pPage){.  re
ced0: 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68  turn pager_datah
cee0: 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65  ash(pPage->pPage
cef0: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e  r->pageSize, (un
cf00: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50  signed char *)pP
cf10: 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73  age->pData);.}.s
cf20: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
cf30: 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67  _set_pagehash(Pg
cf40: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70  Hdr *pPage){.  p
cf50: 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d  Page->pageHash =
cf60: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
cf70: 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage);.}../*.**
cf80: 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20   The CHECK_PAGE 
cf90: 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67  macro takes a Pg
cfa0: 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  Hdr* as an argum
cfb0: 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43  ent. If SQLITE_C
cfc0: 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73  HECK_PAGES.** is
cfd0: 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44   defined, and ND
cfe0: 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69  EBUG is not defi
cff0: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
d000: 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b   statement check
d010: 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  s.** that the pa
d020: 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72  ge is either dir
d030: 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63  ty or still matc
d040: 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74  hes the calculat
d050: 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f  ed page-hash..*/
d060: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
d070: 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65  AGE(x) checkPage
d080: 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  (x).static void 
d090: 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20  checkPage(PgHdr 
d0a0: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
d0b0: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
d0c0: 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
d0d0: 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21 3d  pPager->eState!=
d0e0: 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20  PAGER_ERROR );. 
d0f0: 20 61 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66   assert( (pPg->f
d100: 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
d110: 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61  ) || pPg->pageHa
d120: 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61  sh==pager_pageha
d130: 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65  sh(pPg) );.}..#e
d140: 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65  lse.#define page
d150: 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20  r_datahash(X,Y) 
d160: 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72   0.#define pager
d170: 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a  _pagehash(X)  0.
d180: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 73 65  #define pager_se
d190: 74 5f 70 61 67 65 68 61 73 68 28 58 29 0a 23 64  t_pagehash(X).#d
d1a0: 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45  efine CHECK_PAGE
d1b0: 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53  (x).#endif  /* S
d1c0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
d1d0: 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  S */../*.** When
d1e0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
d1f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d200: 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
d210: 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a  r must be open..
d220: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
d230: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 61   attempts to rea
d240: 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  d a master journ
d250: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f  al file name fro
d260: 6d 20 74 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66  m the .** end of
d270: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 2c 20 69   the file and, i
d280: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 63 6f  f successful, co
d290: 70 69 65 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d  pies it into mem
d2a0: 6f 72 79 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a  ory supplied .**
d2b0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
d2c0: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
d2d0: 76 65 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  ve writeMasterJo
d2e0: 75 72 6e 61 6c 28 29 20 66 6f 72 20 74 68 65 20  urnal() for the 
d2f0: 66 6f 72 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74  format.** used t
d300: 6f 20 73 74 6f 72 65 20 61 20 6d 61 73 74 65 72  o store a master
d310: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
d320: 6d 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  me at the end of
d330: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
d340: 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d  .**.** zMaster m
d350: 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
d360: 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73  uffer of at leas
d370: 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20  t nMaster bytes 
d380: 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
d390: 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73  the caller. This
d3a0: 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74   should be sqlit
d3b0: 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
d3c0: 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74  e+1 (to ensure t
d3d0: 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67  here is.** enoug
d3e0: 68 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65  h space to write
d3f0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
d400: 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68  nal name). If th
d410: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
d420: 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  .** name in the 
d430: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65  journal is longe
d440: 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62  r than nMaster b
d450: 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  ytes (including 
d460: 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  a.** nul-termina
d470: 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20  tor), then this 
d480: 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66  is handled as if
d490: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
d4a0: 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20  al name.** were 
d4b0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a  present in the j
d4c0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
d4d0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
d4e0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70  l file name is p
d4f0: 72 65 73 65 6e 74 20 61 74 20 74 68 65 20 65 6e  resent at the en
d500: 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d of the journal
d510: 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  .** file, then i
d520: 74 20 69 73 20 63 6f 70 69 65 64 20 69 6e 74 6f  t is copied into
d530: 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
d540: 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
d550: 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d  r. A.** nul-term
d560: 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20 61  inator byte is a
d570: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62  ppended to the b
d580: 75 66 66 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  uffer following 
d590: 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  the master.** jo
d5a0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e  urnal file name.
d5b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  .**.** If it is 
d5c0: 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
d5d0: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
d5e0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70  l file name is p
d5f0: 72 65 73 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74  resent .** zMast
d600: 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f 20  er[0] is set to 
d610: 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  0 and SQLITE_OK 
d620: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
d630: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
d640: 72 73 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  rs while reading
d650: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
d660: 6c 20 66 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74  l file, an SQLit
d670: 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  e.** error code 
d680: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
d690: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d  static int readM
d6a0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c  asterJournal(sql
d6b0: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c  ite3_file *pJrnl
d6c0: 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c  , char *zMaster,
d6d0: 20 75 33 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20   u32 nMaster){. 
d6e0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
d6f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
d700: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
d710: 75 33 32 20 6c 65 6e 3b 20 20 20 20 20 20 20 20  u32 len;        
d720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
d730: 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 6f 66  ngth in bytes of
d740: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
d750: 6e 61 6d 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a  name */.  i64 sz
d760: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
d770: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
d780: 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6a  ze in bytes of j
d790: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e  ournal file pJrn
d7a0: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
d7b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d7c0: 20 20 2f 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d    /* MJ checksum
d7d0: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
d7e0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
d7f0: 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  2 u;            
d800: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
d810: 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
d820: 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  r */.  unsigned 
d830: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
d840: 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f    /* A buffer to
d850: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
d860: 68 65 61 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73  header */.  zMas
d870: 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a  ter[0] = '\0';..
d880: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
d890: 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
d8a0: 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20  FileSize(pJrnl, 
d8b0: 26 73 7a 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a  &szJ)).   || szJ
d8c0: 3c 31 36 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  <16.   || SQLITE
d8d0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
d8e0: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
d8f0: 2d 31 36 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c  -16, &len)).   |
d900: 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a  | len>=nMaster .
d910: 20 20 20 7c 7c 20 6c 65 6e 3e 73 7a 4a 2d 31 36     || len>szJ-16
d920: 0a 20 20 20 7c 7c 20 6c 65 6e 3d 3d 30 20 0a 20  .   || len==0 . 
d930: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
d940: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
d950: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20  (pJrnl, szJ-12, 
d960: 26 63 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53  &cksum)).   || S
d970: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
d980: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
d990: 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20  rnl, aMagic, 8, 
d9a0: 73 7a 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65  szJ-8)).   || me
d9b0: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
d9c0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20  urnalMagic, 8). 
d9d0: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
d9e0: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52  (rc = sqlite3OsR
d9f0: 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74  ead(pJrnl, zMast
da00: 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d  er, len, szJ-16-
da10: 6c 65 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  len)).  ){.    r
da20: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
da30: 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63   /* See if the c
da40: 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20  hecksum matches 
da50: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
da60: 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72  al name */.  for
da70: 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b  (u=0; u<len; u++
da80: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20  ){.    cksum -= 
da90: 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a  zMaster[u];.  }.
daa0: 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20    if( cksum ){. 
dab0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65     /* If the che
dac0: 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64  cksum doesn't ad
dad0: 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f  d up, then one o
dae0: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69  r more of the di
daf0: 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a  sk sectors.    *
db00: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
db10: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
db20: 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72  filename is corr
db30: 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e  upted. This mean
db40: 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74  s.    ** definit
db50: 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73  ely roll back, s
db60: 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  o just return SQ
db70: 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f  LITE_OK and repo
db80: 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a  rt a (nul).    *
db90: 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  * master-journal
dba0: 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a   filename..    *
dbb0: 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20  /.    len = 0;. 
dbc0: 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e   }.  zMaster[len
dbd0: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20  ] = '\0';.   .  
dbe0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
dbf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
dc00: 6e 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20  n the offset of 
dc10: 74 68 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  the sector bound
dc20: 61 72 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69  ary at or immedi
dc30: 61 74 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  ately .** follow
dc40: 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ing the value in
dc50: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
dc60: 4f 66 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20  Off, assuming a 
dc70: 73 65 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20  sector .** size 
dc80: 6f 66 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  of pPager->secto
dc90: 72 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a  rSize bytes..**.
dca0: 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63  ** i.e for a sec
dcb0: 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a  tor size of 512:
dcc0: 0a 2a 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a  .**.**   Pager.j
dcd0: 6f 75 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20  ournalOff       
dce0: 20 20 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a     Return value.
dcf0: 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
dd00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
dd20: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a              0.**
dd40: 20 20 20 35 31 32 20 20 20 20 20 20 20 20 20 20     512          
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
dd60: 0a 2a 2a 20 20 20 31 30 30 20 20 20 20 20 20 20  .**   100       
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd80: 35 31 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20  512.**   2000   
dd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dda0: 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73     2048.** .*/.s
ddb0: 74 61 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61  tatic i64 journa
ddc0: 6c 48 64 72 4f 66 66 73 65 74 28 50 61 67 65 72  lHdrOffset(Pager
ddd0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
dde0: 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69   offset = 0;.  i
ddf0: 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a  64 c = pPager->j
de00: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28  ournalOff;.  if(
de10: 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74   c ){.    offset
de20: 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41   = ((c-1)/JOURNA
de30: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
de40: 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f   + 1) * JOURNAL_
de50: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
de60: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66    }.  assert( of
de70: 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52  fset%JOURNAL_HDR
de80: 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29  _SZ(pPager)==0 )
de90: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
dea0: 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72  et>=c );.  asser
deb0: 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f  t( (offset-c)<JO
dec0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
ded0: 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ger) );.  return
dee0: 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a   offset;.}../*.*
def0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
df00: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
df10: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
df20: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  on is called..**
df30: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
df40: 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  n is a no-op if 
df50: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
df60: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72   has not been wr
df70: 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68  itten to.** with
df80: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  in the current t
df90: 72 61 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e  ransaction (i.e.
dfa0: 20 69 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   if Pager.journa
dfb0: 6c 4f 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20  lOff==0)..**.** 
dfc0: 49 66 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73  If doTruncate is
dfd0: 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65   non-zero or the
dfe0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69   Pager.journalSi
dff0: 7a 65 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65  zeLimit variable
e000: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c   is.** set to 0,
e010: 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74   then truncate t
e020: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
e030: 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e  to zero bytes in
e040: 20 73 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65   size. Otherwise
e050: 2c 0a 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38  ,.** zero the 28
e060: 2d 62 79 74 65 20 68 65 61 64 65 72 20 61 74 20  -byte header at 
e070: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
e080: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
e090: 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a  n either case, .
e0a0: 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ** if the pager 
e0b0: 69 73 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e  is not in no-syn
e0c0: 63 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65  c mode, sync the
e0d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d   journal file im
e0e0: 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66  mediately .** af
e0f0: 74 65 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74  ter writing or t
e100: 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a  runcating it..**
e110: 0a 2a 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75  .** If Pager.jou
e120: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73  rnalSizeLimit is
e130: 20 73 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69   set to a positi
e140: 76 65 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  ve, non-zero val
e150: 75 65 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f  ue, and.** follo
e160: 77 69 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74  wing the truncat
e170: 69 6f 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64  ion or zeroing d
e180: 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 74  escribed above t
e190: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a  he size of the .
e1a0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
e1b0: 69 6e 20 62 79 74 65 73 20 69 73 20 6c 61 72 67  in bytes is larg
e1c0: 65 72 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c  er than this val
e1d0: 75 65 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74  ue, then truncat
e1e0: 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  e the.** journal
e1f0: 20 66 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a   file to Pager.j
e200: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
e210: 62 79 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e  bytes. The journ
e220: 61 6c 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20  al file does.** 
e230: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73  not need to be s
e240: 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20  ynced following 
e250: 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  this operation..
e260: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65  **.** If an IO e
e270: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61  rror occurs, aba
e280: 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  ndon processing 
e290: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 49  and return the I
e2a0: 4f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  O error code..**
e2b0: 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
e2c0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  rn SQLITE_OK..*/
e2d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f  .static int zero
e2e0: 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72  JournalHdr(Pager
e2f0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f   *pPager, int do
e300: 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74  Truncate){.  int
e310: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e340: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
e350: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
e360: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
e370: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 71 6c  ;.  assert( !sql
e380: 69 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d  ite3JournalIsInM
e390: 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66  emory(pPager->jf
e3a0: 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  d) );.  if( pPag
e3b0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
e3c0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34 20  {.    const i64 
e3d0: 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d  iLimit = pPager-
e3e0: 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
e3f0: 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63  t;    /* Local c
e400: 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a 0a  ache of jsl */..
e410: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a      IOTRACE(("JZ
e420: 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50  EROHDR %p\n", pP
e430: 61 67 65 72 29 29 0a 20 20 20 20 69 66 28 20 64  ager)).    if( d
e440: 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69  oTruncate || iLi
e450: 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
e460: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
e470: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
e480: 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  fd, 0);.    }els
e490: 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  e{.      static 
e4a0: 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48  const char zeroH
e4b0: 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20 20  dr[28] = {0};.  
e4c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e4d0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
e4e0: 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69  jfd, zeroHdr, si
e4f0: 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30  zeof(zeroHdr), 0
e500: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
e510: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
e520: 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  & !pPager->noSyn
e530: 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  c ){.      rc = 
e540: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
e550: 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54  ager->jfd, SQLIT
e560: 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c  E_SYNC_DATAONLY|
e570: 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
e580: 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  s);.    }..    /
e590: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
e5a0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
e5b0: 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74  is committed but
e5c0: 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
e5d0: 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c  .    ** is still
e5e0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c   held on the fil
e5f0: 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  e. If there is a
e600: 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66   size limit conf
e610: 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20  igured for .    
e620: 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  ** the persisten
e630: 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  t journal and th
e640: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
e650: 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65  urrently consume
e660: 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70  s more.    ** sp
e670: 61 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69  ace than that li
e680: 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20  mit allows for, 
e690: 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e  truncate it now.
e6a0: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
e6b0: 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63  d.    ** to sync
e6c0: 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77   the file follow
e6d0: 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69  ing this operati
e6e0: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
e6f0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
e700: 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a   && iLimit>0 ){.
e710: 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20        i64 sz;.  
e720: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e730: 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
e740: 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20  r->jfd, &sz);.  
e750: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
e760: 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d  TE_OK && sz>iLim
e770: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  it ){.        rc
e780: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
e790: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
e7a0: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
e7b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
e7c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
e7d0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
e7e0: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
e7f0: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
e800: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  ne is called. A 
e810: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65  journal.** heade
e820: 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  r (JOURNAL_HDR_S
e830: 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74  Z bytes) is writ
e840: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
e850: 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65  rnal file at the
e860: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  .** current loca
e870: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
e880: 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a  format for the j
e890: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
e8a0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
e8b0: 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63  - 8 bytes: Magic
e8c0: 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75   identifying jou
e8d0: 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20  rnal format..** 
e8e0: 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65  - 4 bytes: Numbe
e8f0: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
e900: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e  journal, or -1 n
e910: 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f  o-sync mode is o
e920: 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  n..** - 4 bytes:
e930: 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75   Random number u
e940: 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73  sed for page has
e950: 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  h..** - 4 bytes:
e960: 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   Initial databas
e970: 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a  e page count..**
e980: 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74   - 4 bytes: Sect
e990: 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  or size used by 
e9a0: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
e9b0: 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72   wrote this jour
e9c0: 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  nal..** - 4 byte
e9d0: 73 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65  s: Database page
e9e0: 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f   size..** .** Fo
e9f0: 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e  llowed by (JOURN
ea00: 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20  AL_HDR_SZ - 28) 
ea10: 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20  bytes of unused 
ea20: 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  space..*/.static
ea30: 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61   int writeJourna
ea40: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
ea50: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
ea60: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
ea70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
ea80: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63  turn code */.  c
ea90: 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70  har *zHeader = p
eaa0: 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
eab0: 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20  ;  /* Temporary 
eac0: 73 70 61 63 65 20 75 73 65 64 20 74 6f 20 62 75  space used to bu
ead0: 69 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  ild header */.  
eae0: 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20 28 75  u32 nHeader = (u
eaf0: 33 32 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  32)pPager->pageS
eb00: 69 7a 65 3b 2f 2a 20 53 69 7a 65 20 6f 66 20 62  ize;/* Size of b
eb10: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74 6f  uffer pointed to
eb20: 20 62 79 20 7a 48 65 61 64 65 72 20 2a 2f 0a 20   by zHeader */. 
eb30: 20 75 33 32 20 6e 57 72 69 74 65 3b 20 20 20 20   u32 nWrite;    
eb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb50: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
eb60: 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 20 77   header sector w
eb70: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  ritten */.  int 
eb80: 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
eb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eba0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
ebb0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73  */..  assert( is
ebc0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
ebd0: 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75  ) );      /* Jou
ebe0: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
ebf0: 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 69 66  e open. */..  if
ec00: 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41  ( nHeader>JOURNA
ec10: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
ec20: 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
ec30: 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
ec40: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
ec50: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
ec60: 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
ec70: 74 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68  ts and any of th
ec80: 65 6d 20 77 65 72 65 20 63 72 65 61 74 65 64 20  em were created 
ec90: 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 20  .  ** since the 
eca0: 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72  most recent jour
ecb0: 6e 61 6c 20 68 65 61 64 65 72 20 77 61 73 20 77  nal header was w
ecc0: 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74  ritten, update t
ecd0: 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 53 61  he .  ** PagerSa
ece0: 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73  vepoint.iHdrOffs
ecf0: 65 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e 0a 20  et fields now.. 
ed00: 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20   */.  for(ii=0; 
ed10: 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
ed20: 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
ed30: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 53    if( pPager->aS
ed40: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64  avepoint[ii].iHd
ed50: 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a 20 20  rOffset==0 ){.  
ed60: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76      pPager->aSav
ed70: 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f  epoint[ii].iHdrO
ed80: 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
ed90: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
eda0: 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  }.  }..  pPager-
edb0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
edc0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
edd0: 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
ede0: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  set(pPager);..  
edf0: 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20 74  /* .  ** Write t
ee00: 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d 20  he nRec Field - 
ee10: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
ee20: 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  ge records that 
ee30: 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a 2a  follow this.  **
ee40: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
ee50: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20   Normally, zero 
ee60: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
ee70: 69 73 20 76 61 6c 75 65 20 61 74 20 74 68 69 73  is value at this
ee80: 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74 65   time..  ** Afte
ee90: 72 20 74 68 65 20 72 65 63 6f 72 64 73 20 61 72  r the records ar
eea0: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6a  e added to the j
eeb0: 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65 20  ournal (and the 
eec0: 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c 20  journal synced, 
eed0: 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c 6c  .  ** if in full
eee0: 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68 65  -sync mode), the
eef0: 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72 69   zero is overwri
ef00: 74 74 65 6e 20 77 69 74 68 20 74 68 65 20 74 72  tten with the tr
ef10: 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 6f  ue number.  ** o
ef20: 66 20 72 65 63 6f 72 64 73 20 28 73 65 65 20 73  f records (see s
ef30: 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a 20  yncJournal()).. 
ef40: 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74 65   **.  ** A faste
ef50: 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69 73  r alternative is
ef60: 20 74 6f 20 77 72 69 74 65 20 30 78 46 46 46 46   to write 0xFFFF
ef70: 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65 63  FFFF to the nRec
ef80: 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20 2a   field. When.  *
ef90: 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a 6f  * reading the jo
efa0: 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75 65  urnal this value
efb0: 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74 6f   tells SQLite to
efc0: 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
efd0: 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74 68  .  ** rest of th
efe0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
eff0: 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70 61  ontains valid pa
f000: 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69 73  ge records. This
f010: 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a   assumption.  **
f020: 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20 61   is dangerous, a
f030: 73 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  s if a failure o
f040: 63 63 75 72 72 65 64 20 77 68 69 6c 73 74 20 77  ccurred whilst w
f050: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
f060: 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
f070: 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73  it may contain s
f080: 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61 74 61  ome garbage data
f090: 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20  . There are two 
f0a0: 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77  scenarios.  ** w
f0b0: 68 65 72 65 20 74 68 69 73 20 72 69 73 6b 20 63  here this risk c
f0c0: 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20  an be ignored:. 
f0d0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
f0e0: 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  n the pager is i
f0f0: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20  n no-sync mode. 
f100: 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66  Corruption can f
f110: 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20  ollow a.  **    
f120: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69   power failure i
f130: 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 79 77  n this case anyw
f140: 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ay..  **.  **   
f150: 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54  * When the SQLIT
f160: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
f170: 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e  END flag is set.
f180: 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73   This guarantees
f190: 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67  .  **     that g
f1a0: 61 72 62 61 67 65 20 64 61 74 61 20 69 73 20 6e  arbage data is n
f1b0: 65 76 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f  ever appended to
f1c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
f1d0: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
f1e0: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
f1f0: 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
f200: 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66 28 20  noSync );.  if( 
f210: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 7c  pPager->noSync |
f220: 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  | (pPager->journ
f230: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
f240: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
f250: 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33  ).   || (sqlite3
f260: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
f270: 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
f280: 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  fd)&SQLITE_IOCAP
f290: 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20  _SAFE_APPEND) . 
f2a0: 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a   ){.    memcpy(z
f2b0: 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c  Header, aJournal
f2c0: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
f2d0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
f2e0: 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48     put32bits(&zH
f2f0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
f300: 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78  urnalMagic)], 0x
f310: 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c  ffffffff);.  }el
f320: 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a  se{.    memset(z
f330: 48 65 61 64 65 72 2c 20 30 2c 20 73 69 7a 65 6f  Header, 0, sizeo
f340: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
f350: 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  +4);.  }..  /* T
f360: 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d  he random check-
f370: 68 61 73 68 20 69 6e 69 74 69 61 6c 69 7a 65 72  hash initializer
f380: 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72   */ .  sqlite3_r
f390: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
f3a0: 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  (pPager->cksumIn
f3b0: 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  it), &pPager->ck
f3c0: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33  sumInit);.  put3
f3d0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
f3e0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
f3f0: 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d  gic)+4], pPager-
f400: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f  >cksumInit);.  /
f410: 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61  * The initial da
f420: 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20  tabase size */. 
f430: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
f440: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
f450: 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50  nalMagic)+8], pP
f460: 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
f470: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75  );.  /* The assu
f480: 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20  med sector size 
f490: 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
f4a0: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
f4b0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
f4c0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
f4d0: 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74  2], pPager->sect
f4e0: 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54  orSize);..  /* T
f4f0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  he page size */.
f500: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
f510: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
f520: 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20  rnalMagic)+16], 
f530: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
f540: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  );..  /* Initial
f550: 69 7a 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f  izing the tail o
f560: 66 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20  f the buffer is 
f570: 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20  not necessary.  
f580: 45 76 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20  Everything.  ** 
f590: 77 6f 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68  works find if th
f5a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73  e following mems
f5b0: 65 74 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e  et() is omitted.
f5c0: 20 20 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69    But initializi
f5d0: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f  ng.  ** the memo
f5e0: 72 79 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67  ry prevents valg
f5f0: 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61  rind from compla
f600: 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65  ining, so we are
f610: 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a   willing to.  **
f620: 20 74 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72   take the perfor
f630: 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a  mance hit..  */.
f640: 20 20 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65    memset(&zHeade
f650: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
f660: 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a  lMagic)+20], 0,.
f670: 20 20 20 20 20 20 20 20 20 6e 48 65 61 64 65 72           nHeader
f680: 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  -(sizeof(aJourna
f690: 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20  lMagic)+20));.. 
f6a0: 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 69   /* In theory, i
f6b0: 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73  t is only necess
f6c0: 61 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65  ary to write the
f6d0: 20 32 38 20 62 79 74 65 73 20 74 68 61 74 20 74   28 bytes that t
f6e0: 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  he .  ** journal
f6f0: 20 68 65 61 64 65 72 20 63 6f 6e 73 75 6d 65 73   header consumes
f700: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
f710: 66 69 6c 65 20 68 65 72 65 2e 20 54 68 65 6e 20  file here. Then 
f720: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20  increment the . 
f730: 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61   ** Pager.journa
f740: 6c 4f 66 66 20 76 61 72 69 61 62 6c 65 20 62 79  lOff variable by
f750: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20   JOURNAL_HDR_SZ 
f760: 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  so that the next
f770: 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64 20 69 73   .  ** record is
f780: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
f790: 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72  following sector
f7a0: 20 28 6c 65 61 76 69 6e 67 20 61 20 67 61 70 20   (leaving a gap 
f7b0: 69 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a  in the file.  **
f7c0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6d   that will be im
f7d0: 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c 65 64 20  plicitly filled 
f7e0: 69 6e 20 62 79 20 74 68 65 20 4f 53 29 2e 0a 20  in by the OS).. 
f7f0: 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72   **.  ** However
f800: 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 69 73   it has been dis
f810: 63 6f 76 65 72 65 64 20 74 68 61 74 20 6f 6e 20  covered that on 
f820: 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 74 68 69  some systems thi
f830: 73 20 70 61 74 74 65 72 6e 20 63 61 6e 20 0a 20  s pattern can . 
f840: 20 2a 2a 20 62 65 20 73 69 67 6e 69 66 69 63 61   ** be significa
f850: 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74 68 61 6e  ntly slower than
f860: 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 20 77 72   contiguously wr
f870: 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68  iting data to th
f880: 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65  e file,.  ** eve
f890: 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20  n if that means 
f8a0: 65 78 70 6c 69 63 69 74 6c 79 20 77 72 69 74 69  explicitly writi
f8b0: 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 62  ng data to the b
f8c0: 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a  lock of .  ** (J
f8d0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20  OURNAL_HDR_SZ - 
f8e0: 32 38 29 20 62 79 74 65 73 20 74 68 61 74 20 77  28) bytes that w
f8f0: 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e  ill not be used.
f900: 20 53 6f 20 74 68 61 74 20 69 73 20 77 68 61 74   So that is what
f910: 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a  .  ** is done. .
f920: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f    **.  ** The lo
f930: 6f 70 20 69 73 20 72 65 71 75 69 72 65 64 20 68  op is required h
f940: 65 72 65 20 69 6e 20 63 61 73 65 20 74 68 65 20  ere in case the 
f950: 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c  sector-size is l
f960: 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a  arger than the .
f970: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 70 61    ** database pa
f980: 67 65 20 73 69 7a 65 2e 20 53 69 6e 63 65 20 74  ge size. Since t
f990: 68 65 20 7a 48 65 61 64 65 72 20 62 75 66 66 65  he zHeader buffe
f9a0: 72 20 69 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e  r is only Pager.
f9b0: 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79  pageSize.  ** by
f9c0: 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72  tes in size, mor
f9d0: 65 20 74 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20  e than one call 
f9e0: 74 6f 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  to sqlite3OsWrit
f9f0: 65 28 29 20 6d 61 79 20 62 65 20 72 65 71 75 69  e() may be requi
fa00: 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75  red.  ** to popu
fa10: 6c 61 74 65 20 74 68 65 20 65 6e 74 69 72 65 20  late the entire 
fa20: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
fa30: 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66  ector..  */ .  f
fa40: 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d  or(nWrite=0; rc=
fa50: 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69  =SQLITE_OK&&nWri
fa60: 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  te<JOURNAL_HDR_S
fa70: 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74  Z(pPager); nWrit
fa80: 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20  e+=nHeader){.   
fa90: 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20   IOTRACE(("JHDR 
faa0: 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %p %lld %d\n", p
fab0: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
fac0: 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64  ournalHdr, nHead
fad0: 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71  er)).    rc = sq
fae0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
faf0: 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65  ger->jfd, zHeade
fb00: 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67  r, nHeader, pPag
fb10: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
fb20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
fb30: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
fb40: 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  <= pPager->journ
fb50: 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 70 50 61  alOff );.    pPa
fb60: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
fb70: 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a  += nHeader;.  }.
fb80: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
fb90: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
fba0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
fbb0: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69  open when this i
fbc0: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
fbd0: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a  nal header file.
fbe0: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
fbf0: 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61  SZ bytes) is rea
fc00: 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65  d from the curre
fc10: 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74  nt location in t
fc20: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
fc30: 6c 65 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20  le. The current 
fc40: 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  location in the 
fc50: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
fc60: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67  given by.** pPag
fc70: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20  er->journalOff. 
fc80: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
fc90: 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  ve function writ
fca0: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f  eJournalHdr() fo
fcb0: 72 0a 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69  r.** a descripti
fcc0: 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  on of the journa
fcd0: 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e  l header format.
fce0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65  .**.** If the he
fcf0: 61 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63  ader is read suc
fd00: 63 65 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65  cessfully, *pNRe
fd10: 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  c is set to the 
fd20: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67  number of.** pag
fd30: 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77  e records follow
fd40: 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20  ing this header 
fd50: 61 6e 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20  and *pDbSize is 
fd60: 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20  set to the size 
fd70: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
fd80: 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  se before the tr
fd90: 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c  ansaction began,
fda0: 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c   in pages. Also,
fdb0: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
fdc0: 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  it.** is set to 
fdd0: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
fde0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
fdf0: 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f  header. SQLITE_O
fe00: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
fe10: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
fe20: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
fe30: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20  nal header file 
fe40: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f  appears to be co
fe50: 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
fe60: 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72  DONE is.** retur
fe70: 6e 65 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61  ned and *pNRec a
fe80: 6e 64 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20  nd *PDbSize are 
fe90: 75 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a  undefined.  If J
fea0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
feb0: 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  tes.** cannot be
fec0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
fed0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65  ournal file an e
fee0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
fef0: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
ff00: 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c   int readJournal
ff10: 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  Hdr(.  Pager *pP
ff20: 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
ff30: 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a      /* Pager obj
ff40: 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48  ect */.  int isH
ff50: 6f 74 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61  ot,.  i64 journa
ff60: 6c 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  lSize,          
ff70: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
ff80: 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66  e open journal f
ff90: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
ffa0: 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20    u32 *pNRec,   
ffb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ffc0: 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61  * OUT: Value rea
ffd0: 64 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20  d from the nRec 
ffe0: 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a  field */.  u32 *
fff0: 70 44 62 53 69 7a 65 20 20 20 20 20 20 20 20 20  pDbSize         
10000 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
10010 56 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61  Value of origina
10020 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
10030 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  field */.){.  in
10040 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
10050 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10060 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
10070 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
10080 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41  gic[8];     /* A
10090 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
100a0 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
100b0 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
100c0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
100d0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
100e0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62  journal header b
100f0 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20  eing read */..  
10100 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
10110 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20  Pager->jfd) );  
10120 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66      /* Journal f
10130 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
10140 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e  . */..  /* Advan
10150 63 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ce Pager.journal
10160 4f 66 66 20 74 6f 20 74 68 65 20 73 74 61 72 74  Off to the start
10170 20 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65 63   of the next sec
10180 74 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a  tor. If the.  **
10190 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
101a0 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74   too small for t
101b0 68 65 72 65 20 74 6f 20 62 65 20 61 20 68 65 61  here to be a hea
101c0 64 65 72 20 73 74 6f 72 65 64 20 61 74 20 74 68  der stored at th
101d0 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72  is.  ** point, r
101e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
101f0 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  E..  */.  pPager
10200 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a  ->journalOff = j
10210 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
10220 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
10230 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10240 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f+JOURNAL_HDR_SZ
10250 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e  (pPager) > journ
10260 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  alSize ){.    re
10270 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
10280 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20  ;.  }.  iHdrOff 
10290 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
102a0 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  lOff;..  /* Read
102b0 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 38 20   in the first 8 
102c0 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75  bytes of the jou
102d0 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20  rnal header. If 
102e0 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63  they do not matc
102f0 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69  h.  ** the  magi
10300 63 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61  c string found a
10310 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
10320 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ach journal head
10330 65 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  er, return.  ** 
10340 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20  SQLITE_DONE. If 
10350 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
10360 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  rs, return an er
10370 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77  ror code. Otherw
10380 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65  ise,.  ** procee
10390 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  d..  */.  if( is
103a0 48 6f 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d  Hot || iHdrOff!=
103b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
103c0 64 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  dr ){.    rc = s
103d0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
103e0 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
103f0 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
10400 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20  , iHdrOff);.    
10410 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
10420 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
10430 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
10440 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
10450 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
10460 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20  agic))!=0 ){.   
10470 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10480 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
10490 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
104a0 66 69 72 73 74 20 74 68 72 65 65 20 33 32 2d 62  first three 32-b
104b0 69 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  it fields of the
104c0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a   journal header:
104d0 20 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66   The nRec.  ** f
104e0 69 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73  ield, the checks
104f0 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61  um-initializer a
10500 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
10510 73 69 7a 65 20 61 74 20 74 68 65 20 73 74 61 72  size at the star
10520 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72  t.  ** of the tr
10530 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72  ansaction. Retur
10540 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
10550 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
10560 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69   wrong..  */.  i
10570 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
10580 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
10590 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
105a0 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20  Off+8, pNRec)). 
105b0 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
105c0 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
105d0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
105e0 64 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65  drOff+12, &pPage
105f0 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20  r->cksumInit)). 
10600 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
10610 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
10620 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
10630 64 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a  drOff+16, pDbSiz
10640 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  e)).  ){.    ret
10650 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69  urn rc;.  }..  i
10660 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
10670 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
10680 75 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20  u32 iPageSize;  
10690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
106a0 50 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20  Page-size field 
106b0 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
106c0 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65  r */.    u32 iSe
106d0 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
106e0 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d        /* Sector-
106f0 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f  size field of jo
10700 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
10710 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
10720 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
10730 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e  ector-size journ
10740 61 6c 20 68 65 61 64 65 72 20 66 69 65 6c 64 73  al header fields
10750 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c  . */.    if( SQL
10760 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
10770 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
10780 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30  >jfd, iHdrOff+20
10790 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29  , &iSectorSize))
107a0 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  .     || SQLITE_
107b0 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
107c0 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
107d0 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69  , iHdrOff+24, &i
107e0 50 61 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29  PageSize)).    )
107f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
10800 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
10810 20 56 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   Versions of SQL
10820 69 74 65 20 70 72 69 6f 72 20 74 6f 20 33 2e 35  ite prior to 3.5
10830 2e 38 20 73 65 74 20 74 68 65 20 70 61 67 65 2d  .8 set the page-
10840 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68  size field of th
10850 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  e.    ** journal
10860 20 68 65 61 64 65 72 20 74 6f 20 7a 65 72 6f 2e   header to zero.
10870 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 61   In this case, a
10880 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 50  ssume that the P
10890 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20  ager.pageSize.  
108a0 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73    ** variable is
108b0 20 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20   already set to 
108c0 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65  the correct page
108d0 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
108e0 20 20 69 66 28 20 69 50 61 67 65 53 69 7a 65 3d    if( iPageSize=
108f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 50 61 67  =0 ){.      iPag
10900 65 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  eSize = pPager->
10910 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a  pageSize;.    }.
10920 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
10930 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 72 65  at the values re
10940 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ad from the page
10950 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
10960 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a 20 20 20  -size fields.   
10970 20 2a 2a 20 61 72 65 20 77 69 74 68 69 6e 20 72   ** are within r
10980 61 6e 67 65 2e 20 54 6f 20 62 65 20 27 69 6e 20  ange. To be 'in 
10990 72 61 6e 67 65 27 2c 20 62 6f 74 68 20 76 61 6c  range', both val
109a0 75 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 61  ues need to be a
109b0 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66   power.    ** of
109c0 20 74 77 6f 20 67 72 65 61 74 65 72 20 74 68 61   two greater tha
109d0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 35 31  n or equal to 51
109e0 32 20 6f 72 20 33 32 2c 20 61 6e 64 20 6e 6f 74  2 or 32, and not
109f0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
10a00 65 69 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70  eir .    ** resp
10a10 65 63 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74  ective compile t
10a20 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69  ime maximum limi
10a30 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ts..    */.    i
10a40 66 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32  f( iPageSize<512
10a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a60 20 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65    || iSectorSize
10a70 3c 33 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67  <32.     || iPag
10a80 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
10a90 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53  _PAGE_SIZE || iS
10aa0 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45  ectorSize>MAX_SE
10ab0 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c  CTOR_SIZE.     |
10ac0 7c 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29  | ((iPageSize-1)
10ad0 26 69 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20  &iPageSize)!=0  
10ae0 20 7c 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a   || ((iSectorSiz
10af0 65 2d 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65  e-1)&iSectorSize
10b00 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0 .    ){.   
10b10 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74     /* If the eit
10b20 68 65 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a  her the page-siz
10b30 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65  e or sector-size
10b40 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   in the journal-
10b50 68 65 61 64 65 72 20 69 73 20 0a 20 20 20 20 20  header is .     
10b60 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65   ** invalid, the
10b70 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  n the process th
10b80 61 74 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75  at wrote the jou
10b90 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74  rnal-header must
10ba0 20 68 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20   have .      ** 
10bb0 63 72 61 73 68 65 64 20 62 65 66 6f 72 65 20 74  crashed before t
10bc0 68 65 20 68 65 61 64 65 72 20 77 61 73 20 73 79  he header was sy
10bd0 6e 63 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  nced. In this ca
10be0 73 65 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20  se stop reading 
10bf0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  .      ** the jo
10c00 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e  urnal file here.
10c10 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
10c20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
10c30 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  NE;.    }..    /
10c40 2a 20 55 70 64 61 74 65 20 74 68 65 20 70 61 67  * Update the pag
10c50 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  e-size to match 
10c60 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
10c70 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  rom the journal.
10c80 20 0a 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74   .    ** Use a t
10c90 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20  estcase() macro 
10ca0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
10cb0 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  t malloc failure
10cc0 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20   within .    ** 
10cd0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
10ce0 28 29 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20  () is tested..  
10cf0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
10d00 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
10d10 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69  esize(pPager, &i
10d20 50 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a 20  PageSize, -1);. 
10d30 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
10d40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
10d50 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
10d60 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d   assumed sector-
10d70 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
10d80 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20  e value used by 
10d90 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63  .    ** the proc
10da0 65 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64  ess that created
10db0 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49   this journal. I
10dc0 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  f this journal w
10dd0 61 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  as.    ** create
10de0 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f  d by a process o
10df0 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f  ther than this o
10e00 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  ne, then this ro
10e10 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20  utine.    ** is 
10e20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f  being called fro
10e30 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70  m within pager_p
10e40 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c  layback(). The l
10e50 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a  ocal value.    *
10e60 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f  * of Pager.secto
10e70 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65  rSize is restore
10e80 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
10e90 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20  that routine..  
10ea0 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
10eb0 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53  >sectorSize = iS
10ec0 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a  ectorSize;.  }..
10ed0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
10ee0 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f  lOff += JOURNAL_
10ef0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
10f00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10f10 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
10f20 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72   supplied master
10f30 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
10f40 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
10f50 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a  ile for pager.**
10f60 20 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63   pPager at the c
10f70 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
10f80 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
10f90 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65  nal name must be
10fa0 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69   the last.** thi
10fb0 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20  ng written to a 
10fc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
10fd0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
10fe0 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
10ff0 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
11000 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
11010 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74  is advanced to t
11020 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62  he next sector b
11030 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a  oundary before.*
11040 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72  * anything is wr
11050 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61  itten. The forma
11060 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20  t is:.**.**   + 
11070 34 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d  4 bytes: PAGER_M
11080 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e  J_PGNO..**   + N
11090 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
110a0 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
110b0 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b  in utf-8..**   +
110c0 20 34 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e   4 bytes: N (len
110d0 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  gth of master jo
110e0 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79  urnal name in by
110f0 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d  tes, no nul-term
11100 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20  inator)..**   + 
11110 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20  4 bytes: Master 
11120 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65  journal name che
11130 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20  cksum..**   + 8 
11140 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d  bytes: aJournalM
11150 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68  agic[]..**.** Th
11160 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11170 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69   page checksum i
11180 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  s the sum of the
11190 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61   bytes in the ma
111a0 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
111b0 6e 61 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68  name, where each
111c0 20 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72   byte is interpr
111d0 65 74 65 64 20 61 73 20 61 20 73 69 67 6e 65 64  eted as a signed
111e0 20 38 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a   8-bit integer..
111f0 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72  **.** If zMaster
11200 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
11210 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61  er (occurs for a
11220 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
11230 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a   transaction), .
11240 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  ** this call is 
11250 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
11260 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74  ic int writeMast
11270 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  erJournal(Pager 
11280 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
11290 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
112a0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112c0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
112d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65   */.  int nMaste
112e0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
112f0 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
11300 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74   of string zMast
11310 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  er */.  i64 iHdr
11320 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
11330 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
11340 65 74 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20  et of header in 
11350 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
11360 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20    i64 jrnlSize; 
11370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11380 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f     /* Size of jo
11390 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69  urnal file on di
113a0 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  sk */.  u32 cksu
113b0 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  m = 0;          
113c0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
113d0 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a  ksum of string z
113e0 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73  Master */..  ass
113f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 65 74  ert( pPager->set
11400 4d 61 73 74 65 72 3d 3d 30 20 29 3b 0a 20 20 61  Master==0 );.  a
11410 73 73 65 72 74 28 20 21 70 61 67 65 72 55 73 65  ssert( !pagerUse
11420 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a  Wal(pPager) );..
11430 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 0a    if( !zMaster .
11440 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
11450 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
11460 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
11470 4f 52 59 20 0a 20 20 20 7c 7c 20 21 69 73 4f 70  ORY .   || !isOp
11480 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 0a  en(pPager->jfd).
11490 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
114a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
114b0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
114c0 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  er = 1;.  assert
114d0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
114e0 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e  lHdr <= pPager->
114f0 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20  journalOff );.. 
11500 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68   /* Calculate th
11510 65 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65  e length in byte
11520 73 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73  s and the checks
11530 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f  um of zMaster */
11540 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30  .  for(nMaster=0
11550 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65  ; zMaster[nMaste
11560 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a  r]; nMaster++){.
11570 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61      cksum += zMa
11580 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20  ster[nMaster];. 
11590 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66   }..  /* If in f
115a0 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61  ull-sync mode, a
115b0 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
115c0 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62  xt disk sector b
115d0 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20  efore writing.  
115e0 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** the master jo
115f0 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73  urnal name. This
11600 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20   is in case the 
11610 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72  previous page wr
11620 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68  itten to.  ** th
11630 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c  e journal has al
11640 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
11650 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
11660 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
11670 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
11680 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e  urnalOff = journ
11690 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67  alHdrOffset(pPag
116a0 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f  er);.  }.  iHdrO
116b0 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
116c0 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57  rnalOff;..  /* W
116d0 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
116e0 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20  journal data to 
116f0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a  the end of the j
11700 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a  ournal file. If.
11710 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63    ** an error oc
11720 63 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65  curs, return the
11730 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
11740 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a  he caller..  */.
11750 20 20 69 66 28 20 28 30 20 21 3d 20 28 72 63 20    if( (0 != (rc 
11760 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
11770 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
11780 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ff, PAGER_MJ_PGN
11790 4f 28 70 50 61 67 65 72 29 29 29 29 0a 20 20 20  O(pPager)))).   
117a0 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73  || (0 != (rc = s
117b0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
117c0 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
117d0 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64  er, nMaster, iHd
117e0 72 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20  rOff+4))).   || 
117f0 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
11800 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
11810 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  jfd, iHdrOff+4+n
11820 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29  Master, nMaster)
11830 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
11840 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
11850 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
11860 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b  drOff+4+nMaster+
11870 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c  4, cksum))).   |
11880 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
11890 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
118a0 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e  ger->jfd, aJourn
118b0 61 6c 4d 61 67 69 63 2c 20 38 2c 0a 20 20 20 20  alMagic, 8,.    
118c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 48 64               iHd
118e0 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38  rOff+4+nMaster+8
118f0 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ))).  ){.    ret
11900 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
11910 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
11920 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29   += (nMaster+20)
11930 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
11940 61 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73  ager is in peris
11950 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64  tent-journal mod
11960 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73  e, then the phys
11970 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ical .  ** journ
11980 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65  al-file may exte
11990 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  nd past the end 
119a0 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
119b0 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20  urnal name.  ** 
119c0 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d  and 8 bytes of m
119d0 61 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77  agic data just w
119e0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69  ritten to the fi
119f0 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a  le. This is .  *
11a00 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61  * dangerous beca
11a10 75 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  use the code to 
11a20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a  rollback a hot-j
11a30 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a  ournal file.  **
11a40 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c   will not be abl
11a50 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61  e to find the ma
11a60 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
11a70 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a  e to determine .
11a80 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20    ** whether or 
11a90 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
11aa0 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20  is hot. .  **.  
11ab0 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67  ** Easiest thing
11ac0 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73   to do in this s
11ad0 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72  cenario is to tr
11ae0 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
11af0 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f  al .  ** file to
11b00 20 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69   the required si
11b10 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20  ze..  */ .  if( 
11b20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
11b30 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
11b40 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
11b50 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26  &jrnlSize)).   &
11b60 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65  & jrnlSize>pPage
11b70 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
11b80 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
11b90 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
11ba0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
11bb0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
11bc0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
11bd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72  .}../*.** Discar
11be0 64 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  d the entire con
11bf0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d  tents of the in-
11c00 6d 65 6d 6f 72 79 20 70 61 67 65 2d 63 61 63 68  memory page-cach
11c10 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
11c20 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61  d pager_reset(Pa
11c30 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
11c40 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72  pPager->iDataVer
11c50 73 69 6f 6e 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  sion++;.  sqlite
11c60 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
11c70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
11c80 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
11c90 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50  Clear(pPager->pP
11ca0 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Cache);.}../*.**
11cb0 20 52 65 74 75 72 6e 20 74 68 65 20 70 50 61 67   Return the pPag
11cc0 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e  er->iDataVersion
11cd0 20 76 61 6c 75 65 0a 2a 2f 0a 75 33 32 20 73 71   value.*/.u32 sq
11ce0 6c 69 74 65 33 50 61 67 65 72 44 61 74 61 56 65  lite3PagerDataVe
11cf0 72 73 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  rsion(Pager *pPa
11d00 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ger){.  assert( 
11d10 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50  pPager->eState>P
11d20 41 47 45 52 5f 4f 50 45 4e 20 29 3b 0a 20 20 72  AGER_OPEN );.  r
11d30 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 69 44  eturn pPager->iD
11d40 61 74 61 56 65 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f  ataVersion;.}../
11d50 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73 74  *.** Free all st
11d60 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20  ructures in the 
11d70 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
11d80 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 73 65 74  [] array and set
11d90 20 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61   both.** Pager.a
11da0 53 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 50 61  Savepoint and Pa
11db0 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74  ger.nSavepoint t
11dc0 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68  o zero. Close th
11dd0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
11de0 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 20 61   if it is open a
11df0 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20  nd the pager is 
11e00 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
11e10 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   mode..*/.static
11e20 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41 6c 6c   void releaseAll
11e30 53 61 76 65 70 6f 69 6e 74 73 28 50 61 67 65 72  Savepoints(Pager
11e40 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
11e50 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
11e60 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66     /* Iterator f
11e70 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75  or looping throu
11e80 67 68 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  gh Pager.aSavepo
11e90 69 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  int */.  for(ii=
11ea0 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
11eb0 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
11ec0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
11ed0 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
11ee0 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
11ef0 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a  .pInSavepoint);.
11f00 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
11f10 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
11f20 20 7c 7c 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e   || sqlite3Journ
11f30 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70 50 61  alIsInMemory(pPa
11f40 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
11f50 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
11f60 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
11f70 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
11f80 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ee(pPager->aSave
11f90 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72  point);.  pPager
11fa0 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->aSavepoint = 0
11fb0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  ;.  pPager->nSav
11fc0 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
11fd0 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20  ager->nSubRec = 
11fe0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
11ff0 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70  the bit number p
12000 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72  gno in the Pager
12010 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
12020 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65  epoint .** bitve
12030 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73  cs of all open s
12040 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72  avepoints. Retur
12050 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
12060 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20  uccessful.** or 
12070 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
12080 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
12090 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
120a0 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65  ic int addToSave
120b0 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67  pointBitvecs(Pag
120c0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
120d0 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69   pgno){.  int ii
120e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
120f0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
12100 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
12110 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
12120 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
12130 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30  e */..  for(ii=0
12140 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
12150 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
12160 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
12170 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d  nt *p = &pPager-
12180 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b  >aSavepoint[ii];
12190 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
121a0 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->nOrig ){.     
121b0 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69   rc |= sqlite3Bi
121c0 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61  tvecSet(p->pInSa
121d0 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a  vepoint, pgno);.
121e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
121f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
12200 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
12210 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12220 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
12230 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  MEM );.    }.  }
12240 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12250 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
12260 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
12270 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
12280 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
12290 65 20 61 6e 64 20 6e 6f 74 0a 2a 2a 20 69 6e 20  e and not.** in 
122a0 74 68 65 20 45 52 52 4f 52 20 73 74 61 74 65 2e  the ERROR state.
122b0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 73   Otherwise, it s
122c0 77 69 74 63 68 65 73 20 74 68 65 20 70 61 67 65  witches the page
122d0 72 20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 0a  r to PAGER_OPEN.
122e0 2a 2a 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ** state..**.** 
122f0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
12300 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65  not in exclusive
12310 2d 61 63 63 65 73 73 20 6d 6f 64 65 2c 20 74 68  -access mode, th
12320 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
12330 69 73 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79  is.** completely
12340 20 75 6e 6c 6f 63 6b 65 64 2e 20 49 66 20 74 68   unlocked. If th
12350 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  e file is unlock
12360 65 64 20 61 6e 64 20 74 68 65 20 66 69 6c 65 2d  ed and the file-
12370 73 79 73 74 65 6d 20 64 6f 65 73 0a 2a 2a 20 6e  system does.** n
12380 6f 74 20 65 78 68 69 62 69 74 20 74 68 65 20 55  ot exhibit the U
12390 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
123a0 4f 50 45 4e 20 70 72 6f 70 65 72 74 79 2c 20 74  OPEN property, t
123b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
123c0 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 20 28 69 66  is.** closed (if
123d0 20 69 74 20 69 73 20 6f 70 65 6e 29 2e 0a 2a 2a   it is open)..**
123e0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
123f0 20 69 73 20 69 6e 20 45 52 52 4f 52 20 73 74 61   is in ERROR sta
12400 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
12410 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
12420 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
12430 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63  s of the pager c
12440 61 63 68 65 20 61 72 65 20 64 69 73 63 61 72 64  ache are discard
12450 65 64 20 62 65 66 6f 72 65 20 73 77 69 74 63 68  ed before switch
12460 69 6e 67 20 62 61 63 6b 20 74 6f 20 0a 2a 2a 20  ing back to .** 
12470 74 68 65 20 4f 50 45 4e 20 73 74 61 74 65 2e 20  the OPEN state. 
12480 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  Regardless of wh
12490 65 74 68 65 72 20 74 68 65 20 70 61 67 65 72 20  ether the pager 
124a0 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  is in exclusive-
124b0 6d 6f 64 65 0a 2a 2a 20 6f 72 20 6e 6f 74 2c 20  mode.** or not, 
124c0 61 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  any journal file
124d0 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
124e0 65 2d 73 79 73 74 65 6d 20 77 69 6c 6c 20 62 65  e-system will be
124f0 20 74 72 65 61 74 65 64 0a 2a 2a 20 61 73 20 61   treated.** as a
12500 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
12510 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 65   rolled back the
12520 20 6e 65 78 74 20 74 69 6d 65 20 61 20 72 65 61   next time a rea
12530 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  d-transaction.**
12540 20 69 73 20 6f 70 65 6e 65 64 20 28 62 79 20 74   is opened (by t
12550 68 69 73 20 6f 72 20 62 79 20 61 6e 79 20 6f 74  his or by any ot
12560 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 2e  her connection).
12570 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12580 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
12590 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20  er *pPager){..  
125a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
125b0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
125c0 41 44 45 52 20 0a 20 20 20 20 20 20 20 7c 7c 20  ADER .       || 
125d0 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
125e0 50 41 47 45 52 5f 4f 50 45 4e 20 0a 20 20 20 20  PAGER_OPEN .    
125f0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53     || pPager->eS
12600 74 61 74 65 3d 3d 50 41 47 45 52 5f 45 52 52 4f  tate==PAGER_ERRO
12610 52 20 0a 20 20 29 3b 0a 0a 20 20 73 71 6c 69 74  R .  );..  sqlit
12620 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
12630 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
12640 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
12650 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
12660 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
12670 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a  oints(pPager);..
12680 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
12690 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
126a0 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e   assert( !isOpen
126b0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
126c0 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45  .    sqlite3WalE
126d0 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69 6f  ndReadTransactio
126e0 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b  n(pPager->pWal);
126f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
12700 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
12710 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70  ;.  }else if( !p
12720 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
12730 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Mode ){.    int 
12740 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
12750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
12760 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
12770 20 62 79 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44   by pagerUnlockD
12780 62 28 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  b() */.    int i
12790 44 63 20 3d 20 69 73 4f 70 65 6e 28 70 50 61 67  Dc = isOpen(pPag
127a0 65 72 2d 3e 66 64 29 3f 73 71 6c 69 74 65 33 4f  er->fd)?sqlite3O
127b0 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
127c0 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
127d0 64 29 3a 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  d):0;..    /* If
127e0 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
127f0 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 64 65  ystem support de
12800 6c 65 74 69 6f 6e 20 6f 66 20 6f 70 65 6e 20 66  letion of open f
12810 69 6c 65 73 2c 20 74 68 65 6e 0a 20 20 20 20 2a  iles, then.    *
12820 2a 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72  * close the jour
12830 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72  nal file when dr
12840 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62  opping the datab
12850 61 73 65 20 6c 6f 63 6b 2e 20 20 4f 74 68 65 72  ase lock.  Other
12860 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 6e 6f 74  wise.    ** anot
12870 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  her connection w
12880 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  ith journal_mode
12890 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 20 64 65  =delete might de
128a0 6c 65 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20  lete the file.  
128b0 20 20 2a 2a 20 6f 75 74 20 66 72 6f 6d 20 75 6e    ** out from un
128c0 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20  der us..    */. 
128d0 20 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45     assert( (PAGE
128e0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
128f0 4d 4f 52 59 20 20 20 26 20 35 29 21 3d 31 20 29  MORY   & 5)!=1 )
12900 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  ;.    assert( (P
12910 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
12920 5f 4f 46 46 20 20 20 20 20 20 26 20 35 29 21 3d  _OFF      & 5)!=
12930 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
12940 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
12950 4f 44 45 5f 57 41 4c 20 20 20 20 20 20 26 20 35  ODE_WAL      & 5
12960 29 21 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )!=1 );.    asse
12970 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
12980 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 20 20  ALMODE_DELETE   
12990 26 20 35 29 21 3d 31 20 29 3b 0a 20 20 20 20 61  & 5)!=1 );.    a
129a0 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
129b0 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
129c0 54 45 20 26 20 35 29 3d 3d 31 20 29 3b 0a 20 20  TE & 5)==1 );.  
129d0 20 20 61 73 73 65 72 74 28 20 28 50 41 47 45 52    assert( (PAGER
129e0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
129f0 53 49 53 54 20 20 26 20 35 29 3d 3d 31 20 29 3b  SIST  & 5)==1 );
12a00 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63  .    if( 0==(iDc
12a10 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   & SQLITE_IOCAP_
12a20 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
12a30 5f 4f 50 45 4e 29 0a 20 20 20 20 20 7c 7c 20 31  _OPEN).     || 1
12a40 21 3d 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  !=(pPager->journ
12a50 61 6c 4d 6f 64 65 20 26 20 35 29 0a 20 20 20 20  alMode & 5).    
12a60 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12a70 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
12a80 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  jfd);.    }..   
12a90 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
12aa0 20 69 73 20 69 6e 20 74 68 65 20 45 52 52 4f 52   is in the ERROR
12ab0 20 73 74 61 74 65 20 61 6e 64 20 74 68 65 20 63   state and the c
12ac0 61 6c 6c 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  all to unlock th
12ad0 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
12ae0 2a 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 73 65  * file fails, se
12af0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
12b00 63 6b 20 74 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f  ck to UNKNOWN_LO
12b10 43 4b 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  CK. See the comm
12b20 65 6e 74 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  ent.    ** above
12b30 20 74 68 65 20 23 64 65 66 69 6e 65 20 66 6f 72   the #define for
12b40 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 66 6f   UNKNOWN_LOCK fo
12b50 72 20 61 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  r an explanation
12b60 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20 20   of why this.   
12b70 20 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79   ** is necessary
12b80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
12b90 3d 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28  = pagerUnlockDb(
12ba0 70 50 61 67 65 72 2c 20 4e 4f 5f 4c 4f 43 4b 29  pPager, NO_LOCK)
12bb0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
12bc0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
12bd0 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
12be0 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20  _ERROR ){.      
12bf0 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20  pPager->eLock = 
12c00 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 3b 0a 20 20  UNKNOWN_LOCK;.  
12c10 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
12c20 70 61 67 65 72 20 73 74 61 74 65 20 6d 61 79 20  pager state may 
12c30 62 65 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20  be changed from 
12c40 50 41 47 45 52 5f 45 52 52 4f 52 20 74 6f 20 50  PAGER_ERROR to P
12c50 41 47 45 52 5f 4f 50 45 4e 20 68 65 72 65 0a 20  AGER_OPEN here. 
12c60 20 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 63 6c     ** without cl
12c70 65 61 72 69 6e 67 20 74 68 65 20 65 72 72 6f 72  earing the error
12c80 20 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 69   code. This is i
12c90 6e 74 65 6e 74 69 6f 6e 61 6c 20 2d 20 74 68 65  ntentional - the
12ca0 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20 63 6f   error.    ** co
12cb0 64 65 20 69 73 20 63 6c 65 61 72 65 64 20 61 6e  de is cleared an
12cc0 64 20 74 68 65 20 63 61 63 68 65 20 72 65 73 65  d the cache rese
12cd0 74 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 62  t in the block b
12ce0 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elow..    */.   
12cf0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
12d00 3e 65 72 72 43 6f 64 65 20 7c 7c 20 70 50 61 67  >errCode || pPag
12d10 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
12d20 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 20 20 70  R_ERROR );.    p
12d30 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
12d40 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ntDone = 0;.    
12d50 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
12d60 20 50 41 47 45 52 5f 4f 50 45 4e 3b 0a 20 20 7d   PAGER_OPEN;.  }
12d70 0a 0a 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e  ..  /* If Pager.
12d80 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20  errCode is set, 
12d90 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
12da0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
12db0 63 61 6e 6e 6f 74 20 62 65 0a 20 20 2a 2a 20 74  cannot be.  ** t
12dc0 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74  rusted. Now that
12dd0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
12de0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
12df0 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
12e00 72 2c 0a 20 20 2a 2a 20 69 74 20 63 61 6e 20 73  r,.  ** it can s
12e10 61 66 65 6c 79 20 6d 6f 76 65 20 62 61 63 6b 20  afely move back 
12e20 74 6f 20 50 41 47 45 52 5f 4f 50 45 4e 20 73 74  to PAGER_OPEN st
12e30 61 74 65 2e 20 54 68 69 73 20 68 61 70 70 65 6e  ate. This happen
12e40 73 20 69 6e 20 62 6f 74 68 0a 20 20 2a 2a 20 6e  s in both.  ** n
12e50 6f 72 6d 61 6c 20 61 6e 64 20 65 78 63 6c 75 73  ormal and exclus
12e60 69 76 65 2d 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  ive-locking mode
12e70 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
12e80 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12e90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  ==SQLITE_OK || !
12ea0 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70  MEMDB );.  if( p
12eb0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
12ec0 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
12ed0 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b  ->tempFile==0 ){
12ee0 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
12ef0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
12f00 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
12f10 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20  CountDone = 0;. 
12f20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74       pPager->eSt
12f30 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
12f40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12f50 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74     pPager->eStat
12f60 65 20 3d 20 28 69 73 4f 70 65 6e 28 70 50 61 67  e = (isOpen(pPag
12f70 65 72 2d 3e 6a 66 64 29 20 3f 20 50 41 47 45 52  er->jfd) ? PAGER
12f80 5f 4f 50 45 4e 20 3a 20 50 41 47 45 52 5f 52 45  _OPEN : PAGER_RE
12f90 41 44 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ADER);.    }.   
12fa0 20 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50   if( USEFETCH(pP
12fb0 61 67 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f  ager) ) sqlite3O
12fc0 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
12fd0 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >fd, 0, 0);.    
12fe0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
12ff0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
13000 20 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64   setGetterMethod
13010 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
13020 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13030 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Off = 0;.  pPage
13040 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
13050 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  0;.  pPager->set
13060 4d 61 73 74 65 72 20 3d 20 30 3b 0a 7d 0a 0a 2f  Master = 0;.}../
13070 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
13080 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
13090 6e 65 76 65 72 20 61 6e 20 49 4f 45 52 52 20 6f  never an IOERR o
130a0 72 20 46 55 4c 4c 20 65 72 72 6f 72 20 74 68 61  r FULL error tha
130b0 74 20 72 65 71 75 69 72 65 73 0a 2a 2a 20 74 68  t requires.** th
130c0 65 20 70 61 67 65 72 20 74 6f 20 74 72 61 6e 73  e pager to trans
130d0 69 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 45  ition into the E
130e0 52 52 4f 52 20 73 74 61 74 65 20 6d 61 79 20 61  RROR state may a
130f0 68 76 65 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  hve occurred..**
13100 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
13110 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
13120 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73 74   to the pager st
13130 72 75 63 74 75 72 65 2c 20 74 68 65 20 73 65 63  ructure, the sec
13140 6f 6e 64 20 0a 2a 2a 20 74 68 65 20 65 72 72 6f  ond .** the erro
13150 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20  r-code about to 
13160 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  be returned by a
13170 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74   pager API funct
13180 69 6f 6e 2e 20 54 68 65 20 0a 2a 2a 20 76 61 6c  ion. The .** val
13190 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61  ue returned is a
131a0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63   copy of the sec
131b0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
131c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a  this function. .
131d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63  **.** If the sec
131e0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
131f0 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c  SQLITE_FULL, SQL
13200 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 6f 6e 65  ITE_IOERR or one
13210 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4f 45 52 52   of the.** IOERR
13220 20 73 75 62 2d 63 6f 64 65 73 2c 20 74 68 65 20   sub-codes, the 
13230 70 61 67 65 72 20 65 6e 74 65 72 73 20 74 68 65  pager enters the
13240 20 45 52 52 4f 52 20 73 74 61 74 65 20 61 6e 64   ERROR state and
13250 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a   the error code.
13260 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ** is stored in 
13270 50 61 67 65 72 2e 65 72 72 43 6f 64 65 2e 20 57  Pager.errCode. W
13280 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 72  hile the pager r
13290 65 6d 61 69 6e 73 20 69 6e 20 74 68 65 20 45 52  emains in the ER
132a0 52 4f 52 20 73 74 61 74 65 2c 0a 2a 2a 20 61 6c  ROR state,.** al
132b0 6c 20 6d 61 6a 6f 72 20 41 50 49 20 63 61 6c 6c  l major API call
132c0 73 20 6f 6e 20 74 68 65 20 50 61 67 65 72 20 77  s on the Pager w
132d0 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ill immediately 
132e0 72 65 74 75 72 6e 20 50 61 67 65 72 2e 65 72 72  return Pager.err
132f0 43 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Code..**.** The 
13300 45 52 52 4f 52 20 73 74 61 74 65 20 69 6e 64 69  ERROR state indi
13310 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63  cates that the c
13320 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
13330 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63  ager-cache .** c
13340 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64  annot be trusted
13350 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61 6e  . This state can
13360 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 63   be cleared by c
13370 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72  ompletely discar
13380 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e  ding .** the con
13390 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
133a0 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74  er-cache. If a t
133b0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61  ransaction was a
133c0 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68  ctive when.** th
133d0 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72  e persistent err
133e0 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65  or occurred, the
133f0 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
13400 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a  ournal may need.
13410 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65  ** to be replaye
13420 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  d to restore the
13430 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
13440 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
13450 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72 65  as if.** it were
13460 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e   a hot-journal).
13470 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
13480 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72  ager_error(Pager
13490 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63   *pPager, int rc
134a0 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72  ){.  int rc2 = r
134b0 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65  c & 0xff;.  asse
134c0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
134d0 4b 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20  K || !MEMDB );. 
134e0 20 61 73 73 65 72 74 28 0a 20 20 20 20 20 20 20   assert(.       
134f0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
13500 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a  =SQLITE_FULL ||.
13510 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
13520 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
13530 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61  K ||.       (pPa
13540 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30  ger->errCode & 0
13550 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  xff)==SQLITE_IOE
13560 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  RR.  );.  if( rc
13570 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  2==SQLITE_FULL |
13580 7c 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f  | rc2==SQLITE_IO
13590 45 52 52 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ERR ){.    pPage
135a0 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b  r->errCode = rc;
135b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74  .    pPager->eSt
135c0 61 74 65 20 3d 20 50 41 47 45 52 5f 45 52 52 4f  ate = PAGER_ERRO
135d0 52 3b 0a 20 20 20 20 73 65 74 47 65 74 74 65 72  R;.    setGetter
135e0 4d 65 74 68 6f 64 28 70 50 61 67 65 72 29 3b 0a  Method(pPager);.
135f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
13600 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .}..static int p
13610 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
13620 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
13630 6f 20 6e 50 61 67 65 29 3b 0a 0a 2f 2a 0a 2a 2a  o nPage);../*.**
13640 20 54 68 65 20 77 72 69 74 65 20 74 72 61 6e 73   The write trans
13650 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 6e 20 70  action open on p
13660 50 61 67 65 72 20 69 73 20 62 65 69 6e 67 20 63  Pager is being c
13670 6f 6d 6d 69 74 74 65 64 20 28 62 43 6f 6d 6d 69  ommitted (bCommi
13680 74 3d 3d 31 29 0a 2a 2a 20 6f 72 20 72 6f 6c 6c  t==1).** or roll
13690 65 64 20 62 61 63 6b 20 28 62 43 6f 6d 6d 69 74  ed back (bCommit
136a0 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ==0)..**.** Retu
136b0 72 6e 20 54 52 55 45 20 69 66 20 61 6e 64 20 6f  rn TRUE if and o
136c0 6e 6c 79 20 69 66 20 61 6c 6c 20 64 69 72 74 79  nly if all dirty
136d0 20 70 61 67 65 73 20 73 68 6f 75 6c 64 20 62 65   pages should be
136e0 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b   flushed to disk
136f0 2e 0a 2a 2a 0a 2a 2a 20 52 75 6c 65 73 3a 0a 2a  ..**.** Rules:.*
13700 2a 0a 2a 2a 20 20 20 2a 20 20 46 6f 72 20 6e 6f  *.**   *  For no
13710 6e 2d 54 45 4d 50 20 64 61 74 61 62 61 73 65 73  n-TEMP databases
13720 2c 20 61 6c 77 61 79 73 20 73 79 6e 63 20 74 6f  , always sync to
13730 20 64 69 73 6b 2e 20 20 54 68 69 73 20 69 73 20   disk.  This is 
13740 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 20 20 20  necessary.**    
13750 20 20 66 6f 72 20 74 72 61 6e 73 61 63 74 69 6f    for transactio
13760 6e 73 20 74 6f 20 62 65 20 64 75 72 61 62 6c 65  ns to be durable
13770 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 53 79 6e  ..**.**   *  Syn
13780 63 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  c TEMP database 
13790 6f 6e 6c 79 20 6f 6e 20 61 20 43 4f 4d 4d 49 54  only on a COMMIT
137a0 20 28 6e 6f 74 20 61 20 52 4f 4c 4c 42 41 43 4b   (not a ROLLBACK
137b0 29 20 77 68 65 6e 20 74 68 65 20 62 61 63 6b 69  ) when the backi
137c0 6e 67 0a 2a 2a 20 20 20 20 20 20 66 69 6c 65 20  ng.**      file 
137d0 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64  has been created
137e0 20 61 6c 72 65 61 64 79 20 28 76 69 61 20 61 20   already (via a 
137f0 73 70 69 6c 6c 20 6f 6e 20 70 61 67 65 72 53 74  spill on pagerSt
13800 72 65 73 73 28 29 29 20 61 6e 64 0a 2a 2a 20 20  ress()) and.**  
13810 20 20 20 20 77 68 65 6e 20 74 68 65 20 6e 75 6d      when the num
13820 62 65 72 20 6f 66 20 64 69 72 74 79 20 70 61 67  ber of dirty pag
13830 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 65 78 63  es in memory exc
13840 65 65 64 73 20 32 35 25 20 6f 66 20 74 68 65 20  eeds 25% of the 
13850 74 6f 74 61 6c 0a 2a 2a 20 20 20 20 20 20 63 61  total.**      ca
13860 63 68 65 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61  che size..*/.sta
13870 74 69 63 20 69 6e 74 20 70 61 67 65 72 46 6c 75  tic int pagerFlu
13880 73 68 4f 6e 43 6f 6d 6d 69 74 28 50 61 67 65 72  shOnCommit(Pager
13890 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 62 43   *pPager, int bC
138a0 6f 6d 6d 69 74 29 7b 0a 20 20 69 66 28 20 70 50  ommit){.  if( pP
138b0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d  ager->tempFile==
138c0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
138d0 69 66 28 20 21 62 43 6f 6d 6d 69 74 20 29 20 72  if( !bCommit ) r
138e0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
138f0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
13900 64 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  d) ) return 0;. 
13910 20 72 65 74 75 72 6e 20 28 73 71 6c 69 74 65 33   return (sqlite3
13920 50 43 61 63 68 65 50 65 72 63 65 6e 74 44 69 72  PCachePercentDir
13930 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ty(pPager->pPCac
13940 68 65 29 3e 3d 32 35 29 3b 0a 7d 0a 0a 2f 2a 0a  he)>=25);.}../*.
13950 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13960 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69  ends a transacti
13970 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f  on. A transactio
13980 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64  n is usually end
13990 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72  ed by .** either
139a0 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52   a COMMIT or a R
139b0 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f  OLLBACK operatio
139c0 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  n. This routine 
139d0 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a  may be called .*
139e0 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b  * after rollback
139f0 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   of a hot-journa
13a00 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f  l, or if an erro
13a10 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f  r occurs while o
13a20 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f  pening.** the jo
13a30 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72  urnal file or wr
13a40 69 74 69 6e 67 20 74 68 65 20 76 65 72 79 20 66  iting the very f
13a50 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
13a60 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61  der of a.** data
13a70 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
13a80 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ..** .** This ro
13a90 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
13aa0 61 6c 6c 65 64 20 69 6e 20 50 41 47 45 52 5f 45  alled in PAGER_E
13ab0 52 52 4f 52 20 73 74 61 74 65 2e 20 49 66 20 69  RROR state. If i
13ac0 74 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 69  t is called.** i
13ad0 6e 20 50 41 47 45 52 5f 4e 4f 4e 45 20 6f 72 20  n PAGER_NONE or 
13ae0 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61  PAGER_SHARED sta
13af0 74 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  te and the lock 
13b00 68 65 6c 64 20 69 73 20 6c 65 73 73 0a 2a 2a 20  held is less.** 
13b10 65 78 63 6c 75 73 69 76 65 20 74 68 61 6e 20 61  exclusive than a
13b20 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
13b30 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
13b40 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
13b50 61 6e 79 20 61 63 74 69 76 65 20 73 61 76 65 70  any active savep
13b60 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65 61 73  oints are releas
13b70 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
13b80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
13b90 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 69   open, then it i
13ba0 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f  s "finalized". O
13bb0 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a  nce a journal .*
13bc0 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  * file has been 
13bd0 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69 73 20  finalized it is 
13be0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
13bf0 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62  use it to roll b
13c00 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61  ack a .** transa
13c10 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20  ction. Nor will 
13c20 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  it be considered
13c30 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75   to be a hot-jou
13c40 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20  rnal by this.** 
13c50 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74  or any other dat
13c60 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
13c70 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 61 20  . Exactly how a 
13c80 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c  journal is final
13c90 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20  ized.** depends 
13ca0 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
13cb0 74 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  t the pager is r
13cc0 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
13cd0 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20  ive mode and.** 
13ce0 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75 72  the current jour
13cf0 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e  nal-mode (Pager.
13d00 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75  journalMode valu
13d10 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  e), as follows:.
13d20 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
13d30 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20  ode==MEMORY.**  
13d40 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     Journal file 
13d50 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 73 69  descriptor is si
13d60 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68 69  mply closed. Thi
13d70 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a  s destroys an .*
13d80 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20  *     in-memory 
13d90 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20  journal..**.**  
13da0 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52   journalMode==TR
13db0 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f  UNCATE.**     Jo
13dc0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 72  urnal file is tr
13dd0 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
13de0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
13df0 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
13e00 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20  de==PERSIST.**  
13e10 20 20 20 54 68 65 20 66 69 72 73 74 20 32 38 20     The first 28 
13e20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75  bytes of the jou
13e30 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20 7a 65  rnal file are ze
13e40 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76 61 6c  roed. This inval
13e50 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20 74 68  idates.**     th
13e60 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
13e70 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 66 69  header in the fi
13e80 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20 74 68  le, and hence th
13e90 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
13ea0 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20 41 6e  .**     file. An
13eb0 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c   invalid journal
13ec0 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20   file cannot be 
13ed0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
13ee0 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
13ef0 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20  ==DELETE.**     
13f00 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
13f10 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 64   is closed and d
13f20 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73 71 6c  eleted using sql
13f30 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a  ite3OsDelete()..
13f40 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 65  **.**     If the
13f50 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
13f60 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
13f70 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68 6f 64  ode, this method
13f80 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a   of finalizing.*
13f90 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61  *     the journa
13fa0 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20  l file is never 
13fb0 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c 20 69  used. Instead, i
13fc0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64  f the journalMod
13fd0 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45  e is.**     DELE
13fe0 54 45 20 61 6e 64 20 74 68 65 20 70 61 67 65 72  TE and the pager
13ff0 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65   is in exclusive
14000 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74 68 6f   mode, the metho
14010 64 20 64 65 73 63 72 69 62 65 64 20 75 6e 64 65  d described unde
14020 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c  r.**     journal
14030 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20 69 73  Mode==PERSIST is
14040 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a   used instead..*
14050 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 6a  *.** After the j
14060 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69  ournal is finali
14070 7a 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 6d  zed, the pager m
14080 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f 52 45  oves to PAGER_RE
14090 41 44 45 52 20 73 74 61 74 65 2e 0a 2a 2a 20 49  ADER state..** I
140a0 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e  f running in non
140b0 2d 65 78 63 6c 75 73 69 76 65 20 72 6f 6c 6c 62  -exclusive rollb
140c0 61 63 6b 20 6d 6f 64 65 2c 20 74 68 65 20 6c 6f  ack mode, the lo
140d0 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69  ck on the file i
140e0 73 20 0a 2a 2a 20 64 6f 77 6e 67 72 61 64 65 64  s .** downgraded
140f0 20 74 6f 20 61 20 53 48 41 52 45 44 5f 4c 4f 43   to a SHARED_LOC
14100 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  K..**.** SQLITE_
14110 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
14120 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
14130 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  s. If an error o
14140 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20  ccurs during.** 
14150 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70  any of the IO op
14160 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61  erations to fina
14170 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lize the journal
14180 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20   file or unlock 
14190 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
141a0 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
141b0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
141c0 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20  ed to the user. 
141d0 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61  If the .** opera
141e0 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65  tion to finalize
141f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
14200 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68  e fails, then th
14210 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20  e code still.** 
14220 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20  tries to unlock 
14230 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14240 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c  e if not in excl
14250 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74  usive mode. If t
14260 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65  he.** unlock ope
14270 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20  ration fails as 
14280 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66  well, then the f
14290 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20  irst error code 
142a0 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68  related.** to th
142b0 65 20 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e  e first error en
142c0 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a  countered (the j
142d0 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74  ournal finalizat
142e0 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72  ion one) is.** r
142f0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
14300 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64  ic int pager_end
14310 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67  _transaction(Pag
14320 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
14330 68 61 73 4d 61 73 74 65 72 2c 20 69 6e 74 20 62  hasMaster, int b
14340 43 6f 6d 6d 69 74 29 7b 0a 20 20 69 6e 74 20 72  Commit){.  int r
14350 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
14360 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
14370 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66  e from journal f
14380 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65 72  inalization oper
14390 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ation */.  int r
143a0 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  c2 = SQLITE_OK; 
143b0 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
143c0 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20 75  e from db file u
143d0 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
143e0 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 68  */..  /* Do noth
143f0 69 6e 67 20 69 66 20 74 68 65 20 70 61 67 65 72  ing if the pager
14400 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
14410 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
14420 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 72  nsaction.  ** or
14430 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45   at least a RESE
14440 52 56 45 44 20 6c 6f 63 6b 2e 20 54 68 69 73 20  RVED lock. This 
14450 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
14460 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  called when ther
14470 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 72 69  e.  ** is no wri
14480 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  te-transaction a
14490 63 74 69 76 65 20 62 75 74 20 61 20 52 45 53 45  ctive but a RESE
144a0 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  RVED or greater 
144b0 6c 6f 63 6b 20 69 73 0a 20 20 2a 2a 20 68 65 6c  lock is.  ** hel
144c0 64 20 75 6e 64 65 72 20 74 77 6f 20 63 69 72 63  d under two circ
144d0 75 6d 73 74 61 6e 63 65 73 3a 0a 20 20 2a 2a 0a  umstances:.  **.
144e0 20 20 2a 2a 20 20 20 31 2e 20 41 66 74 65 72 20    **   1. After 
144f0 61 20 73 75 63 63 65 73 73 66 75 6c 20 68 6f 74  a successful hot
14500 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
14510 6b 2c 20 69 74 20 69 73 20 63 61 6c 6c 65 64 20  k, it is called 
14520 77 69 74 68 0a 20 20 2a 2a 20 20 20 20 20 20 65  with.  **      e
14530 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4e 4f 4e  State==PAGER_NON
14540 45 20 61 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43  E and eLock==EXC
14550 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 20 20 2a  LUSIVE_LOCK..  *
14560 2a 0a 20 20 2a 2a 20 20 20 32 2e 20 49 66 20 61  *.  **   2. If a
14570 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
14580 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78   locking_mode=ex
14590 63 6c 75 73 69 76 65 20 68 6f 6c 64 69 6e 67 20  clusive holding 
145a0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 20 20  an EXCLUSIVE .  
145b0 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 20 73 77 69  **      lock swi
145c0 74 63 68 65 73 20 62 61 63 6b 20 74 6f 20 6c 6f  tches back to lo
145d0 63 6b 69 6e 67 5f 6d 6f 64 65 3d 6e 6f 72 6d 61  cking_mode=norma
145e0 6c 20 61 6e 64 20 74 68 65 6e 20 65 78 65 63 75  l and then execu
145f0 74 65 73 20 61 0a 20 20 2a 2a 20 20 20 20 20 20  tes a.  **      
14600 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
14610 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
14620 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 65  is called with e
14630 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
14640 44 45 52 20 0a 20 20 2a 2a 20 20 20 20 20 20 61  DER .  **      a
14650 6e 64 20 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  nd eLock==EXCLUS
14660 49 56 45 5f 4c 4f 43 4b 20 77 68 65 6e 20 74 68  IVE_LOCK when th
14670 65 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  e read-transacti
14680 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20  on is closed..  
14690 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  */.  assert( ass
146a0 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
146b0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
146c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
146d0 61 74 65 21 3d 50 41 47 45 52 5f 45 52 52 4f 52  ate!=PAGER_ERROR
146e0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
146f0 2d 3e 65 53 74 61 74 65 3c 50 41 47 45 52 5f 57  ->eState<PAGER_W
14700 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 26 26 20  RITER_LOCKED && 
14710 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3c 52 45  pPager->eLock<RE
14720 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SERVED_LOCK ){. 
14730 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14740 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 65 6c 65  _OK;.  }..  rele
14750 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73  aseAllSavepoints
14760 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65  (pPager);.  asse
14770 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
14780 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  r->jfd) || pPage
14790 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
147a0 20 0a 20 20 20 20 20 20 7c 7c 20 28 73 71 6c 69   .      || (sqli
147b0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
147c0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
147d0 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f  r->fd)&SQLITE_IO
147e0 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43  CAP_BATCH_ATOMIC
147f0 29 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 73 4f  ).  );.  if( isO
14800 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
14810 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
14820 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
14830 67 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  ger) );..    /* 
14840 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  Finalize the jou
14850 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
14860 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f 75    if( sqlite3Jou
14870 72 6e 61 6c 49 73 49 6e 4d 65 6d 6f 72 79 28 70  rnalIsInMemory(p
14880 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
14890 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20       /* assert( 
148a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
148b0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
148c0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b  ALMODE_MEMORY );
148d0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
148e0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
148f0 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  >jfd);.    }else
14900 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
14910 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
14920 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
14930 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 66  CATE ){.      if
14940 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
14950 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lOff==0 ){.     
14960 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
14970 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
14980 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
14990 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
149a0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a  Pager->jfd, 0);.
149b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
149c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
149d0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
149e0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  .          /* Ma
149f0 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20  ke sure the new 
14a00 66 69 6c 65 20 73 69 7a 65 20 69 73 20 77 72 69  file size is wri
14a10 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e  tten into the in
14a20 6f 64 65 20 72 69 67 68 74 20 61 77 61 79 2e 0a  ode right away..
14a30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68            ** Oth
14a40 65 72 77 69 73 65 20 74 68 65 20 6a 6f 75 72 6e  erwise the journ
14a50 61 6c 20 6d 69 67 68 74 20 72 65 73 75 72 72 65  al might resurre
14a60 63 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70  ct following a p
14a70 6f 77 65 72 20 6c 6f 73 73 20 61 6e 64 0a 20 20  ower loss and.  
14a80 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65          ** cause
14a90 20 74 68 65 20 6c 61 73 74 20 74 72 61 6e 73 61   the last transa
14aa0 63 74 69 6f 6e 20 74 6f 20 72 6f 6c 6c 20 62 61  ction to roll ba
14ab0 63 6b 2e 20 20 53 65 65 0a 20 20 20 20 20 20 20  ck.  See.       
14ac0 20 20 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 62 75     ** https://bu
14ad0 67 7a 69 6c 6c 61 2e 6d 6f 7a 69 6c 6c 61 2e 6f  gzilla.mozilla.o
14ae0 72 67 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f  rg/show_bug.cgi?
14af0 69 64 3d 31 30 37 32 37 37 33 0a 20 20 20 20 20  id=1072773.     
14b00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
14b10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14b20 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
14b30 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c  , pPager->syncFl
14b40 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ags);.        }.
14b50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
14b60 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
14b70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
14b80 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
14b90 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
14ba0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
14bb0 53 54 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ST.      || (pPa
14bc0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
14bd0 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  de && pPager->jo
14be0 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
14bf0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
14c00 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
14c10 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48  c = zeroJournalH
14c20 64 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61  dr(pPager, hasMa
14c30 73 74 65 72 7c 7c 70 50 61 67 65 72 2d 3e 74 65  ster||pPager->te
14c40 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 70  mpFile);.      p
14c50 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
14c60 66 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  f = 0;.    }else
14c70 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
14c80 62 72 61 6e 63 68 20 6d 61 79 20 62 65 20 65 78  branch may be ex
14c90 65 63 75 74 65 64 20 77 69 74 68 20 50 61 67 65  ecuted with Page
14ca0 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d  r.journalMode==M
14cb0 45 4d 4f 52 59 20 69 66 0a 20 20 20 20 20 20 2a  EMORY if.      *
14cc0 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  * a hot-journal 
14cd0 77 61 73 20 6a 75 73 74 20 72 6f 6c 6c 65 64 20  was just rolled 
14ce0 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
14cf0 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  se the journal. 
14d00 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 73 68 6f       ** file sho
14d10 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 61 6e  uld be closed an
14d20 64 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68  d deleted. If th
14d30 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72  is connection wr
14d40 69 74 65 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ites to.      **
14d50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14d60 6c 65 2c 20 69 74 20 77 69 6c 6c 20 64 6f 20 73  le, it will do s
14d70 6f 20 75 73 69 6e 67 20 61 6e 20 69 6e 2d 6d 65  o using an in-me
14d80 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  mory journal..  
14d90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
14da0 20 62 44 65 6c 65 74 65 20 3d 20 21 70 50 61 67   bDelete = !pPag
14db0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
14dc0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
14dd0 74 65 33 4a 6f 75 72 6e 61 6c 49 73 49 6e 4d 65  te3JournalIsInMe
14de0 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64  mory(pPager->jfd
14df0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  )==0 );.      as
14e00 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
14e10 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
14e20 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
14e30 45 54 45 20 0a 20 20 20 20 20 20 20 20 20 20 20  ETE .           
14e40 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
14e50 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
14e60 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
14e70 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
14e80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
14e90 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
14ea0 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20 20  ALMODE_WAL .    
14eb0 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
14ec0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
14ed0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66  ->jfd);.      if
14ee0 28 20 62 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ( bDelete ){.   
14ef0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14f00 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
14f10 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
14f20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
14f30 2d 3e 65 78 74 72 61 53 79 6e 63 29 3b 0a 20 20  ->extraSync);.  
14f40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
14f50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
14f60 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 73 71 6c  HECK_PAGES.  sql
14f70 69 74 65 33 50 63 61 63 68 65 49 74 65 72 61 74  ite3PcacheIterat
14f80 65 44 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70  eDirty(pPager->p
14f90 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65  PCache, pager_se
14fa0 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 20 20 69  t_pagehash);.  i
14fb0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
14fc0 65 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 50  e==0 && sqlite3P
14fd0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
14fe0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30  ager->pPCache)>0
14ff0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
15000 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
15010 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29  ookup(pPager, 1)
15020 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
15030 20 20 20 20 20 70 2d 3e 70 61 67 65 48 61 73 68       p->pageHash
15040 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
15050 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74  te3PagerUnrefNot
15060 4e 75 6c 6c 28 70 29 3b 0a 20 20 20 20 7d 0a 20  Null(p);.    }. 
15070 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c   }.#endif..  sql
15080 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
15090 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
150a0 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d  rnal);.  pPager-
150b0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
150c0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20  .  pPager->nRec 
150d0 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  = 0;.  if( rc==S
150e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
150f0 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70 61 67  if( MEMDB || pag
15100 65 72 46 6c 75 73 68 4f 6e 43 6f 6d 6d 69 74 28  erFlushOnCommit(
15110 70 50 61 67 65 72 2c 20 62 43 6f 6d 6d 69 74 29  pPager, bCommit)
15120 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15130 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28  3PcacheCleanAll(
15140 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
15150 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15160 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
15170 43 6c 65 61 72 57 72 69 74 61 62 6c 65 28 70 50  ClearWritable(pP
15180 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
15190 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
151a0 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28  3PcacheTruncate(
151b0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
151c0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
151d0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67  ;.  }..  if( pag
151e0 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
151f0 20 29 7b 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20   ){.    /* Drop 
15200 74 68 65 20 57 41 4c 20 77 72 69 74 65 2d 6c 6f  the WAL write-lo
15210 63 6b 2c 20 69 66 20 61 6e 79 2e 20 41 6c 73 6f  ck, if any. Also
15220 2c 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  , if the connect
15230 69 6f 6e 20 77 61 73 20 69 6e 20 0a 20 20 20 20  ion was in .    
15240 2a 2a 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d  ** locking_mode=
15250 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 62  exclusive mode b
15260 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 2c  ut is no longer,
15270 20 64 72 6f 70 20 74 68 65 20 45 58 43 4c 55 53   drop the EXCLUS
15280 49 56 45 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  IVE .    ** lock
15290 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
152a0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
152b0 2a 2f 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  */.    rc2 = sql
152c0 69 74 65 33 57 61 6c 45 6e 64 57 72 69 74 65 54  ite3WalEndWriteT
152d0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
152e0 72 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 61 73  r->pWal);.    as
152f0 73 65 72 74 28 20 72 63 32 3d 3d 53 51 4c 49 54  sert( rc2==SQLIT
15300 45 5f 4f 4b 20 29 3b 0a 20 20 7d 65 6c 73 65 20  E_OK );.  }else 
15310 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15320 4b 20 26 26 20 62 43 6f 6d 6d 69 74 20 26 26 20  K && bCommit && 
15330 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
15340 7a 65 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze>pPager->dbSiz
15350 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  e ){.    /* This
15360 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e   branch is taken
15370 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67   when committing
15380 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
15390 6e 20 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e  n rollback-journ
153a0 61 6c 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 69  al.    ** mode i
153b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
153c0 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6c  ile on disk is l
153d0 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 64  arger than the d
153e0 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20  atabase image.. 
153f0 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f     ** At this po
15400 69 6e 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  int the journal 
15410 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
15420 65 64 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73  ed and the trans
15430 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 73  action .    ** s
15440 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 6d  uccessfully comm
15450 69 74 74 65 64 2c 20 62 75 74 20 74 68 65 20 45  itted, but the E
15460 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73  XCLUSIVE lock is
15470 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74   still held on t
15480 68 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20  he.    ** file. 
15490 53 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  So it is safe to
154a0 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 64 61   truncate the da
154b0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 69  tabase file to i
154c0 74 73 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a  ts minimum.    *
154d0 2a 20 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e  * required size.
154e0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
154f0 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d   pPager->eLock==
15500 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
15510 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
15520 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
15530 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
15540 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
15550 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
15560 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 72 63  Commit ){.    rc
15570 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
15580 43 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e  Control(pPager->
15590 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  fd, SQLITE_FCNTL
155a0 5f 43 4f 4d 4d 49 54 5f 50 48 41 53 45 54 57 4f  _COMMIT_PHASETWO
155b0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
155c0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  ==SQLITE_NOTFOUN
155d0 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  D ) rc = SQLITE_
155e0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  OK;.  }..  if( !
155f0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
15600 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 28 21 70  eMode .   && (!p
15610 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
15620 72 29 20 7c 7c 20 73 71 6c 69 74 65 33 57 61 6c  r) || sqlite3Wal
15630 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50  ExclusiveMode(pP
15640 61 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 29 0a  ager->pWal, 0)).
15650 20 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 70    ){.    rc2 = p
15660 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61  agerUnlockDb(pPa
15670 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
15680 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  );.    pPager->c
15690 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
156a0 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
156b0 2d 3e 65 53 74 61 74 65 20 3d 20 50 41 47 45 52  ->eState = PAGER
156c0 5f 52 45 41 44 45 52 3b 0a 20 20 70 50 61 67 65  _READER;.  pPage
156d0 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
156e0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  ;..  return (rc=
156f0 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72  =SQLITE_OK?rc2:r
15700 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65  c);.}../*.** Exe
15710 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  cute a rollback 
15720 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
15730 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75   is active and u
15740 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61  nlock the .** da
15750 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a  tabase file. .**
15760 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
15770 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74   has already ent
15780 65 72 65 64 20 74 68 65 20 45 52 52 4f 52 20 73  ered the ERROR s
15790 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74  tate, do not att
157a0 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c  empt .** the rol
157b0 6c 62 61 63 6b 20 61 74 20 74 68 69 73 20 74 69  lback at this ti
157c0 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67  me. Instead, pag
157d0 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63  er_unlock() is c
157e0 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61  alled. The.** ca
157f0 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
15800 63 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72  ck() will discar
15810 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20  d all in-memory 
15820 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a  pages, unlock.**
15830 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15840 6c 65 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20  le and move the 
15850 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 4f 50  pager back to OP
15860 45 4e 20 73 74 61 74 65 2e 20 49 66 20 74 68 69  EN state. If thi
15870 73 20 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74  s .** means that
15880 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d   there is a hot-
15890 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20  journal left in 
158a0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  the file-system,
158b0 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 63 6f   the next .** co
158c0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61  nnection to obta
158d0 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  in a shared lock
158e0 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28 77   on the pager (w
158f0 68 69 63 68 20 6d 61 79 20 62 65 20 74 68 69 73  hich may be this
15900 20 6f 6e 65 29 20 0a 2a 2a 20 77 69 6c 6c 20 72   one) .** will r
15910 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  oll it back..**.
15920 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
15930 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  has not already 
15940 65 6e 74 65 72 65 64 20 74 68 65 20 45 52 52 4f  entered the ERRO
15950 52 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20  R state, but an 
15960 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20  IO or.** malloc 
15970 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
15980 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
15990 74 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69  then this will i
159a0 74 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20  tself cause .** 
159b0 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74  the pager to ent
159c0 65 72 20 74 68 65 20 45 52 52 4f 52 20 73 74 61  er the ERROR sta
159d0 74 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62  te. Which will b
159e0 65 20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65  e cleared by the
159f0 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  .** call to page
15a00 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64  r_unlock(), as d
15a10 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a  escribed above..
15a20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
15a30 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
15a40 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
15a50 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
15a60 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
15a70 52 5f 45 52 52 4f 52 20 26 26 20 70 50 61 67 65  R_ERROR && pPage
15a80 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
15a90 5f 4f 50 45 4e 20 29 7b 0a 20 20 20 20 61 73 73  _OPEN ){.    ass
15aa0 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
15ab0 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
15ac0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
15ad0 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52  r->eState>=PAGER
15ae0 5f 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29  _WRITER_LOCKED )
15af0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
15b00 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
15b10 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ();.      sqlite
15b20 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
15b30 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71  Pager);.      sq
15b40 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
15b50 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c 73  lloc();.    }els
15b60 65 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65  e if( !pPager->e
15b70 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
15b80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
15b90 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
15ba0 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
15bb0 20 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72      pager_end_tr
15bc0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
15bd0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
15be0 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63   }.  pager_unloc
15bf0 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  k(pPager);.}../*
15c00 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44  .** Parameter aD
15c10 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ata must point t
15c20 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50  o a buffer of pP
15c30 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
15c40 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e  ytes.** of data.
15c50 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74   Compute and ret
15c60 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62  urn a checksum b
15c70 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e  ased ont the con
15c80 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a  tents of the .**
15c90 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e   page of data an
15ca0 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  d the current va
15cb0 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63  lue of pPager->c
15cc0 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20  ksumInit..**.** 
15cd0 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65  This is not a re
15ce0 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20  al checksum. It 
15cf0 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74  is really just t
15d00 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a  he sum of the .*
15d10 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  * random initial
15d20 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e   value (pPager->
15d30 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65  cksumInit) and e
15d40 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a  very 200th byte.
15d50 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  ** of the page d
15d60 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69  ata, starting wi
15d70 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28  th byte offset (
15d80 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
15d90 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62  %200)..** Each b
15da0 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74  yte is interpret
15db0 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75  ed as an 8-bit u
15dc0 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e  nsigned integer.
15dd0 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20  .**.** Changing 
15de0 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64  the formula used
15df0 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73   to compute this
15e00 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74   checksum result
15e10 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d  s in an.** incom
15e20 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20  patible journal 
15e30 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a  file format..**.
15e40 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f  ** If journal co
15e50 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20  rruption occurs 
15e60 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66  due to a power f
15e70 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74  ailure, the most
15e80 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e   likely .** scen
15e90 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65  ario is that one
15ea0 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65   end or the othe
15eb0 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  r of the record 
15ec0 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e  will be changed.
15ed0 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20   .** It is much 
15ee0 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74  less likely that
15ef0 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66   the two ends of
15f00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
15f10 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63  ord will be.** c
15f20 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d  orrect and the m
15f30 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74  iddle be corrupt
15f40 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63  .  Thus, this "c
15f50 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c  hecksum" scheme,
15f60 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20  .** though fast 
15f70 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63  and simple, catc
15f80 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c  hes the mostly l
15f90 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f  ikely kind of co
15fa0 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
15fb0 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b  tic u32 pager_ck
15fc0 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65  sum(Pager *pPage
15fd0 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61  r, const u8 *aDa
15fe0 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d  ta){.  u32 cksum
15ff0 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
16000 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  Init;         /*
16010 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   Checksum value 
16020 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
16030 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70  nt i = pPager->p
16040 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20  ageSize-200;    
16050 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
16060 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65  unter */.  while
16070 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73  ( i>0 ){.    cks
16080 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a  um += aData[i];.
16090 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20      i -= 200;.  
160a0 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d  }.  return cksum
160b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72  ;.}../*.** Repor
160c0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  t the current pa
160d0 67 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62  ge size and numb
160e0 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
160f0 79 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20  ytes back.** to 
16100 74 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69  the codec..*/.#i
16110 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
16120 43 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69  CODEC.static voi
16130 64 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a  d pagerReportSiz
16140 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
16150 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
16160 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29  xCodecSizeChng )
16170 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43  {.    pPager->xC
16180 6f 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61  odecSizeChng(pPa
16190 67 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61  ger->pCodec, pPa
161a0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20  ger->pageSize,. 
161b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161c0 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70            (int)p
161d0 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29  Pager->nReserve)
161e0 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
161f0 64 65 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f  define pagerRepo
16200 72 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a  rtSize(X)     /*
16210 20 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20   No-op if we do 
16220 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f  not support a co
16230 64 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 23  dec */.#endif..#
16240 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
16250 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 4d 61 6b  _CODEC./*.** Mak
16260 65 20 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65  e sure the numbe
16270 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 69  r of reserved bi
16280 74 73 20 69 73 20 74 68 65 20 73 61 6d 65 20 69  ts is the same i
16290 6e 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  n the destinatio
162a0 6e 0a 2a 2a 20 70 61 67 65 72 20 61 73 20 69 74  n.** pager as it
162b0 20 69 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63   is in the sourc
162c0 65 2e 20 20 54 68 69 73 20 63 6f 6d 65 73 20 75  e.  This comes u
162d0 70 20 77 68 65 6e 20 61 20 56 41 43 55 55 4d 20  p when a VACUUM 
162e0 63 68 61 6e 67 65 73 20 74 68 65 0a 2a 2a 20 6e  changes the.** n
162f0 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
16300 64 20 62 69 74 73 20 74 6f 20 74 68 65 20 22 6f  d bits to the "o
16310 70 74 69 6d 61 6c 22 20 61 6d 6f 75 6e 74 2e 0a  ptimal" amount..
16320 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
16330 61 67 65 72 41 6c 69 67 6e 52 65 73 65 72 76 65  agerAlignReserve
16340 28 50 61 67 65 72 20 2a 70 44 65 73 74 2c 20 50  (Pager *pDest, P
16350 61 67 65 72 20 2a 70 53 72 63 29 7b 0a 20 20 69  ager *pSrc){.  i
16360 66 28 20 70 44 65 73 74 2d 3e 6e 52 65 73 65 72  f( pDest->nReser
16370 76 65 21 3d 70 53 72 63 2d 3e 6e 52 65 73 65 72  ve!=pSrc->nReser
16380 76 65 20 29 7b 0a 20 20 20 20 70 44 65 73 74 2d  ve ){.    pDest-
16390 3e 6e 52 65 73 65 72 76 65 20 3d 20 70 53 72 63  >nReserve = pSrc
163a0 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  ->nReserve;.    
163b0 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
163c0 70 44 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65  pDest);.  }.}.#e
163d0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
163e0 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66   a single page f
163f0 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a  rom either the j
16400 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20  ournal file (if 
16410 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f  isMainJrnl==1) o
16420 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75  r.** from the su
16430 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73  b-journal (if is
16440 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64  MainJrnl==0) and
16450 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70   playback that p
16460 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65  age..** The page
16470 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65   begins at offse
16480 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20  t *pOffset into 
16490 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70  the file. The *p
164a0 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20  Offset.** value 
164b0 69 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20  is increased to 
164c0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
164d0 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
164e0 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
164f0 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   The main rollba
16500 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 20  ck journal uses 
16510 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20  checksums - the 
16520 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
16530 6c 20 64 6f 65 73 20 0a 2a 2a 20 6e 6f 74 2e 0a  l does .** not..
16540 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
16550 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
16560 70 61 67 65 20 72 65 63 6f 72 64 20 72 65 61 64  page record read
16570 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29   from the (sub-)
16580 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
16590 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
165a0 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
165b0 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a  e of Pager.dbSiz
165c0 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b  e, then playback
165d0 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61   is.** skipped a
165e0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  nd SQLITE_OK is 
165f0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
16600 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20  If pDone is not 
16610 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73  NULL, then it is
16620 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67   a record of pag
16630 65 73 20 74 68 61 74 20 68 61 76 65 20 61 6c 72  es that have alr
16640 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61  eady.** been pla
16650 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68  yed back.  If th
16660 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73  e page at *pOffs
16670 65 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  et has already b
16680 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a  een played back.
16690 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72 65  ** (if the corre
166a0 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62  sponding pDone b
166b0 69 74 20 69 73 20 73 65 74 29 20 74 68 65 6e 20  it is set) then 
166c0 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61 63  skip the playbac
166d0 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  k..** Make sure 
166e0 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f  the pDone bit co
166f0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
16700 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65  he *pOffset page
16710 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72   is set.** prior
16720 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a   to returning..*
16730 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
16740 20 72 65 63 6f 72 64 20 69 73 20 73 75 63 63 65   record is succe
16750 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f  ssfully read fro
16760 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72  m the (sub-)jour
16770 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20  nal file.** and 
16780 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65  played back, the
16790 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  n SQLITE_OK is r
167a0 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49  eturned. If an I
167b0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a  O error occurs.*
167c0 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20  * while reading 
167d0 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20  the record from 
167e0 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
167f0 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20  l file or while 
16800 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68  writing.** to th
16810 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
16820 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
16830 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
16840 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20  ned. If data.** 
16850 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
16860 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73  read from the (s
16870 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ub-)journal file
16880 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f 20   but appears to 
16890 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c  be.** corrupted,
168a0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
168b0 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69  returned. Data i
168c0 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72  s considered cor
168d0 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f  rupted in.** two
168e0 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a   circumstances:.
168f0 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  ** .**   * If th
16900 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75  e record page-nu
16910 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20  mber is illegal 
16920 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50  (0 or PAGER_MJ_P
16930 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20  GNO), or.**   * 
16940 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73  If the record is
16950 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
16960 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ck from the main
16970 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
16980 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 68 65       and the che
16990 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73  cksum field does
169a0 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72   not match the r
169b0 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a  ecord content..*
169c0 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20  *.** Neither of 
169d0 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72  these two scenar
169e0 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65  ios are possible
169f0 20 64 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f   during a savepo
16a00 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  int rollback..**
16a10 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61  .** If this is a
16a20 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
16a30 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79  ack, then memory
16a40 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65 20   may have to be 
16a50 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61  dynamically.** a
16a60 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
16a70 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68   function. If th
16a80 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20 61  is is the case a
16a90 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  nd an allocation
16aa0 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54   fails,.** SQLIT
16ab0 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
16ac0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
16ad0 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
16ae0 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61  k_one_page(.  Pa
16af0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
16b00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16b10 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20 70  he pager being p
16b20 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20  layed back */.  
16b30 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20 20  i64 *pOffset,   
16b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16b50 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f 72   Offset of recor
16b60 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a 2f  d to playback */
16b70 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65  .  Bitvec *pDone
16b80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16b90 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61   /* Bitvec of pa
16ba0 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79  ges already play
16bb0 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74  ed back */.  int
16bc0 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20 20   isMainJrnl,    
16bd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
16be0 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e  -> main journal.
16bf0 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e 61   0 -> sub-journa
16c00 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61  l. */.  int isSa
16c10 76 65 70 6e 74 20 20 20 20 20 20 20 20 20 20 20  vepnt           
16c20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
16c30 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  r a savepoint ro
16c40 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69  llback */.){.  i
16c50 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
16c60 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  pPg;            
16c70 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69         /* An exi
16c80 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68  sting page in th
16c90 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e  e cache */.  Pgn
16ca0 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  o pgno;         
16cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16cc0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
16cd0 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e   a page in journ
16ce0 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  al */.  u32 cksu
16cf0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
16d00 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
16d10 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74  m used for sanit
16d20 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20  y checking */.  
16d30 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20 20  char *aData;    
16d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16d50 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   Temporary stora
16d60 67 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  ge for the page 
16d70 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
16d80 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20  e *jfd;         
16d90 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
16da0 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
16db0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
16dc0 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65 64  /.  int isSynced
16dd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16de0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75    /* True if jou
16df0 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79 6e  rnal page is syn
16e00 63 65 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ced */.#ifdef SQ
16e10 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
16e20 20 2f 2a 20 54 68 65 20 6a 72 6e 6c 45 6e 63 20   /* The jrnlEnc 
16e30 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20  flag is true if 
16e40 4a 6f 75 72 6e 61 6c 20 70 61 67 65 73 20 73 68  Journal pages sh
16e50 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 74  ould be passed t
16e60 68 72 6f 75 67 68 0a 20 20 2a 2a 20 74 68 65 20  hrough.  ** the 
16e70 63 6f 64 65 63 2e 20 20 49 74 20 69 73 20 66 61  codec.  It is fa
16e80 6c 73 65 20 66 6f 72 20 70 75 72 65 20 69 6e 2d  lse for pure in-
16e90 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 73 2e  memory journals.
16ea0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
16eb0 6a 72 6e 6c 45 6e 63 20 3d 20 28 69 73 4d 61 69  jrnlEnc = (isMai
16ec0 6e 4a 72 6e 6c 20 7c 7c 20 70 50 61 67 65 72 2d  nJrnl || pPager-
16ed0 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3d 3d 30  >subjInMemory==0
16ee0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
16ef0 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c  ert( (isMainJrnl
16f00 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  &~1)==0 );      
16f10 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73  /* isMainJrnl is
16f20 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73   0 or 1 */.  ass
16f30 65 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26  ert( (isSavepnt&
16f40 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  ~1)==0 );       
16f50 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20  /* isSavepnt is 
16f60 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
16f70 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c  rt( isMainJrnl |
16f80 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f  | pDone );     /
16f90 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75  * pDone always u
16fa0 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e  sed on sub-journ
16fb0 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  als */.  assert(
16fc0 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44   isSavepnt || pD
16fd0 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70  one==0 );   /* p
16fe0 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20  Done never used 
16ff0 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74  on non-savepoint
17000 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70   */..  aData = p
17010 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
17020 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74  ;.  assert( aDat
17030 61 20 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  a );         /* 
17040 54 65 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73  Temp storage mus
17050 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
17060 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  een allocated */
17070 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 72  .  assert( pager
17080 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d  UseWal(pPager)==
17090 30 20 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e  0 || (!isMainJrn
170a0 6c 20 26 26 20 69 73 53 61 76 65 70 6e 74 29 20  l && isSavepnt) 
170b0 29 3b 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20  );..  /* Either 
170c0 74 68 65 20 73 74 61 74 65 20 69 73 20 67 72 65  the state is gre
170d0 61 74 65 72 20 74 68 61 6e 20 50 41 47 45 52 5f  ater than PAGER_
170e0 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44 20  WRITER_CACHEMOD 
170f0 28 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  (a transaction .
17100 20 20 2a 2a 20 6f 72 20 73 61 76 65 70 6f 69 6e    ** or savepoin
17110 74 20 72 6f 6c 6c 62 61 63 6b 20 64 6f 6e 65 20  t rollback done 
17120 61 74 20 74 68 65 20 72 65 71 75 65 73 74 20 6f  at the request o
17130 66 20 74 68 65 20 63 61 6c 6c 65 72 29 20 6f 72  f the caller) or
17140 20 74 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 20   this is.  ** a 
17150 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
17160 62 61 63 6b 2e 20 49 66 20 69 74 20 69 73 20 61  back. If it is a
17170 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
17180 6c 62 61 63 6b 2c 20 74 68 65 20 70 61 67 65 72  lback, the pager
17190 0a 20 20 2a 2a 20 69 73 20 69 6e 20 73 74 61 74  .  ** is in stat
171a0 65 20 4f 50 45 4e 20 61 6e 64 20 68 6f 6c 64 73  e OPEN and holds
171b0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
171c0 63 6b 2e 20 48 6f 74 2d 6a 6f 75 72 6e 61 6c 20  ck. Hot-journal 
171d0 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6f 6e  rollback.  ** on
171e0 6c 79 20 72 65 61 64 73 20 66 72 6f 6d 20 74 68  ly reads from th
171f0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  e main journal, 
17200 6e 6f 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  not the sub-jour
17210 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  nal..  */.  asse
17220 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
17230 74 65 3e 3d 50 41 47 45 52 5f 57 52 49 54 45 52  te>=PAGER_WRITER
17240 5f 43 41 43 48 45 4d 4f 44 0a 20 20 20 20 20 20  _CACHEMOD.      
17250 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 53 74   || (pPager->eSt
17260 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
17270 26 26 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  && pPager->eLock
17280 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
17290 29 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ).  );.  assert(
172a0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
172b0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
172c0 43 48 45 4d 4f 44 20 7c 7c 20 69 73 4d 61 69 6e  CHEMOD || isMain
172d0 4a 72 6e 6c 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  Jrnl );..  /* Re
172e0 61 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ad the page numb
172f0 65 72 20 61 6e 64 20 70 61 67 65 20 64 61 74 61  er and page data
17300 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
17310 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  l or sub-journal
17320 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75  .  ** file. Retu
17330 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
17340 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69   to the caller i
17350 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
17360 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64  curs..  */.  jfd
17370 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20   = isMainJrnl ? 
17380 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50  pPager->jfd : pP
17390 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63  ager->sjfd;.  rc
173a0 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
173b0 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67  d, *pOffset, &pg
173c0 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  no);.  if( rc!=S
173d0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
173e0 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
173f0 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20  ite3OsRead(jfd, 
17400 28 75 38 2a 29 61 44 61 74 61 2c 20 70 50 61 67  (u8*)aData, pPag
17410 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a  er->pageSize, (*
17420 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69  pOffset)+4);.  i
17430 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17440 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
17450 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67  *pOffset += pPag
17460 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34  er->pageSize + 4
17470 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b   + isMainJrnl*4;
17480 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ..  /* Sanity ch
17490 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61  ecking on the pa
174a0 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72  ge.  This is mor
174b0 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  e important that
174c0 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20   I originally.  
174d0 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20  ** thought.  If 
174e0 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
174f0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65  occurs while the
17500 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
17510 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20  g written,.  ** 
17520 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69  it could cause i
17530 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62  nvalid data to b
17540 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
17550 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20  he journal.  We 
17560 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74  need to.  ** det
17570 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64  ect this invalid
17580 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68   data (with high
17590 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e   probability) an
175a0 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a  d ignore it..  *
175b0 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  /.  if( pgno==0 
175c0 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
175d0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
175e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69  {.    assert( !i
175f0 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20  sSavepnt );.    
17600 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
17610 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67  NE;.  }.  if( pg
17620 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d  no>(Pgno)pPager-
17630 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74  >dbSize || sqlit
17640 65 33 42 69 74 76 65 63 54 65 73 74 28 70 44 6f  e3BitvecTest(pDo
17650 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20  ne, pgno) ){.   
17660 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17670 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d  K;.  }.  if( isM
17680 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72  ainJrnl ){.    r
17690 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
176a0 66 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34  fd, (*pOffset)-4
176b0 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69  , &cksum);.    i
176c0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
176d0 63 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53 61  c;.    if( !isSa
176e0 76 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63  vepnt && pager_c
176f0 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38  ksum(pPager, (u8
17700 2a 29 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20  *)aData)!=cksum 
17710 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
17720 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
17730 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
17740 74 68 69 73 20 70 61 67 65 20 68 61 73 20 61 6c  this page has al
17750 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65  ready been playe
17760 64 20 62 61 63 6b 20 62 65 66 6f 72 65 20 64 75  d back before du
17770 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
17780 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20  .  ** rollback, 
17790 74 68 65 6e 20 64 6f 6e 27 74 20 62 6f 74 68 65  then don't bothe
177a0 72 20 74 6f 20 70 6c 61 79 20 69 74 20 62 61 63  r to play it bac
177b0 6b 20 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20  k again..  */.  
177c0 69 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63  if( pDone && (rc
177d0 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
177e0 53 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29  Set(pDone, pgno)
177f0 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
17800 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
17810 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 70 6c   }..  /* When pl
17820 61 79 69 6e 67 20 62 61 63 6b 20 70 61 67 65 20  aying back page 
17830 31 2c 20 72 65 73 74 6f 72 65 20 74 68 65 20 6e  1, restore the n
17840 52 65 73 65 72 76 65 20 73 65 74 74 69 6e 67 0a  Reserve setting.
17850 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d    */.  if( pgno=
17860 3d 31 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52  =1 && pPager->nR
17870 65 73 65 72 76 65 21 3d 28 28 75 38 2a 29 61 44  eserve!=((u8*)aD
17880 61 74 61 29 5b 32 30 5d 20 29 7b 0a 20 20 20 20  ata)[20] ){.    
17890 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
178a0 20 3d 20 28 28 75 38 2a 29 61 44 61 74 61 29 5b   = ((u8*)aData)[
178b0 32 30 5d 3b 0a 20 20 20 20 70 61 67 65 72 52 65  20];.    pagerRe
178c0 70 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29  portSize(pPager)
178d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
178e0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 43  he pager is in C
178f0 41 43 48 45 4d 4f 44 20 73 74 61 74 65 2c 20 74  ACHEMOD state, t
17900 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
17910 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73  e a copy of this
17920 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68  .  ** page in th
17930 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
17940 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74  n this case just
17950 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
17960 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f  r cache,.  ** no
17970 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
17980 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
17990 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72   left marked dir
179a0 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ty in this case.
179b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78  .  **.  ** An ex
179c0 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61  ception to the a
179d0 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68  bove rule: If th
179e0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e  e database is in
179f0 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20   no-sync mode.  
17a00 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73  ** and a page is
17a10 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e   moved during an
17a20 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
17a30 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67  uum then the pag
17a40 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62  e may.  ** not b
17a50 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
17a60 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20  ache. Later: if 
17a70 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f  a malloc() or IO
17a80 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20   error occurs.  
17a90 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65  ** during a Move
17aa0 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65  page() call, the
17ab0 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e  n the page may n
17ac0 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63  ot be in the cac
17ad0 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20  he.  ** either. 
17ae0 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  So the condition
17af0 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68   described in th
17b00 65 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70  e above paragrap
17b10 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73  h is not.  ** as
17b20 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a  sert()able..  **
17b30 0a 20 20 2a 2a 20 49 66 20 69 6e 20 57 52 49 54  .  ** If in WRIT
17b40 45 52 5f 44 42 4d 4f 44 2c 20 57 52 49 54 45 52  ER_DBMOD, WRITER
17b50 5f 46 49 4e 49 53 48 45 44 20 6f 72 20 4f 50 45  _FINISHED or OPE
17b60 4e 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65  N state, then we
17b70 20 75 70 64 61 74 65 20 74 68 65 0a 20 20 2a 2a   update the.  **
17b80 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20   pager cache if 
17b90 69 74 20 65 78 69 73 74 73 20 61 6e 64 20 74 68  it exists and th
17ba0 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65  e main file. The
17bb0 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61   page is then ma
17bc0 72 6b 65 64 20 0a 20 20 2a 2a 20 6e 6f 74 20 64  rked .  ** not d
17bd0 69 72 74 79 2e 20 53 69 6e 63 65 20 74 68 69 73  irty. Since this
17be0 20 63 6f 64 65 20 69 73 20 6f 6e 6c 79 20 65 78   code is only ex
17bf0 65 63 75 74 65 64 20 69 6e 20 50 41 47 45 52 5f  ecuted in PAGER_
17c00 4f 50 45 4e 20 73 74 61 74 65 20 66 6f 72 0a 20  OPEN state for. 
17c10 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
17c20 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 69  l rollback, it i
17c30 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
17c40 74 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  t the page-cache
17c50 20 69 73 20 65 6d 70 74 79 0a 20 20 2a 2a 20 69   is empty.  ** i
17c60 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
17c70 6e 20 4f 50 45 4e 20 73 74 61 74 65 2e 0a 20 20  n OPEN state..  
17c80 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23  **.  ** Ticket #
17c90 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65  1171:  The state
17ca0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67  ment journal mig
17cb0 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20  ht contain page 
17cc0 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a  content that is.
17cd0 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66    ** different f
17ce0 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e  rom the page con
17cf0 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72  tent at the star
17d00 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
17d10 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20  tion..  ** This 
17d20 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61  occurs when a pa
17d30 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72  ge is changed pr
17d40 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
17d50 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a   of a statement.
17d60 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65    ** then change
17d70 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74  d again within t
17d80 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57  he statement.  W
17d90 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
17da0 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61   such a.  ** sta
17db0 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e  tement we must n
17dc0 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  ot write to the 
17dd0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
17de0 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77  e unless we know
17df0 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69  .  ** for certai
17e00 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20  n that original 
17e10 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
17e20 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68  e synced into th
17e30 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
17e40 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f    ** journal.  O
17e50 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65  therwise, a powe
17e60 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61  r loss might lea
17e70 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61  ve modified data
17e80 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   in the.  ** dat
17e90 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f  abase file witho
17ea0 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  ut an entry in t
17eb0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
17ec0 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a  nal that can.  *
17ed0 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  * restore the da
17ee0 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
17ef0 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77  iginal form.  Tw
17f00 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73  o conditions mus
17f10 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65  t be.  ** met be
17f20 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
17f30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17f40 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61  es. (1) the data
17f50 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a  base must be.  *
17f60 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77  * locked.  (2) w
17f70 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
17f80 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
17f90 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73  ntent is fully s
17fa0 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68  ynced.  ** in th
17fb0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65  e main journal e
17fc0 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68  ither because th
17fd0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
17fe0 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20   cache or else. 
17ff0 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20   ** the page is 
18000 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79  marked as needSy
18010 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nc==0..  **.  **
18020 20 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68   2008-04-14:  Wh
18030 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  en attempting to
18040 20 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70   vacuum a corrup
18050 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  t database file,
18060 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73   it.  ** is poss
18070 69 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73  ible to fail a s
18080 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61  tatement on a da
18090 74 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73  tabase that does
180a0 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a   not yet exist..
180b0 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65    ** Do not atte
180c0 6d 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20  mpt to write if 
180d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
180e0 73 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65  s never been ope
180f0 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
18100 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67  pagerUseWal(pPag
18110 65 72 29 20 29 7b 0a 20 20 20 20 70 50 67 20 3d  er) ){.    pPg =
18120 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
18130 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 61   pPg = sqlite3Pa
18140 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65 72  gerLookup(pPager
18150 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61  , pgno);.  }.  a
18160 73 73 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d  ssert( pPg || !M
18170 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
18180 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
18190 21 3d 50 41 47 45 52 5f 4f 50 45 4e 20 7c 7c 20  !=PAGER_OPEN || 
181a0 70 50 67 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  pPg==0 || pPager
181b0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
181c0 50 41 47 45 52 54 52 41 43 45 28 28 22 50 4c 41  PAGERTRACE(("PLA
181d0 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64  YBACK %d page %d
181e0 20 68 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e   hash(%08x) %s\n
181f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 50 41  ",.           PA
18200 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
18210 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68  gno, pager_datah
18220 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65  ash(pPager->page
18230 53 69 7a 65 2c 20 28 75 38 2a 29 61 44 61 74 61  Size, (u8*)aData
18240 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 69  ),.           (i
18250 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d  sMainJrnl?"main-
18260 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f  journal":"sub-jo
18270 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20  urnal").  ));.  
18280 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29  if( isMainJrnl )
18290 7b 0a 20 20 20 20 69 73 53 79 6e 63 65 64 20 3d  {.    isSynced =
182a0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
182b0 7c 7c 20 28 2a 70 4f 66 66 73 65 74 20 3c 3d 20  || (*pOffset <= 
182c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
182d0 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dr);.  }else{.  
182e0 20 20 69 73 53 79 6e 63 65 64 20 3d 20 28 70 50    isSynced = (pP
182f0 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d  g==0 || 0==(pPg-
18300 3e 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 4e  >flags & PGHDR_N
18310 45 45 44 5f 53 59 4e 43 29 29 3b 0a 20 20 7d 0a  EED_SYNC));.  }.
18320 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
18330 67 65 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 28  ger->fd).   && (
18340 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
18350 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42 4d  PAGER_WRITER_DBM
18360 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53  OD || pPager->eS
18370 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e  tate==PAGER_OPEN
18380 29 0a 20 20 20 26 26 20 69 73 53 79 6e 63 65 64  ).   && isSynced
18390 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66  .  ){.    i64 of
183a0 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  st = (pgno-1)*(i
183b0 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
183c0 69 7a 65 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ize;.    testcas
183d0 65 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26  e( !isSavepnt &&
183e0 20 70 50 67 21 3d 30 20 26 26 20 28 70 50 67 2d   pPg!=0 && (pPg-
183f0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
18400 44 5f 53 59 4e 43 29 21 3d 30 20 29 3b 0a 20 20  D_SYNC)!=0 );.  
18410 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
18420 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
18430 3b 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ;..    /* Write 
18440 74 68 65 20 64 61 74 61 20 72 65 61 64 20 66 72  the data read fr
18450 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  om the journal b
18460 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
18470 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
18480 2a 2a 20 54 68 69 73 20 69 73 20 75 73 75 61 6c  ** This is usual
18490 6c 79 20 73 61 66 65 20 65 76 65 6e 20 66 6f 72  ly safe even for
184a0 20 61 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61   an encrypted da
184b0 74 61 62 61 73 65 20 2d 20 61 73 20 74 68 65 20  tabase - as the 
184c0 64 61 74 61 0a 20 20 20 20 2a 2a 20 77 61 73 20  data.    ** was 
184d0 65 6e 63 72 79 70 74 65 64 20 62 65 66 6f 72 65  encrypted before
184e0 20 69 74 20 77 61 73 20 77 72 69 74 74 65 6e 20   it was written 
184f0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
18500 69 6c 65 2e 20 54 68 65 20 65 78 63 65 70 74 69  ile. The excepti
18510 6f 6e 0a 20 20 20 20 2a 2a 20 69 73 20 69 66 20  on.    ** is if 
18520 74 68 65 20 64 61 74 61 20 77 61 73 20 6a 75 73  the data was jus
18530 74 20 72 65 61 64 20 66 72 6f 6d 20 61 6e 20 69  t read from an i
18540 6e 2d 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75  n-memory sub-jou
18550 72 6e 61 6c 2e 20 49 6e 20 74 68 61 74 0a 20 20  rnal. In that.  
18560 20 20 2a 2a 20 63 61 73 65 20 69 74 20 6d 75 73    ** case it mus
18570 74 20 62 65 20 65 6e 63 72 79 70 74 65 64 20 68  t be encrypted h
18580 65 72 65 20 62 65 66 6f 72 65 20 69 74 20 69 73  ere before it is
18590 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65   copied into the
185a0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
185b0 20 66 69 6c 65 2e 20 20 2a 2f 0a 23 69 66 64 65   file.  */.#ifde
185c0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
185d0 45 43 0a 20 20 20 20 69 66 28 20 21 6a 72 6e 6c  EC.    if( !jrnl
185e0 45 6e 63 20 29 7b 0a 20 20 20 20 20 20 43 4f 44  Enc ){.      COD
185f0 45 43 32 28 70 50 61 67 65 72 2c 20 61 44 61 74  EC2(pPager, aDat
18600 61 2c 20 70 67 6e 6f 2c 20 37 2c 20 72 63 3d 53  a, pgno, 7, rc=S
18610 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
18620 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  , aData);.      
18630 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
18640 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
18650 28 75 38 20 2a 29 61 44 61 74 61 2c 20 70 50 61  (u8 *)aData, pPa
18660 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
18670 66 73 74 29 3b 0a 20 20 20 20 20 20 43 4f 44 45  fst);.      CODE
18680 43 31 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  C1(pPager, aData
18690 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51  , pgno, 3, rc=SQ
186a0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29  LITE_NOMEM_BKPT)
186b0 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
186c0 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  if.    rc = sqli
186d0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
186e0 72 2d 3e 66 64 2c 20 28 75 38 20 2a 29 61 44 61  r->fd, (u8 *)aDa
186f0 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
18700 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 0a 20 20  Size, ofst);..  
18710 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
18720 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
18730 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
18740 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f  bFileSize = pgno
18750 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18760 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
18770 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
18780 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20 20 20  _HAS_CODEC.     
18790 20 69 66 28 20 6a 72 6e 6c 45 6e 63 20 29 7b 0a   if( jrnlEnc ){.
187a0 20 20 20 20 20 20 20 20 43 4f 44 45 43 31 28 70          CODEC1(p
187b0 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67  Pager, aData, pg
187c0 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45  no, 3, rc=SQLITE
187d0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20  _NOMEM_BKPT);.  
187e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63        sqlite3Bac
187f0 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
18800 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c  ->pBackup, pgno,
18810 20 28 75 38 2a 29 61 44 61 74 61 29 3b 0a 20 20   (u8*)aData);.  
18820 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
18830 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67 6e 6f  ger, aData, pgno
18840 2c 20 37 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  , 7, rc=SQLITE_N
18850 4f 4d 45 4d 5f 42 4b 50 54 2c 61 44 61 74 61 29  OMEM_BKPT,aData)
18860 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  ;.      }else.#e
18870 6e 64 69 66 0a 20 20 20 20 20 20 73 71 6c 69 74  ndif.      sqlit
18880 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70  e3BackupUpdate(p
18890 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20  Pager->pBackup, 
188a0 70 67 6e 6f 2c 20 28 75 38 2a 29 61 44 61 74 61  pgno, (u8*)aData
188b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
188c0 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c   if( !isMainJrnl
188d0 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20   && pPg==0 ){.  
188e0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
188f0 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20  a rollback of a 
18900 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61  savepoint and da
18910 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74  ta was not writt
18920 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  en to.    ** the
18930 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68   database and th
18940 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
18950 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69  -memory, there i
18960 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20  s a potential.  
18970 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68    ** problem. Wh
18980 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  en the page is n
18990 65 78 74 20 66 65 74 63 68 65 64 20 62 79 20 74  ext fetched by t
189a0 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c  he b-tree layer,
189b0 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c   it .    ** will
189c0 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
189d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
189e0 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61   which may or ma
189f0 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a  y not be .    **
18a00 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a   current. .    *
18a10 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61  *.    ** There a
18a20 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64  re a couple of d
18a30 69 66 66 65 72 65 6e 74 20 77 61 79 73 20 74 68  ifferent ways th
18a40 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41  is can happen. A
18a50 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20 20  ll are quite.   
18a60 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65   ** obscure. Whe
18a70 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e  n running in syn
18a80 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74  chronous mode, t
18a90 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
18aa0 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74  pen .    ** if t
18ab0 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68  he page is on th
18ac0 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74  e free-list at t
18ad0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
18ae0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
18af0 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74  n.    ** populat
18b00 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75  ed, then moved u
18b10 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65  sing sqlite3Page
18b20 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20  rMovepage()..   
18b30 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
18b40 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64  olution is to ad
18b50 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  d an in-memory p
18b60 61 67 65 20 74 6f 20 74 68 65 20 63 61 63 68 65  age to the cache
18b70 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20   containing.    
18b80 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73 74  ** the data just
18b90 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
18ba0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b  ub-journal. Mark
18bb0 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
18bc0 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69  ty .    ** and i
18bd0 66 20 74 68 65 20 70 61 67 65 72 20 72 65 71 75  f the pager requ
18be0 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73  ires a journal-s
18bf0 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74  ync, then mark t
18c00 68 65 20 70 61 67 65 20 61 73 20 0a 20 20 20 20  he page as .    
18c10 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a  ** requiring a j
18c20 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f  ournal-sync befo
18c30 72 65 20 69 74 20 69 73 20 77 72 69 74 74 65 6e  re it is written
18c40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
18c50 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 29  ert( isSavepnt )
18c60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
18c70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c  Pager->doNotSpil
18c80 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f 52 4f  l & SPILLFLAG_RO
18c90 4c 4c 42 41 43 4b 29 3d 3d 30 20 29 3b 0a 20 20  LLBACK)==0 );.  
18ca0 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
18cb0 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c 46 4c 41  pill |= SPILLFLA
18cc0 47 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  G_ROLLBACK;.    
18cd0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
18ce0 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e  rGet(pPager, pgn
18cf0 6f 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20 20 20  o, &pPg, 1);.   
18d00 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
18d10 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53  ->doNotSpill & S
18d20 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
18d30 4b 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  K)!=0 );.    pPa
18d40 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
18d50 26 3d 20 7e 53 50 49 4c 4c 46 4c 41 47 5f 52 4f  &= ~SPILLFLAG_RO
18d60 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 69 66 28 20  LLBACK;.    if( 
18d70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
18d80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 73  return rc;.    s
18d90 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
18da0 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a  Dirty(pPg);.  }.
18db0 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
18dc0 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75   /* No page shou
18dd0 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69  ld ever be expli
18de0 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63  citly rolled bac
18df0 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65  k that is in use
18e00 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20  , except.    ** 
18e10 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68  for page 1 which
18e20 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20   is held in use 
18e30 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70  in order to keep
18e40 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
18e50 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
18e60 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72   active. However
18e70 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79   such a page may
18e80 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
18e90 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20  as a result.    
18ea0 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61  ** of an interna
18eb0 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e  l error resultin
18ec0 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69  g in an automati
18ed0 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  c call to.    **
18ee0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
18ef0 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a  lback()..    */.
18f00 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b      void *pData;
18f10 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70 50 67  .    pData = pPg
18f20 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d  ->pData;.    mem
18f30 63 70 79 28 70 44 61 74 61 2c 20 28 75 38 2a 29  cpy(pData, (u8*)
18f40 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
18f50 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50  ageSize);.    pP
18f60 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28  ager->xReiniter(
18f70 70 50 67 29 3b 0a 20 20 20 20 2f 2a 20 49 74 20  pPg);.    /* It 
18f80 75 73 65 64 20 74 6f 20 62 65 20 74 68 61 74 20  used to be that 
18f90 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
18fa0 65 43 6c 65 61 6e 28 70 50 67 29 20 77 61 73 20  eClean(pPg) was 
18fb0 63 61 6c 6c 65 64 20 68 65 72 65 2e 20 20 42 75  called here.  Bu
18fc0 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61  t.    ** that ca
18fd0 6c 6c 20 77 61 73 20 64 61 6e 67 65 72 6f 75 73  ll was dangerous
18fe0 20 61 6e 64 20 68 61 64 20 6e 6f 20 64 65 74 65   and had no dete
18ff0 63 74 61 62 6c 65 20 62 65 6e 65 66 69 74 20 73  ctable benefit s
19000 69 6e 63 65 20 74 68 65 20 63 61 63 68 65 0a 20  ince the cache. 
19010 20 20 20 2a 2a 20 69 73 20 6e 6f 72 6d 61 6c 6c     ** is normall
19020 79 20 63 6c 65 61 6e 65 64 20 62 79 20 73 71 6c  y cleaned by sql
19030 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41  ite3PcacheCleanA
19040 6c 6c 28 29 20 61 66 74 65 72 20 72 6f 6c 6c 62  ll() after rollb
19050 61 63 6b 20 61 6e 64 20 73 6f 0a 20 20 20 20 2a  ack and so.    *
19060 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76  * has been remov
19070 65 64 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72  ed. */.    pager
19080 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70 50  _set_pagehash(pP
19090 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  g);..    /* If t
190a0 68 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20  his was page 1, 
190b0 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65  then restore the
190c0 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
190d0 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20  dbFileVers..    
190e0 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72  ** Do this befor
190f0 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20  e any decoding. 
19100 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  */.    if( pgno=
19110 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  =1 ){.      memc
19120 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
19130 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70  leVers, &((u8*)p
19140 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66  Data)[24],sizeof
19150 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
19160 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ers));.    }..  
19170 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20    /* Decode the 
19180 70 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66  page just read f
19190 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 23 69 66 20  rom disk */.#if 
191a0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
191b0 0a 20 20 20 20 69 66 28 20 6a 72 6e 6c 45 6e 63  .    if( jrnlEnc
191c0 20 29 7b 20 43 4f 44 45 43 31 28 70 50 61 67 65   ){ CODEC1(pPage
191d0 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
191e0 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
191f0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 20 7d  E_NOMEM_BKPT); }
19200 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
19210 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65  te3PcacheRelease
19220 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (pPg);.  }.  ret
19230 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19240 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74   Parameter zMast
19250 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  er is the name o
19260 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
19270 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c  al file. A singl
19280 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
19290 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20  e that referred 
192a0 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  to the master jo
192b0 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a  urnal file has j
192c0 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ust been rolled 
192d0 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  back..** This ro
192e0 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
192f0 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
19300 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
19310 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19320 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f  ,.** and does so
19330 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a   if it is..**.**
19340 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65   Argument zMaste
19350 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50  r may point to P
19360 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20  ager.pTmpSpace. 
19370 53 6f 20 74 68 61 74 20 62 75 66 66 65 72 20 69  So that buffer i
19380 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61  s not .** availa
19390 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74 68  ble for use with
193a0 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
193b0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d  ..**.** When a m
193c0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
193d0 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 69  le is created, i
193e0 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77  t is populated w
193f0 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a  ith the names .*
19400 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20  * of all of its 
19410 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20  child journals, 
19420 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65  one after anothe
19430 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20  r, formatted as 
19440 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65  utf-8 .** encode
19450 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20  d text. The end 
19460 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  of each child jo
19470 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61  urnal file is ma
19480 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20  rked with a .** 
19490 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62  nul-terminator b
194a0 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e  yte (0x00). i.e.
194b0 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
194c0 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72  ents of a master
194d0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
194e0 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
194f0 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f  on involving two
19500 20 64 61 74 61 62 61 73 65 73 20 6d 69 67 68 74   databases might
19510 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68   be:.**.**   "/h
19520 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f  ome/bill/a.db-jo
19530 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62  urnal\x00/home/b
19540 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c  ill/b.db-journal
19550 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61  \x00".**.** A ma
19560 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19570 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65  e may only be de
19580 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f  leted once all o
19590 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20  f its child .** 
195a0 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65  journals have be
195b0 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
195c0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
195d0 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f  ion reads the co
195e0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61  ntents of the ma
195f0 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
19600 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72  e into .** memor
19610 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f  y and loops thro
19620 75 67 68 20 65 61 63 68 20 6f 66 20 74 68 65 20  ugh each of the 
19630 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61  child journal na
19640 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68  mes. For.** each
19650 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20   child journal, 
19660 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a  it checks if:.**
19670 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63  .**   * if the c
19680 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69  hild journal exi
19690 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a  sts, and if so.*
196a0 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69  *   * if the chi
196b0 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61  ld journal conta
196c0 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63 65 20  ins a reference 
196d0 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  to master journa
196e0 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a  l .**     file z
196f0 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20  Master.**.** If 
19700 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  a child journal 
19710 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61  can be found tha
19720 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f  t matches both o
19730 66 20 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a  f the criteria.*
19740 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75  * above, this fu
19750 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
19760 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
19770 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65  thing. Otherwise
19780 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20  , if.** no such 
19790 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61  child journal ca
197a0 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65  n be found, file
197b0 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65   zMaster is dele
197c0 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  ted from.** the 
197d0 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e  file-system usin
197e0 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  g sqlite3OsDelet
197f0 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  e()..**.** If an
19800 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e   IO error within
19810 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
19820 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
19830 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a   returned. This.
19840 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f  ** function allo
19850 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20  cates memory by 
19860 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d  calling sqlite3M
19870 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61  alloc(). If an a
19880 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69  llocation.** fai
19890 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ls, SQLITE_NOMEM
198a0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
198b0 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49  herwise, if no I
198c0 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  O or malloc erro
198d0 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51  rs .** occur, SQ
198e0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
198f0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a  ned..**.** TODO:
19900 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
19910 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c  llocates a singl
19920 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72  e block of memor
19930 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65  y to load.** the
19940 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
19950 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
19960 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
19970 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20  s could be.** a 
19980 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79  couple of kiloby
19990 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65  tes or so - pote
199a0 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74  ntially larger t
199b0 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a  han the page .**
199c0 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
199d0 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61   int pager_delma
199e0 73 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ster(Pager *pPag
199f0 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
19a00 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69  zMaster){.  sqli
19a10 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
19a20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
19a30 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
19a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
19a50 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71  urn code */.  sq
19a60 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73  lite3_file *pMas
19a70 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f  ter;    /* Mallo
19a80 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  c'd master-journ
19a90 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
19aa0 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  or */.  sqlite3_
19ab0 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20  file *pJournal; 
19ac0 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68    /* Malloc'd ch
19ad0 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ild-journal file
19ae0 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
19af0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f   char *zMasterJo
19b00 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f  urnal = 0; /* Co
19b10 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72  ntents of master
19b20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
19b30 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f  .  i64 nMasterJo
19b40 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20  urnal;       /* 
19b50 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Size of master j
19b60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
19b70 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b   char *zJournal;
19b80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
19b90 69 6e 74 65 72 20 74 6f 20 6f 6e 65 20 6a 6f 75  inter to one jou
19ba0 72 6e 61 6c 20 77 69 74 68 69 6e 20 4d 4a 20 66  rnal within MJ f
19bb0 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
19bc0 4d 61 73 74 65 72 50 74 72 3b 20 20 20 20 20 20  MasterPtr;      
19bd0 20 20 20 2f 2a 20 53 70 61 63 65 20 74 6f 20 68     /* Space to h
19be0 6f 6c 64 20 4d 4a 20 66 69 6c 65 6e 61 6d 65 20  old MJ filename 
19bf0 66 72 6f 6d 20 61 20 6a 6f 75 72 6e 61 6c 20 66  from a journal f
19c00 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ile */.  int nMa
19c10 73 74 65 72 50 74 72 3b 20 20 20 20 20 20 20 20  sterPtr;        
19c20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
19c30 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
19c40 74 6f 20 7a 4d 61 73 74 65 72 50 74 72 5b 5d 20  to zMasterPtr[] 
19c50 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
19c60 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68  e space for both
19c70 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e   the pJournal an
19c80 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64  d pMaster file d
19c90 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a  escriptors..  **
19ca0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
19cb0 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  open the master 
19cc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
19cd0 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20   reading..  */. 
19ce0 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69   pMaster = (sqli
19cf0 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74  te3_file *)sqlit
19d00 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66  e3MallocZero(pVf
19d10 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29  s->szOsFile * 2)
19d20 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28  ;.  pJournal = (
19d30 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28  sqlite3_file *)(
19d40 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20  ((u8 *)pMaster) 
19d50 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  + pVfs->szOsFile
19d60 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65  );.  if( !pMaste
19d70 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  r ){.    rc = SQ
19d80 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
19d90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f  .  }else{.    co
19da0 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
19db0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
19dc0 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
19dd0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
19de0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
19df0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
19e00 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72  zMaster, pMaster
19e10 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d  , flags, 0);.  }
19e20 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
19e30 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
19e40 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 2f 2a  aster_out;..  /*
19e50 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65   Load the entire
19e60 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19e70 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20  file into space 
19e80 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20  obtained from.  
19e90 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
19ea0 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
19eb0 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
19ec0 72 6e 61 6c 2e 20 20 20 41 6c 73 6f 20 6f 62 74  rnal.   Also obt
19ed0 61 69 6e 0a 20 20 2a 2a 20 73 75 66 66 69 63 69  ain.  ** suffici
19ee0 65 6e 74 20 73 70 61 63 65 20 28 69 6e 20 7a 4d  ent space (in zM
19ef0 61 73 74 65 72 50 74 72 29 20 74 6f 20 68 6f 6c  asterPtr) to hol
19f00 64 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6d  d the names of m
19f10 61 73 74 65 72 0a 20 20 2a 2a 20 6a 6f 75 72 6e  aster.  ** journ
19f20 61 6c 20 66 69 6c 65 73 20 65 78 74 72 61 63 74  al files extract
19f30 65 64 20 66 72 6f 6d 20 72 65 67 75 6c 61 72 20  ed from regular 
19f40 72 6f 6c 6c 62 61 63 6b 2d 6a 6f 75 72 6e 61 6c  rollback-journal
19f50 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  s..  */.  rc = s
19f60 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
19f70 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74  (pMaster, &nMast
19f80 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  erJournal);.  if
19f90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19fa0 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
19fb0 5f 6f 75 74 3b 0a 20 20 6e 4d 61 73 74 65 72 50  _out;.  nMasterP
19fc0 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  tr = pVfs->mxPat
19fd0 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 4d 61 73 74  hname+1;.  zMast
19fe0 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  erJournal = sqli
19ff0 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65  te3Malloc(nMaste
1a000 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74  rJournal + nMast
1a010 65 72 50 74 72 20 2b 20 31 29 3b 0a 20 20 69 66  erPtr + 1);.  if
1a020 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ( !zMasterJourna
1a030 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  l ){.    rc = SQ
1a040 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
1a050 0a 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73  .    goto delmas
1a060 74 65 72 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 7a  ter_out;.  }.  z
1a070 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61  MasterPtr = &zMa
1a080 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73  sterJournal[nMas
1a090 74 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20  terJournal+1];. 
1a0a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
1a0b0 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61  ead(pMaster, zMa
1a0c0 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e  sterJournal, (in
1a0d0 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  t)nMasterJournal
1a0e0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
1a0f0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1a100 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
1a110 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
1a120 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d  [nMasterJournal]
1a130 20 3d 20 30 3b 0a 0a 20 20 7a 4a 6f 75 72 6e 61   = 0;..  zJourna
1a140 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  l = zMasterJourn
1a150 61 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 7a 4a  al;.  while( (zJ
1a160 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f  ournal-zMasterJo
1a170 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f  urnal)<nMasterJo
1a180 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  urnal ){.    int
1a190 20 65 78 69 73 74 73 3b 0a 20 20 20 20 72 63 20   exists;.    rc 
1a1a0 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
1a1b0 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  s(pVfs, zJournal
1a1c0 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
1a1d0 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29  EXISTS, &exists)
1a1e0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1a1f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a200 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
1a210 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  out;.    }.    i
1a220 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20  f( exists ){.   
1a230 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
1a240 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65   journals pointe
1a250 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74  d to by the mast
1a260 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  er journal exist
1a270 73 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e  s..      ** Open
1a280 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66   it and check if
1a290 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68   it points at th
1a2a0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1a2b0 2e 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 73 6f  . If.      ** so
1a2c0 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  , return without
1a2d0 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61   deleting the ma
1a2e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1a2f0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
1a300 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 69    int c;.      i
1a310 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49  nt flags = (SQLI
1a320 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
1a330 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
1a340 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  N_JOURNAL);.    
1a350 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1a360 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72  Open(pVfs, zJour
1a370 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66  nal, pJournal, f
1a380 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20  lags, 0);.      
1a390 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a3a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
1a3b0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
1a3c0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1a3d0 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
1a3e0 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c  ournal(pJournal,
1a3f0 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61   zMasterPtr, nMa
1a400 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20  sterPtr);.      
1a410 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
1a420 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
1a430 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a440 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
1a450 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
1a460 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1a470 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30  c = zMasterPtr[0
1a480 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a  ]!=0 && strcmp(z
1a490 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74  MasterPtr, zMast
1a4a0 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66  er)==0;.      if
1a4b0 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ( c ){.        /
1a4c0 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63  * We have a matc
1a4d0 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65  h. Do not delete
1a4e0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
1a4f0 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
1a500 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
1a510 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
1a520 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4a 6f 75 72  .    }.    zJour
1a530 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53  nal += (sqlite3S
1a540 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c  trlen30(zJournal
1a550 29 2b 31 29 3b 0a 20 20 7d 0a 20 0a 20 20 73 71  )+1);.  }. .  sq
1a560 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4d 61  lite3OsClose(pMa
1a570 73 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71  ster);.  rc = sq
1a580 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
1a590 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
1a5a0 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a  ..delmaster_out:
1a5b0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1a5c0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  zMasterJournal);
1a5d0 0a 20 20 69 66 28 20 70 4d 61 73 74 65 72 20 29  .  if( pMaster )
1a5e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
1a5f0 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  lose(pMaster);. 
1a600 20 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70     assert( !isOp
1a610 65 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a  en(pJournal) );.
1a620 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1a630 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20  (pMaster);.  }. 
1a640 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1a650 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1a660 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63  ion is used to c
1a670 68 61 6e 67 65 20 74 68 65 20 61 63 74 75 61 6c  hange the actual
1a680 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1a690 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69  abase .** file i
1a6a0 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
1a6b0 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70  m. This only hap
1a6c0 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74  pens when commit
1a6d0 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
1a6e0 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e  on,.** or rollin
1a6f0 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  g back a transac
1a700 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20  tion (including 
1a710 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68  rolling back a h
1a720 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a  ot-journal)..**.
1a730 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20 64  ** If the main d
1a740 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
1a750 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 74 68 65  not open, or the
1a760 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
1a770 20 65 69 74 68 65 72 0a 2a 2a 20 44 42 4d 4f 44   either.** DBMOD
1a780 20 6f 72 20 4f 50 45 4e 20 73 74 61 74 65 2c 20   or OPEN state, 
1a790 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1a7a0 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77   a no-op. Otherw
1a7b0 69 73 65 2c 20 74 68 65 20 73 69 7a 65 20 0a 2a  ise, the size .*
1a7c0 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  * of the file is
1a7d0 20 63 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67   changed to nPag
1a7e0 65 20 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70  e pages (nPage*p
1a7f0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1a800 62 79 74 65 73 29 2e 20 0a 2a 2a 20 49 66 20 74  bytes). .** If t
1a810 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  he file on disk 
1a820 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61 72  is currently lar
1a830 67 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20 70  ger than nPage p
1a840 61 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20 74  ages, then use t
1a850 68 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63  he VFS.** xTrunc
1a860 61 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f 20  ate() method to 
1a870 74 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a  truncate it..**.
1a880 2a 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74 20  ** Or, it might 
1a890 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
1a8a0 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
1a8b0 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  k is smaller tha
1a8c0 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65  n .** nPage page
1a8d0 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e  s. Some operatin
1a8e0 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65  g system impleme
1a8f0 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74  ntations can get
1a900 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a   confused if .**
1a910 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e   you try to trun
1a920 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73  cate a file to s
1a930 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69 73  ome size that is
1a940 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74 20   larger than it 
1a950 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73  .** currently is
1a960 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68 69 73  , so detect this
1a970 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65 20   case and write 
1a980 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79  a single zero by
1a990 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e  te to .** the en
1a9a0 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c  d of the new fil
1a9b0 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  e instead..**.**
1a9c0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1a9d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a9e0 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
1a9f0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f   occurs while mo
1aa00 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64  difying.** the d
1aa10 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65  atabase file, re
1aa20 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63  turn the error c
1aa30 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
1aa40 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1aa50 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
1aa60 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1aa70 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  gno nPage){.  in
1aa80 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1aa90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1aaa0 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45  er->eState!=PAGE
1aab0 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20 61 73 73  R_ERROR );.  ass
1aac0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
1aad0 61 74 65 21 3d 50 41 47 45 52 5f 52 45 41 44 45  ate!=PAGER_READE
1aae0 52 20 29 3b 0a 20 20 0a 20 20 69 66 28 20 69 73  R );.  .  if( is
1aaf0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1ab00 20 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d   .   && (pPager-
1ab10 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f 57  >eState>=PAGER_W
1ab20 52 49 54 45 52 5f 44 42 4d 4f 44 20 7c 7c 20 70  RITER_DBMOD || p
1ab30 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
1ab40 41 47 45 52 5f 4f 50 45 4e 29 20 0a 20 20 29 7b  AGER_OPEN) .  ){
1ab50 0a 20 20 20 20 69 36 34 20 63 75 72 72 65 6e 74  .    i64 current
1ab60 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20  Size, newSize;. 
1ab70 20 20 20 69 6e 74 20 73 7a 50 61 67 65 20 3d 20     int szPage = 
1ab80 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1ab90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1aba0 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 45 58 43  ager->eLock==EXC
1abb0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
1abc0 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69     /* TODO: Is i
1abd0 74 20 73 61 66 65 20 74 6f 20 75 73 65 20 50 61  t safe to use Pa
1abe0 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68  ger.dbFileSize h
1abf0 65 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ere? */.    rc =
1ac00 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
1ac10 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
1ac20 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20  currentSize);.  
1ac30 20 20 6e 65 77 53 69 7a 65 20 3d 20 73 7a 50 61    newSize = szPa
1ac40 67 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20  ge*(i64)nPage;. 
1ac50 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1ac60 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53  E_OK && currentS
1ac70 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a  ize!=newSize ){.
1ac80 20 20 20 20 20 20 69 66 28 20 63 75 72 72 65 6e        if( curren
1ac90 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b  tSize>newSize ){
1aca0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1acb0 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
1acc0 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53  pPager->fd, newS
1acd0 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ize);.      }els
1ace0 65 20 69 66 28 20 28 63 75 72 72 65 6e 74 53 69  e if( (currentSi
1acf0 7a 65 2b 73 7a 50 61 67 65 29 3c 3d 6e 65 77 53  ze+szPage)<=newS
1ad00 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ize ){.        c
1ad10 68 61 72 20 2a 70 54 6d 70 20 3d 20 70 50 61 67  har *pTmp = pPag
1ad20 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
1ad30 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 54         memset(pT
1ad40 6d 70 2c 20 30 2c 20 73 7a 50 61 67 65 29 3b 0a  mp, 0, szPage);.
1ad50 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1ad60 28 20 28 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67  ( (newSize-szPag
1ad70 65 29 20 3d 3d 20 63 75 72 72 65 6e 74 53 69 7a  e) == currentSiz
1ad80 65 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  e );.        tes
1ad90 74 63 61 73 65 28 20 28 6e 65 77 53 69 7a 65 2d  tcase( (newSize-
1ada0 73 7a 50 61 67 65 29 20 3e 20 20 63 75 72 72 65  szPage) >  curre
1adb0 6e 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  ntSize );.      
1adc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1add0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
1ade0 2c 20 70 54 6d 70 2c 20 73 7a 50 61 67 65 2c 20  , pTmp, szPage, 
1adf0 6e 65 77 53 69 7a 65 2d 73 7a 50 61 67 65 29 3b  newSize-szPage);
1ae00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1ae10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ae20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
1ae30 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
1ae40 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a   nPage;.      }.
1ae50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1ae60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1ae70 52 65 74 75 72 6e 20 61 20 73 61 6e 69 74 69 7a  Return a sanitiz
1ae80 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  ed version of th
1ae90 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6f 66  e sector-size of
1aea0 20 4f 53 20 66 69 6c 65 20 70 46 69 6c 65 2e 20   OS file pFile. 
1aeb0 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61  The.** return va
1aec0 6c 75 65 20 69 73 20 67 75 61 72 61 6e 74 65 65  lue is guarantee
1aed0 64 20 74 6f 20 6c 69 65 20 62 65 74 77 65 65 6e  d to lie between
1aee0 20 33 32 20 61 6e 64 20 4d 41 58 5f 53 45 43 54   32 and MAX_SECT
1aef0 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 69 6e 74 20  OR_SIZE..*/.int 
1af00 73 71 6c 69 74 65 33 53 65 63 74 6f 72 53 69 7a  sqlite3SectorSiz
1af10 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1af20 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 69 52  pFile){.  int iR
1af30 65 74 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  et = sqlite3OsSe
1af40 63 74 6f 72 53 69 7a 65 28 70 46 69 6c 65 29 3b  ctorSize(pFile);
1af50 0a 20 20 69 66 28 20 69 52 65 74 3c 33 32 20 29  .  if( iRet<32 )
1af60 7b 0a 20 20 20 20 69 52 65 74 20 3d 20 35 31 32  {.    iRet = 512
1af70 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 52  ;.  }else if( iR
1af80 65 74 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  et>MAX_SECTOR_SI
1af90 5a 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ZE ){.    assert
1afa0 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  ( MAX_SECTOR_SIZ
1afb0 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20 69 52  E>=512 );.    iR
1afc0 65 74 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f  et = MAX_SECTOR_
1afd0 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75  SIZE;.  }.  retu
1afe0 72 6e 20 69 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn iRet;.}../*.*
1aff0 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20  * Set the value 
1b000 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73 65 63  of the Pager.sec
1b010 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65  torSize variable
1b020 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a   for the given.*
1b030 2a 20 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e  * pager based on
1b040 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
1b050 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74  ned by the xSect
1b060 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a  orSize method.**
1b070 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74   of the open dat
1b080 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
1b090 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c  sector size will
1b0a0 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20   be used .** to 
1b0b0 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69  determine the si
1b0c0 7a 65 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74  ze and alignment
1b0d0 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
1b0e0 65 72 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65  er and .** maste
1b0f0 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
1b100 72 73 20 77 69 74 68 69 6e 20 63 72 65 61 74 65  rs within create
1b110 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  d journal files.
1b120 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f  .**.** For tempo
1b130 72 61 72 79 20 66 69 6c 65 73 20 74 68 65 20 65  rary files the e
1b140 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20  ffective sector 
1b150 73 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20 35  size is always 5
1b160 31 32 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  12 bytes..**.** 
1b170 4f 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 6e  Otherwise, for n
1b180 6f 6e 2d 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  on-temporary fil
1b190 65 73 2c 20 74 68 65 20 65 66 66 65 63 74 69 76  es, the effectiv
1b1a0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
1b1b0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65  .** the value re
1b1c0 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78 53  turned by the xS
1b1d0 65 63 74 6f 72 53 69 7a 65 28 29 20 6d 65 74 68  ectorSize() meth
1b1e0 6f 64 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  od rounded up to
1b1f0 20 33 32 20 69 66 0a 2a 2a 20 69 74 20 69 73 20   32 if.** it is 
1b200 6c 65 73 73 20 74 68 61 6e 20 33 32 2c 20 6f 72  less than 32, or
1b210 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f   rounded down to
1b220 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
1b230 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 67 72 65   if it.** is gre
1b240 61 74 65 72 20 74 68 61 6e 20 4d 41 58 5f 53 45  ater than MAX_SE
1b250 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2a 0a 2a 2a  CTOR_SIZE..**.**
1b260 20 49 66 20 74 68 65 20 66 69 6c 65 20 68 61 73   If the file has
1b270 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41   the SQLITE_IOCA
1b280 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
1b290 57 52 49 54 45 20 70 72 6f 70 65 72 74 79 2c 20  WRITE property, 
1b2a0 74 68 65 6e 20 73 65 74 0a 2a 2a 20 74 68 65 20  then set.** the 
1b2b0 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72  effective sector
1b2c0 20 73 69 7a 65 20 74 6f 20 69 74 73 20 6d 69 6e   size to its min
1b2d0 69 6d 75 6d 20 76 61 6c 75 65 20 28 35 31 32 29  imum value (512)
1b2e0 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f  .  The purpose o
1b2f0 66 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 73 65 63  f.** pPager->sec
1b300 74 6f 72 53 69 7a 65 20 69 73 20 74 6f 20 64 65  torSize is to de
1b310 66 69 6e 65 20 74 68 65 20 22 62 6c 61 73 74 20  fine the "blast 
1b320 72 61 64 69 75 73 22 20 6f 66 20 62 79 74 65 73  radius" of bytes
1b330 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63   that.** might c
1b340 68 61 6e 67 65 20 69 66 20 61 20 63 72 61 73 68  hange if a crash
1b350 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 77 72   occurs while wr
1b360 69 74 69 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c  iting to a singl
1b370 65 20 62 79 74 65 20 69 6e 0a 2a 2a 20 74 68 61  e byte in.** tha
1b380 74 20 72 61 6e 67 65 2e 20 20 42 75 74 20 77 69  t range.  But wi
1b390 74 68 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  th POWERSAFE_OVE
1b3a0 52 57 52 49 54 45 2c 20 74 68 65 20 62 6c 61 73  RWRITE, the blas
1b3b0 74 20 72 61 64 69 75 73 20 69 73 20 7a 65 72 6f  t radius is zero
1b3c0 0a 2a 2a 20 28 74 68 61 74 20 69 73 20 77 68 61  .** (that is wha
1b3d0 74 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  t POWERSAFE_OVER
1b3e0 57 52 49 54 45 20 6d 65 61 6e 73 29 2c 20 73 6f  WRITE means), so
1b3f0 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   we minimize the
1b400 20 73 65 63 74 6f 72 0a 2a 2a 20 73 69 7a 65 2e   sector.** size.
1b410 20 20 46 6f 72 20 62 61 63 6b 77 61 72 64 73 20    For backwards 
1b420 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 6f 66  compatibility of
1b430 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1b440 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
1b450 74 2c 0a 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20  t,.** we cannot 
1b460 72 65 64 75 63 65 20 74 68 65 20 65 66 66 65 63  reduce the effec
1b470 74 69 76 65 20 73 65 63 74 6f 72 20 73 69 7a 65  tive sector size
1b480 20 62 65 6c 6f 77 20 35 31 32 2e 0a 2a 2f 0a 73   below 512..*/.s
1b490 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65  tatic void setSe
1b4a0 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a  ctorSize(Pager *
1b4b0 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
1b4c0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
1b4d0 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
1b4e0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20  >tempFile );..  
1b4f0 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
1b500 46 69 6c 65 0a 20 20 20 7c 7c 20 28 73 71 6c 69  File.   || (sqli
1b510 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
1b520 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
1b530 72 2d 3e 66 64 29 20 26 20 0a 20 20 20 20 20 20  r->fd) & .      
1b540 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1b550 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
1b560 56 45 52 57 52 49 54 45 29 21 3d 30 0a 20 20 29  VERWRITE)!=0.  )
1b570 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20  {.    /* Sector 
1b580 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74  size doesn't mat
1b590 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  ter for temporar
1b5a0 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74  y files. Also, t
1b5b0 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d  he file.    ** m
1b5c0 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ay not have been
1b5d0 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20   opened yet, in 
1b5e0 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20 4f  which case the O
1b5f0 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20  sSectorSize().  
1b600 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73    ** call will s
1b610 65 67 66 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20  egfault. */.    
1b620 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
1b630 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 65 6c 73  ze = 512;.  }els
1b640 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  e{.    pPager->s
1b650 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69  ectorSize = sqli
1b660 74 65 33 53 65 63 74 6f 72 53 69 7a 65 28 70 50  te3SectorSize(pP
1b670 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 7d  ager->fd);.  }.}
1b680 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
1b690 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
1b6a0 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68   thus restore th
1b6b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1b6c0 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  to.** the state 
1b6d0 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65  it was in before
1b6e0 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69   we started maki
1b6f0 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a  ng changes.  .**
1b700 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
1b710 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61  file format is a
1b720 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a  s follows: .**.*
1b730 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70  *  (1)  8 byte p
1b740 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f  refix.  A copy o
1b750 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  f aJournalMagic[
1b760 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79  ]..**  (2)  4 by
1b770 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
1b780 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
1b790 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c  he number of val
1b7a0 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a  id page records.
1b7b0 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20  **       in the 
1b7c0 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69  journal.  If thi
1b7d0 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  s value is 0xfff
1b7e0 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70  fffff, then comp
1b7f0 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ute the.**      
1b800 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20   number of page 
1b810 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
1b820 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a   journal size..*
1b830 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62  *  (3)  4 byte b
1b840 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
1b850 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  r which is the i
1b860 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72  nitial value for
1b870 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73   the .**       s
1b880 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a  anity checksum..
1b890 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20  **  (4)  4 byte 
1b8a0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
1b8b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1b8c0 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65  ages to truncate
1b8d0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61   the.**       da
1b8e0 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67  tabase to during
1b8f0 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20   a rollback..** 
1b900 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67   (5)  4 byte big
1b910 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
1b920 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63  which is the sec
1b930 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68  tor size.  The h
1b940 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69  eader.**       i
1b950 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  s this many byte
1b960 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  s in size..**  (
1b970 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  6)  4 byte big-e
1b980 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
1b990 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20  ich is the page 
1b9a0 73 69 7a 65 2e 0a 2a 2a 20 20 28 37 29 20 20 7a  size..**  (7)  z
1b9b0 65 72 6f 20 70 61 64 64 69 6e 67 20 6f 75 74 20  ero padding out 
1b9c0 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
1b9d0 6f 72 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 38 29  or size..**  (8)
1b9e0 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70    Zero or more p
1b9f0 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20  ages instances, 
1ba00 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  each as follows:
1ba10 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
1ba20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
1ba30 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70  ..**        +  p
1ba40 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1ba50 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a  bytes of data..*
1ba60 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
1ba70 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a  te checksum.**.*
1ba80 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20  * When we speak 
1ba90 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
1baa0 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74  eader, we mean t
1bab0 68 65 20 66 69 72 73 74 20 37 20 69 74 65 6d 73  he first 7 items
1bac0 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20   above..** Each 
1bad0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75  entry in the jou
1bae0 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61  rnal is an insta
1baf0 6e 63 65 20 6f 66 20 74 68 65 20 38 74 68 20 69  nce of the 8th i
1bb00 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  tem..**.** Call 
1bb10 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  the value from t
1bb20 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74  he second bullet
1bb30 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69   "nRec".  nRec i
1bb40 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
1bb50 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e  ** valid page en
1bb60 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75  tries in the jou
1bb70 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63  rnal.  In most c
1bb80 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f  ases, you can co
1bb90 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c  mpute the.** val
1bba0 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20  ue of nRec from 
1bbb0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1bbc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42  journal file.  B
1bbd0 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a  ut if a power.**
1bbe0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
1bbf0 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  d while the jour
1bc00 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72  nal was being wr
1bc10 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20  itten, it could 
1bc20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  be the.** case t
1bc30 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
1bc40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1bc50 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
1bc60 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a  n increased but.
1bc70 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74  ** the extra ent
1bc80 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74  ries had not yet
1bc90 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20   made it safely 
1bca0 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63  to disk.  In suc
1bcb0 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65  h a case,.** the
1bcc0 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63   value of nRec c
1bcd0 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
1bce0 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64   file size would
1bcf0 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20   be too large.  
1bd00 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73  For.** that reas
1bd10 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  on, we always us
1bd20 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
1bd30 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
1bd40 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65  **.** If the nRe
1bd50 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  c value is 0xfff
1bd60 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74  fffff it means t
1bd70 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20  hat nRec should 
1bd80 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  be computed.** f
1bd90 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
1bda0 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  e.  This value i
1bdb0 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  s used when the 
1bdc0 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65  user selects the
1bdd0 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69  .** no-sync opti
1bde0 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  on for the journ
1bdf0 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69  al.  A power fai
1be00 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20  lure could lead 
1be10 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a  to corruption.**
1be20 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
1be30 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c  But for things l
1be40 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ike temporary ta
1be50 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ble (which will 
1be60 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  be.** deleted wh
1be70 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20  en the power is 
1be80 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e  restored) we don
1be90 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a  't care.  .**.**
1bea0 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
1beb0 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e  ned as the journ
1bec0 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  al file is not a
1bed0 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
1bee0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
1bef0 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74  n all pages up t
1bf00 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72  o the first corr
1bf10 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72  upted page are r
1bf20 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f  olled.** back (o
1bf30 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68  r no pages if th
1bf40 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
1bf50 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20   is corrupted). 
1bf60 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
1bf70 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65  .** is then dele
1bf80 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
1bf90 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74  K returned, just
1bfa0 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70   as if no corrup
1bfb0 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e  tion had.** been
1bfc0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
1bfd0 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72  .** If an I/O or
1bfe0 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
1bff0 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72  occurs, the jour
1c000 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
1c010 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61  deleted.** and a
1c020 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
1c030 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1c040 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65  The isHot parame
1c050 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74 68  ter indicates th
1c060 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  at we are trying
1c070 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a   to rollback a j
1c080 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d  ournal.** that m
1c090 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f  ight be a hot jo
1c0a0 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63  urnal.  Or, it c
1c0b0 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65  ould be that the
1c0c0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20   journal is .** 
1c0d0 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75 73  preserved becaus
1c0e0 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  e of JOURNALMODE
1c0f0 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52  _PERSIST or JOUR
1c100 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
1c110 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  ..** If the jour
1c120 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f  nal really is ho
1c130 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61 67  t, reset the pag
1c140 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20 72  er cache prior r
1c150 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61  olling.** back a
1c160 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20  ny content.  If 
1c170 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d  the journal is m
1c180 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74  erely persistent
1c190 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a  , no reset is.**
1c1a0 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
1c1b0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
1c1c0 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
1c1d0 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b  ger, int isHot){
1c1e0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1c1f0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
1c200 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  Vfs;.  i64 szJ; 
1c210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c220 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a  /* Size of the j
1c230 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
1c240 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52  ytes */.  u32 nR
1c250 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
1c260 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1c270 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a  Records in the j
1c280 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
1c290 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
1c2a0 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
1c2b0 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
1c2c0 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
1c2d0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
1c2e0 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
1c2f0 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
1c300 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
1c310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c320 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
1c330 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
1c340 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b  /.  int res = 1;
1c350 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c360 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
1c370 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  y sqlite3OsAcces
1c380 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  s() */.  char *z
1c390 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20  Master = 0;     
1c3a0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73    /* Name of mas
1c3b0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1c3c0 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74   if any */.  int
1c3d0 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 3b   needPagerReset;
1c3e0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
1c3f0 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69 6f   reset page prio
1c400 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20  r to first page 
1c410 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 6e  rollback */.  in
1c420 74 20 6e 50 6c 61 79 62 61 63 6b 20 3d 20 30 3b  t nPlayback = 0;
1c430 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
1c440 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1c450 72 65 73 74 6f 72 65 64 20 66 72 6f 6d 20 6a 6f  restored from jo
1c460 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 73  urnal */.  u32 s
1c470 61 76 65 64 50 61 67 65 53 69 7a 65 20 3d 20 70  avedPageSize = p
1c480 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
1c490 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
1c4a0 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
1c4b0 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f  ds are in the jo
1c4c0 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61  urnal.  Abort ea
1c4d0 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  rly if.  ** the 
1c4e0 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79  journal is empty
1c4f0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1c500 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1c510 6a 66 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  jfd) );.  rc = s
1c520 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
1c530 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73  (pPager->jfd, &s
1c540 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
1c550 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c560 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
1c570 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  k;.  }..  /* Rea
1c580 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  d the master jou
1c590 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74  rnal name from t
1c5a0 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69  he journal, if i
1c5b0 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20  t is present..  
1c5c0 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
1c5d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
1c5e0 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62   is specified, b
1c5f0 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  ut the file is n
1c600 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20  ot.  ** present 
1c610 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68  on disk, then th
1c620 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  e journal is not
1c630 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f   hot and does no
1c640 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a  t need to be.  *
1c650 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  * played back.. 
1c660 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54   **.  ** TODO: T
1c670 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66  echnically the f
1c680 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65  ollowing is an e
1c690 72 72 6f 72 20 62 65 63 61 75 73 65 20 69 74 20  rror because it 
1c6a0 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a  assumes that.  *
1c6b0 2a 20 62 75 66 66 65 72 20 50 61 67 65 72 2e 70  * buffer Pager.p
1c6c0 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d 78 50  TmpSpace is (mxP
1c6d0 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73  athname+1) bytes
1c6e0 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e   or larger. i.e.
1c6f0 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67   that.  ** (pPag
1c700 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20  er->pageSize >= 
1c710 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
1c720 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69  Pathname+1). Usi
1c730 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20  ng os_unix.c,.  
1c740 2a 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73  ** mxPathname is
1c750 20 35 31 32 2c 20 77 68 69 63 68 20 69 73 20 74   512, which is t
1c760 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d  he same as the m
1c770 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65  inimum allowable
1c780 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20   value.  ** for 
1c790 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20  pageSize..  */. 
1c7a0 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65   zMaster = pPage
1c7b0 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
1c7c0 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
1c7d0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
1c7e0 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  fd, zMaster, pPa
1c7f0 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
1c800 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20  hname+1);.  if( 
1c810 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1c820 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20   zMaster[0] ){. 
1c830 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1c840 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d  sAccess(pVfs, zM
1c850 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43  aster, SQLITE_AC
1c860 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65  CESS_EXISTS, &re
1c870 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65  s);.  }.  zMaste
1c880 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21  r = 0;.  if( rc!
1c890 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72  =SQLITE_OK || !r
1c8a0 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  es ){.    goto e
1c8b0 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
1c8c0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
1c8d0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65  alOff = 0;.  nee
1c8e0 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 69 73  dPagerReset = is
1c8f0 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  Hot;..  /* This 
1c900 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20  loop terminates 
1c910 65 69 74 68 65 72 20 77 68 65 6e 20 61 20 72 65  either when a re
1c920 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f  adJournalHdr() o
1c930 72 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c  r .  ** pager_pl
1c940 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
1c950 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53  ) call returns S
1c960 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
1c970 20 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20   IO error .  ** 
1c980 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20  occurs. .  */.  
1c990 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
1c9a0 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74  /* Read the next
1c9b0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
1c9c0 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
1c9d0 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
1c9e0 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20   are.    ** not 
1c9f0 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66  enough bytes lef
1ca00 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
1ca10 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70   file for a comp
1ca20 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a  lete header, or.
1ca30 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72      ** it is cor
1ca40 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70  rupted, then a p
1ca50 72 6f 63 65 73 73 20 6d 75 73 74 20 68 61 76 65  rocess must have
1ca60 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72   failed while wr
1ca70 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a  iting it..    **
1ca80 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   This indicates 
1ca90 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65  nothing more nee
1caa0 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ds to be rolled 
1cab0 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  back..    */.   
1cac0 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
1cad0 6c 48 64 72 28 70 50 61 67 65 72 2c 20 69 73 48  lHdr(pPager, isH
1cae0 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20  ot, szJ, &nRec, 
1caf0 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20  &mxPg);.    if( 
1cb00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1cb10 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d   .      if( rc==
1cb20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
1cb30 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1cb40 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
1cb50 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
1cb60 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20  ayback;.    }.. 
1cb70 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
1cb80 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
1cb90 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  n this journal w
1cba0 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
1cbb0 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77  process.    ** w
1cbc0 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e  orking in no-syn
1cbd0 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61  c mode. This mea
1cbe0 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74  ns that the rest
1cbf0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
1cc00 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73      ** file cons
1cc10 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74  ists of pages, t
1cc20 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
1cc30 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73   journal headers
1cc40 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a  . Compute.    **
1cc50 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
1cc60 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73  ec based on this
1cc70 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20   assumption..   
1cc80 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
1cc90 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a  ==0xffffffff ){.
1cca0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1ccb0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1ccc0 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
1ccd0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
1cce0 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28    nRec = (int)((
1ccf0 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44  szJ - JOURNAL_HD
1cd00 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f  R_SZ(pPager))/JO
1cd10 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
1cd20 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  er));.    }..   
1cd30 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30   /* If nRec is 0
1cd40 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61   and this rollba
1cd50 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73  ck is of a trans
1cd60 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62  action created b
1cd70 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72  y this.    ** pr
1cd80 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74 68 69  ocess and if thi
1cd90 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68  s is the final h
1cda0 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75  eader in the jou
1cdb0 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65  rnal, then it me
1cdc0 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ans.    ** that 
1cdd0 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  this part of the
1cde0 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69   journal was bei
1cdf0 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61  ng filled but ha
1ce00 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20  s not yet been. 
1ce10 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20     ** synced to 
1ce20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74  disk.  Compute t
1ce30 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
1ce40 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  es based on the 
1ce50 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a  remaining.    **
1ce60 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
1ce70 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
1ce80 20 54 68 65 20 74 68 69 72 64 20 74 65 72 6d 20   The third term 
1ce90 6f 66 20 74 68 65 20 74 65 73 74 20 77 61 73 20  of the test was 
1cea0 61 64 64 65 64 20 74 6f 20 66 69 78 20 74 69 63  added to fix tic
1ceb0 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a  ket #2565..    *
1cec0 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62  * When rolling b
1ced0 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  ack a hot journa
1cee0 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79  l, nRec==0 alway
1cef0 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
1cf00 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68 75   next.    ** chu
1cf10 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nk of the journa
1cf20 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20  l contains zero 
1cf30 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c  pages to be roll
1cf40 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20 20  ed back.  But.  
1cf50 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20    ** when doing 
1cf60 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74  a ROLLBACK and t
1cf70 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b  he nRec==0 chunk
1cf80 20 69 73 20 74 68 65 20 6c 61 73 74 20 63 68 75   is the last chu
1cf90 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  nk in.    ** the
1cfa0 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61   journal, it mea
1cfb0 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ns that the jour
1cfc0 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  nal might contai
1cfd0 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20  n additional.   
1cfe0 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 6e   ** pages that n
1cff0 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eed to be rolled
1d000 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74   back and that t
1d010 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
1d020 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c  es .    ** shoul
1d030 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62 61  d be computed ba
1d040 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  sed on the journ
1d050 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20  al file size..  
1d060 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
1d070 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26  c==0 && !isHot &
1d080 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  &.        pPager
1d090 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
1d0a0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
1d0b0 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
1d0c0 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20  rnalOff ){.     
1d0d0 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73   nRec = (int)((s
1d0e0 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
1d0f0 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e  rnalOff) / JOURN
1d100 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
1d110 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
1d120 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
1d130 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61  first header rea
1d140 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
1d150 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  al, truncate the
1d160 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
1d170 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74   file back to it
1d180 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e  s original size.
1d190 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1d1a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1d1b0 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
1d1c0 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  SZ(pPager) ){.  
1d1d0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
1d1e0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
1d1f0 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  mxPg);.      if(
1d200 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d210 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  {.        goto e
1d220 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
1d230 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
1d240 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67  r->dbSize = mxPg
1d250 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1d260 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61  Copy original pa
1d270 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a  ges out of the j
1d280 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20  ournal and back 
1d290 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a  into the .    **
1d2a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
1d2b0 6e 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68 65  nd/or page cache
1d2c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
1d2d0 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b  (u=0; u<nRec; u+
1d2e0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  +){.      if( ne
1d2f0 65 64 50 61 67 65 72 52 65 73 65 74 20 29 7b 0a  edPagerReset ){.
1d300 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
1d310 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
1d320 20 20 20 20 20 6e 65 65 64 50 61 67 65 72 52 65       needPagerRe
1d330 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  set = 0;.      }
1d340 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
1d350 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
1d360 61 67 65 28 70 50 61 67 65 72 2c 26 70 50 61 67  age(pPager,&pPag
1d370 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30  er->journalOff,0
1d380 2c 31 2c 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ,1,0);.      if(
1d390 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1d3a0 7b 0a 20 20 20 20 20 20 20 20 6e 50 6c 61 79 62  {.        nPlayb
1d3b0 61 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  ack++;.      }el
1d3c0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
1d3d0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1d3e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  ){.          pPa
1d3f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1d400 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20  = szJ;.         
1d410 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1d420 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
1d430 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1d440 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
1d450 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75     /* If the jou
1d460 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 74 72  rnal has been tr
1d470 75 6e 63 61 74 65 64 2c 20 73 69 6d 70 6c 79 20  uncated, simply 
1d480 73 74 6f 70 20 72 65 61 64 69 6e 67 20 61 6e 64  stop reading and
1d490 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
1d4a0 6f 63 65 73 73 69 6e 67 20 74 68 65 20 6a 6f 75  ocessing the jou
1d4b0 72 6e 61 6c 2e 20 54 68 69 73 20 6d 69 67 68 74  rnal. This might
1d4c0 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 6a   happen if the j
1d4d0 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 20  ournal was.     
1d4e0 20 20 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6d 70       ** not comp
1d4f0 6c 65 74 65 6c 79 20 77 72 69 74 74 65 6e 20 61  letely written a
1d500 6e 64 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20  nd synced prior 
1d510 74 6f 20 61 20 63 72 61 73 68 2e 20 20 49 6e 20  to a crash.  In 
1d520 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a  that.          *
1d530 2a 20 63 61 73 65 2c 20 74 68 65 20 64 61 74 61  * case, the data
1d540 62 61 73 65 20 73 68 6f 75 6c 64 20 68 61 76 65  base should have
1d550 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69 74   never been writ
1d560 74 65 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20  ten in the.     
1d570 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 70 6c       ** first pl
1d580 61 63 65 20 73 6f 20 69 74 20 69 73 20 4f 4b 20  ace so it is OK 
1d590 74 6f 20 73 69 6d 70 6c 79 20 61 62 61 6e 64 6f  to simply abando
1d5a0 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20  n the rollback. 
1d5b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
1d5c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1d5d0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1d5e0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
1d5f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d600 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
1d610 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61  unable to rollba
1d620 63 6b 2c 20 71 75 69 74 20 61 6e 64 20 72 65 74  ck, quit and ret
1d630 75 72 6e 20 74 68 65 20 65 72 72 6f 72 0a 20 20  urn the error.  
1d640 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e          ** code.
1d650 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73    This will caus
1d660 65 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65  e the pager to e
1d670 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73  nter the error s
1d680 74 61 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a  tate.          *
1d690 2a 20 73 6f 20 74 68 61 74 20 6e 6f 20 66 75 72  * so that no fur
1d6a0 74 68 65 72 20 68 61 72 6d 20 77 69 6c 6c 20 62  ther harm will b
1d6b0 65 20 64 6f 6e 65 2e 20 20 50 65 72 68 61 70 73  e done.  Perhaps
1d6c0 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20   the next.      
1d6d0 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 74      ** process t
1d6e0 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c  o come along wil
1d6f0 6c 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c  l be able to rol
1d700 6c 62 61 63 6b 20 74 68 65 20 64 61 74 61 62 61  lback the databa
1d710 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  se..          */
1d720 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
1d730 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
1d740 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1d750 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f      }.  }.  /*NO
1d760 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73  TREACHED*/.  ass
1d770 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70  ert( 0 );..end_p
1d780 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
1d790 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d7a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d7b0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
1d7c0 28 70 50 61 67 65 72 2c 20 26 73 61 76 65 64 50  (pPager, &savedP
1d7d0 61 67 65 53 69 7a 65 2c 20 2d 31 29 3b 0a 20 20  ageSize, -1);.  
1d7e0 7d 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67  }.  /* Following
1d7f0 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65   a rollback, the
1d800 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
1d810 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e  hould be back in
1d820 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20   its original.  
1d830 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20 74  ** state prior t
1d840 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
1d850 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
1d860 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20  so invoke the.  
1d870 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ** SQLITE_FCNTL_
1d880 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c  DB_UNCHANGED fil
1d890 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64  e-control method
1d8a0 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a   to disable the.
1d8b0 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74    ** assertion t
1d8c0 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
1d8d0 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
1d8e0 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 23  modified..  */.#
1d8f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1d900 55 47 0a 20 20 73 71 6c 69 74 65 33 4f 73 46 69  UG.  sqlite3OsFi
1d910 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50  leControlHint(pP
1d920 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f  ager->fd,SQLITE_
1d930 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
1d940 45 44 2c 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ED,0);.#endif.. 
1d950 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79   /* If this play
1d960 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e  back is happenin
1d970 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  g automatically 
1d980 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61  as a result of a
1d990 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61  n IO or .  ** ma
1d9a0 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20  lloc error that 
1d9b0 6f 63 63 75 72 72 65 64 20 61 66 74 65 72 20 74  occurred after t
1d9c0 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1d9d0 72 20 77 61 73 20 75 70 64 61 74 65 64 20 62 75  r was updated bu
1d9e0 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74  t .  ** before t
1d9f0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
1da00 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68  as committed, th
1da10 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  en the change-co
1da20 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69  unter .  ** modi
1da30 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73  fication may jus
1da40 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 76 65  t have been reve
1da50 72 74 65 64 2e 20 49 66 20 74 68 69 73 20 68 61  rted. If this ha
1da60 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69  ppens in exclusi
1da70 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74  ve .  ** mode, t
1da80 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74  hen subsequent t
1da90 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66  ransactions perf
1daa0 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e  ormed by the con
1dab0 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74  nection will not
1dac0 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65  .  ** update the
1dad0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
1dae0 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79  at all. This may
1daf0 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20 69   lead to cache i
1db00 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a  nconsistency.  *
1db10 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f  * problems for o
1db20 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61  ther processes a
1db30 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20  t some point in 
1db40 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20  the future. So, 
1db50 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73  just.  ** in cas
1db60 65 20 74 68 69 73 20 68 61 73 20 68 61 70 70 65  e this has happe
1db70 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63  ned, clear the c
1db80 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
1db90 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20  lag now..  */.  
1dba0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
1dbb0 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
1dbc0 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69  ->tempFile;..  i
1dbd0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1dbe0 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20   ){.    zMaster 
1dbf0 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
1dc00 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  ace;.    rc = re
1dc10 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
1dc20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
1dc30 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
1dc40 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
1dc50 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1dc60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1dc70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1dc80 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20  SQLITE_OK.   && 
1dc90 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e  (pPager->eState>
1dca0 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 44 42  =PAGER_WRITER_DB
1dcb0 4d 4f 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  MOD || pPager->e
1dcc0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
1dcd0 4e 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  N).  ){.    rc =
1dce0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e   sqlite3PagerSyn
1dcf0 63 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  c(pPager, 0);.  
1dd00 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1dd10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1dd20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
1dd30 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
1dd40 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27  zMaster[0]!='\0'
1dd50 2c 20 30 29 3b 0a 20 20 20 20 74 65 73 74 63 61  , 0);.    testca
1dd60 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
1dd70 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  K );.  }.  if( r
1dd80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1dd90 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65  zMaster[0] && re
1dda0 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  s ){.    /* If t
1ddb0 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65  here was a maste
1ddc0 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  r journal and th
1ddd0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
1dde0 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a  return success,.
1ddf0 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
1de00 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
1de10 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
1de20 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  r journal..    *
1de30 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
1de40 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65  _delmaster(pPage
1de50 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  r, zMaster);.   
1de60 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
1de70 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
1de80 20 20 69 66 28 20 69 73 48 6f 74 20 26 26 20 6e    if( isHot && n
1de90 50 6c 61 79 62 61 63 6b 20 29 7b 0a 20 20 20 20  Playback ){.    
1dea0 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
1deb0 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45  TE_NOTICE_RECOVE
1dec0 52 5f 52 4f 4c 4c 42 41 43 4b 2c 20 22 72 65 63  R_ROLLBACK, "rec
1ded0 6f 76 65 72 65 64 20 25 64 20 70 61 67 65 73 20  overed %d pages 
1dee0 66 72 6f 6d 20 25 73 22 2c 0a 20 20 20 20 20 20  from %s",.      
1def0 20 20 20 20 20 20 20 20 20 20 6e 50 6c 61 79 62            nPlayb
1df00 61 63 6b 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  ack, pPager->zJo
1df10 75 72 6e 61 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f  urnal);.  }..  /
1df20 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74  * The Pager.sect
1df30 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
1df40 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70  may have been up
1df50 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c  dated while roll
1df60 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20  ing.  ** back a 
1df70 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
1df80 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74  by a process wit
1df90 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65  h a different se
1dfa0 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76  ctor size.  ** v
1dfb0 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74  alue. Reset it t
1dfc0 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61  o the correct va
1dfd0 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  lue for this pro
1dfe0 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74  cess..  */.  set
1dff0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
1e000 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
1e010 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  .}.../*.** Read 
1e020 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20  the content for 
1e030 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20  page pPg out of 
1e040 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1e050 65 20 28 6f 72 20 6f 75 74 20 6f 66 0a 2a 2a 20  e (or out of.** 
1e060 74 68 65 20 57 41 4c 20 69 66 20 74 68 61 74 20  the WAL if that 
1e070 69 73 20 77 68 65 72 65 20 74 68 65 20 6d 6f 73  is where the mos
1e080 74 20 72 65 63 65 6e 74 20 63 6f 70 79 20 69 66  t recent copy if
1e090 20 66 6f 75 6e 64 29 20 69 6e 74 6f 20 0a 2a 2a   found) into .**
1e0a0 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73   pPg->pData. A s
1e0b0 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72  hared lock or gr
1e0c0 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65  eater must be he
1e0d0 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
1e0e0 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72  se.** file befor
1e0f0 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
1e100 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
1e110 20 49 66 20 70 61 67 65 20 31 20 69 73 20 72 65   If page 1 is re
1e120 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ad, then the val
1e130 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69  ue of Pager.dbFi
1e140 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20  leVers[] is set 
1e150 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  to.** the value 
1e160 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
1e170 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1e180 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
1e190 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74  r occurs, then t
1e1a0 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72  he IO error is r
1e1b0 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
1e1c0 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77  aller..** Otherw
1e1d0 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ise, SQLITE_OK i
1e1e0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1e1f0 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 62  tatic int readDb
1e200 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
1e210 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
1e220 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1e230 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
1e240 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1e250 20 70 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 69   page pPg */.  i
1e260 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1e270 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  K;          /* R
1e280 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23  eturn code */..#
1e290 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1e2a0 49 54 5f 57 41 4c 0a 20 20 75 33 32 20 69 46 72  IT_WAL.  u32 iFr
1e2b0 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ame = 0;        
1e2c0 20 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 6f        /* Frame o
1e2d0 66 20 57 41 4c 20 63 6f 6e 74 61 69 6e 69 6e 67  f WAL containing
1e2e0 20 70 67 6e 6f 20 2a 2f 0a 0a 20 20 61 73 73 65   pgno */..  asse
1e2f0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
1e300 74 65 3e 3d 50 41 47 45 52 5f 52 45 41 44 45 52  te>=PAGER_READER
1e310 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20   && !MEMDB );.  
1e320 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
1e330 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20  Pager->fd) );.. 
1e340 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
1e350 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
1e360 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 46  rc = sqlite3WalF
1e370 69 6e 64 46 72 61 6d 65 28 70 50 61 67 65 72 2d  indFrame(pPager-
1e380 3e 70 57 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f  >pWal, pPg->pgno
1e390 2c 20 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20  , &iFrame);.    
1e3a0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1e3b0 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 46  rc;.  }.  if( iF
1e3c0 72 61 6d 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  rame ){.    rc =
1e3d0 20 73 71 6c 69 74 65 33 57 61 6c 52 65 61 64 46   sqlite3WalReadF
1e3e0 72 61 6d 65 28 70 50 61 67 65 72 2d 3e 70 57 61  rame(pPager->pWa
1e3f0 6c 2c 20 69 46 72 61 6d 65 2c 70 50 61 67 65 72  l, iFrame,pPager
1e400 2d 3e 70 61 67 65 53 69 7a 65 2c 70 50 67 2d 3e  ->pageSize,pPg->
1e410 70 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73 65 0a  pData);.  }else.
1e420 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 69  #endif.  {.    i
1e430 36 34 20 69 4f 66 66 73 65 74 20 3d 20 28 70 50  64 iOffset = (pP
1e440 67 2d 3e 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  g->pgno-1)*(i64)
1e450 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1e460 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1e470 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
1e480 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c  >fd, pPg->pData,
1e490 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1e4a0 65 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  e, iOffset);.   
1e4b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e4c0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
1e4d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1e4e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1e4f0 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 67 2d 3e    }..  if( pPg->
1e500 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 69  pgno==1 ){.    i
1e510 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  f( rc ){.      /
1e520 2a 20 49 66 20 74 68 65 20 72 65 61 64 20 69 73  * If the read is
1e530 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 73   unsuccessful, s
1e540 65 74 20 74 68 65 20 64 62 46 69 6c 65 56 65 72  et the dbFileVer
1e550 73 5b 5d 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  s[] to something
1e560 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
1e570 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 20 76  ill never be a v
1e580 61 6c 69 64 20 66 69 6c 65 20 76 65 72 73 69 6f  alid file versio
1e590 6e 2e 20 20 64 62 46 69 6c 65 56 65 72 73 5b 5d  n.  dbFileVers[]
1e5a0 20 69 73 20 61 20 63 6f 70 79 0a 20 20 20 20 20   is a copy.     
1e5b0 20 2a 2a 20 6f 66 20 62 79 74 65 73 20 32 34 2e   ** of bytes 24.
1e5c0 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62  .39 of the datab
1e5d0 61 73 65 2e 20 20 42 79 74 65 73 20 32 38 2e 2e  ase.  Bytes 28..
1e5e0 33 31 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  31 should always
1e5f0 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   be.      ** zer
1e600 6f 20 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66  o or the size of
1e610 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
1e620 20 70 61 67 65 2e 20 42 79 74 65 73 20 33 32 2e   page. Bytes 32.
1e630 2e 33 35 20 61 6e 64 20 33 35 2e 2e 33 39 0a 20  .35 and 35..39. 
1e640 20 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62       ** should b
1e650 65 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 77  e page numbers w
1e660 68 69 63 68 20 61 72 65 20 6e 65 76 65 72 20 30  hich are never 0
1e670 78 66 66 66 66 66 66 66 66 2e 20 20 53 6f 20 66  xffffffff.  So f
1e680 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  illing.      ** 
1e690 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1e6a0 72 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30 78  rs[] with all 0x
1e6b0 66 66 20 62 79 74 65 73 20 73 68 6f 75 6c 64 20  ff bytes should 
1e6c0 73 75 66 66 69 63 65 2e 0a 20 20 20 20 20 20 2a  suffice..      *
1e6d0 2a 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72 20 61  *.      ** For a
1e6e0 6e 20 65 6e 63 72 79 70 74 65 64 20 64 61 74 61  n encrypted data
1e6f0 62 61 73 65 2c 20 74 68 65 20 73 69 74 75 61 74  base, the situat
1e700 69 6f 6e 20 69 73 20 6d 6f 72 65 20 63 6f 6d 70  ion is more comp
1e710 6c 65 78 3a 20 20 62 79 74 65 73 0a 20 20 20 20  lex:  bytes.    
1e720 20 20 2a 2a 20 32 34 2e 2e 33 39 20 6f 66 20 74    ** 24..39 of t
1e730 68 65 20 64 61 74 61 62 61 73 65 20 61 72 65 20  he database are 
1e740 77 68 69 74 65 20 6e 6f 69 73 65 2e 20 20 42 75  white noise.  Bu
1e750 74 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74  t the probabilit
1e760 79 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 77 68  y of.      ** wh
1e770 69 74 65 20 6e 6f 69 73 65 20 65 71 75 61 6c 69  ite noise equali
1e780 6e 67 20 31 36 20 62 79 74 65 73 20 6f 66 20 30  ng 16 bytes of 0
1e790 78 66 66 20 69 73 20 76 61 6e 69 73 68 69 6e 67  xff is vanishing
1e7a0 6c 79 20 73 6d 61 6c 6c 20 73 6f 0a 20 20 20 20  ly small so.    
1e7b0 20 20 2a 2a 20 77 65 20 73 68 6f 75 6c 64 20 73    ** we should s
1e7c0 74 69 6c 6c 20 62 65 20 6f 6b 2e 0a 20 20 20 20  till be ok..    
1e7d0 20 20 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 73 65    */.      memse
1e7e0 74 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  t(pPager->dbFile
1e7f0 56 65 72 73 2c 20 30 78 66 66 2c 20 73 69 7a 65  Vers, 0xff, size
1e800 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
1e810 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 65 6c  eVers));.    }el
1e820 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 64 62  se{.      u8 *db
1e830 46 69 6c 65 56 65 72 73 20 3d 20 26 28 28 75 38  FileVers = &((u8
1e840 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34  *)pPg->pData)[24
1e850 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ];.      memcpy(
1e860 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
1e870 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c  ers, dbFileVers,
1e880 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
1e890 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
1e8a0 20 20 7d 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31    }.  }.  CODEC1
1e8b0 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44  (pPager, pPg->pD
1e8c0 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
1e8d0 33 2c 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  3, rc = SQLITE_N
1e8e0 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 0a 20 20 50  OMEM_BKPT);..  P
1e8f0 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
1e900 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
1e910 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49  ount);.  PAGER_I
1e920 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61  NCR(pPager->nRea
1e930 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  d);.  IOTRACE(("
1e940 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70  PGIN %p %d\n", p
1e950 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
1e960 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  ));.  PAGERTRACE
1e970 28 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65  (("FETCH %d page
1e980 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
1e990 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1e9a0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1e9b0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 61  ), pPg->pgno, pa
1e9c0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
1e9d0 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  )));..  return r
1e9e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61  c;.}../*.** Upda
1e9f0 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  te the value of 
1ea00 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1ea10 65 72 20 61 74 20 6f 66 66 73 65 74 73 20 32 34  er at offsets 24
1ea20 20 61 6e 64 20 39 32 20 69 6e 0a 2a 2a 20 74 68   and 92 in.** th
1ea30 65 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65  e header and the
1ea40 20 73 71 6c 69 74 65 20 76 65 72 73 69 6f 6e 20   sqlite version 
1ea50 6e 75 6d 62 65 72 20 61 74 20 6f 66 66 73 65 74  number at offset
1ea60 20 39 36 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   96..**.** This 
1ea70 69 73 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69 6f  is an unconditio
1ea80 6e 61 6c 20 75 70 64 61 74 65 2e 20 20 53 65 65  nal update.  See
1ea90 20 61 6c 73 6f 20 74 68 65 20 70 61 67 65 72 5f   also the pager_
1eaa0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
1eab0 65 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  er().** routine 
1eac0 77 68 69 63 68 20 6f 6e 6c 79 20 75 70 64 61 74  which only updat
1ead0 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  es the change-co
1eae0 75 6e 74 65 72 20 69 66 20 74 68 65 20 75 70 64  unter if the upd
1eaf0 61 74 65 20 69 73 20 61 63 74 75 61 6c 6c 79 0a  ate is actually.
1eb00 2a 2a 20 6e 65 65 64 65 64 2c 20 61 73 20 64 65  ** needed, as de
1eb10 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
1eb20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
1eb30 75 6e 74 44 6f 6e 65 20 73 74 61 74 65 20 76 61  untDone state va
1eb40 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  riable..*/.stati
1eb50 63 20 76 6f 69 64 20 70 61 67 65 72 5f 77 72 69  c void pager_wri
1eb60 74 65 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  te_changecounter
1eb70 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
1eb80 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  u32 change_count
1eb90 65 72 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d  er;..  /* Increm
1eba0 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75  ent the value ju
1ebb0 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  st read and writ
1ebc0 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74  e it back to byt
1ebd0 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67  e 24. */.  chang
1ebe0 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69  e_counter = sqli
1ebf0 74 65 33 47 65 74 34 62 79 74 65 28 28 75 38 2a  te3Get4byte((u8*
1ec00 29 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64 62  )pPg->pPager->db
1ec10 46 69 6c 65 56 65 72 73 29 2b 31 3b 0a 20 20 70  FileVers)+1;.  p
1ec20 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a  ut32bits(((char*
1ec30 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 32 34 2c  )pPg->pData)+24,
1ec40 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29   change_counter)
1ec50 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 73 74 6f  ;..  /* Also sto
1ec60 72 65 20 74 68 65 20 53 51 4c 69 74 65 20 76 65  re the SQLite ve
1ec70 72 73 69 6f 6e 20 6e 75 6d 62 65 72 20 69 6e 20  rsion number in 
1ec80 62 79 74 65 73 20 39 36 2e 2e 39 39 20 61 6e 64  bytes 96..99 and
1ec90 20 69 6e 0a 20 20 2a 2a 20 62 79 74 65 73 20 39   in.  ** bytes 9
1eca0 32 2e 2e 39 35 20 73 74 6f 72 65 20 74 68 65 20  2..95 store the 
1ecb0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 66  change counter f
1ecc0 6f 72 20 77 68 69 63 68 20 74 68 65 20 76 65 72  or which the ver
1ecd0 73 69 6f 6e 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  sion number.  **
1ece0 20 69 73 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20   is valid. */.  
1ecf0 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
1ed00 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 2b 39 32  *)pPg->pData)+92
1ed10 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  , change_counter
1ed20 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 28  );.  put32bits((
1ed30 28 63 68 61 72 2a 29 70 50 67 2d 3e 70 44 61 74  (char*)pPg->pDat
1ed40 61 29 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56 45  a)+96, SQLITE_VE
1ed50 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 7d  RSION_NUMBER);.}
1ed60 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1ed70 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20  _OMIT_WAL./*.** 
1ed80 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1ed90 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 66 6f   invoked once fo
1eda0 72 20 65 61 63 68 20 70 61 67 65 20 74 68 61 74  r each page that
1edb0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1edc0 6e 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e  n .** written in
1edd0 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20  to the log file 
1ede0 77 68 65 6e 20 61 20 57 41 4c 20 74 72 61 6e 73  when a WAL trans
1edf0 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
1ee00 20 62 61 63 6b 2e 0a 2a 2a 20 50 61 72 61 6d 65   back..** Parame
1ee10 74 65 72 20 69 50 67 20 69 73 20 74 68 65 20 70  ter iPg is the p
1ee20 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  age number of sa
1ee30 69 64 20 70 61 67 65 2e 20 54 68 65 20 70 43 74  id page. The pCt
1ee40 78 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 69  x argument .** i
1ee50 73 20 61 63 74 75 61 6c 6c 79 20 61 20 70 6f 69  s actually a poi
1ee60 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65  nter to the Page
1ee70 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  r structure..**.
1ee80 2a 2a 20 49 66 20 70 61 67 65 20 69 50 67 20 69  ** If page iPg i
1ee90 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  s present in the
1eea0 20 63 61 63 68 65 2c 20 61 6e 64 20 68 61 73 20   cache, and has 
1eeb0 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  no outstanding r
1eec0 65 66 65 72 65 6e 63 65 73 2c 0a 2a 2a 20 69 74  eferences,.** it
1eed0 20 69 73 20 64 69 73 63 61 72 64 65 64 2e 20 4f   is discarded. O
1eee0 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
1eef0 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d 6f  re are one or mo
1ef00 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a  re outstanding.*
1ef10 2a 20 72 65 66 65 72 65 6e 63 65 73 2c 20 74 68  * references, th
1ef20 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  e page content i
1ef30 73 20 72 65 6c 6f 61 64 65 64 20 66 72 6f 6d 20  s reloaded from 
1ef40 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
1ef50 20 74 68 65 0a 2a 2a 20 61 74 74 65 6d 70 74 20   the.** attempt 
1ef60 74 6f 20 72 65 6c 6f 61 64 20 63 6f 6e 74 65 6e  to reload conten
1ef70 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  t from the datab
1ef80 61 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ase is required 
1ef90 61 6e 64 20 66 61 69 6c 73 2c 20 0a 2a 2a 20 72  and fails, .** r
1efa0 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
1efb0 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65  error code. Othe
1efc0 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
1efd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1efe0 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63  pagerUndoCallbac
1eff0 6b 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 50 67  k(void *pCtx, Pg
1f000 6e 6f 20 69 50 67 29 7b 0a 20 20 69 6e 74 20 72  no iPg){.  int r
1f010 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1f020 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1f030 20 28 50 61 67 65 72 20 2a 29 70 43 74 78 3b 0a   (Pager *)pCtx;.
1f040 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
1f050 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
1f060 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 3b 0a  eWal(pPager) );.
1f070 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50    pPg = sqlite3P
1f080 61 67 65 72 4c 6f 6f 6b 75 70 28 70 50 61 67 65  agerLookup(pPage
1f090 72 2c 20 69 50 67 29 3b 0a 20 20 69 66 28 20 70  r, iPg);.  if( p
1f0a0 50 67 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  Pg ){.    if( sq
1f0b0 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52  lite3PcachePageR
1f0c0 65 66 63 6f 75 6e 74 28 70 50 67 29 3d 3d 31 20  efcount(pPg)==1 
1f0d0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1f0e0 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b  PcacheDrop(pPg);
1f0f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f100 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67    rc = readDbPag
1f110 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66  e(pPg);.      if
1f120 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1f130 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
1f140 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67  r->xReiniter(pPg
1f150 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1f160 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1f170 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 67 29 3b 0a  efNotNull(pPg);.
1f180 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1f190 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 20 74  Normally, if a t
1f1a0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
1f1b0 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79 20 62  lled back, any b
1f1c0 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20  ackup processes 
1f1d0 61 72 65 0a 20 20 2a 2a 20 75 70 64 61 74 65 64  are.  ** updated
1f1e0 20 61 73 20 64 61 74 61 20 69 73 20 63 6f 70 69   as data is copi
1f1f0 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20 72 6f  ed out of the ro
1f200 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61  llback journal a
1f210 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  nd into the.  **
1f220 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20   database. This 
1f230 69 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c 6c 79  is not generally
1f240 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68 20 61   possible with a
1f250 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 20 61   WAL database, a
1f260 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  s.  ** rollback 
1f270 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c 79 20  involves simply 
1f280 74 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20 6c  truncating the l
1f290 6f 67 20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f  og file. Therefo
1f2a0 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20  re, if one.  ** 
1f2b0 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 68  or more frames h
1f2c0 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
1f2d0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1f2e0 6c 6f 67 20 28 61 6e 64 20 74 68 65 72 65 66 6f  log (and therefo
1f2f0 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20 63 6f  re .  ** also co
1f300 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 62 61  pied into the ba
1f310 63 6b 75 70 20 64 61 74 61 62 61 73 65 73 29 20  ckup databases) 
1f320 61 73 20 70 61 72 74 20 6f 66 20 74 68 69 73 20  as part of this 
1f330 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 2a  transaction,.  *
1f340 2a 20 74 68 65 20 62 61 63 6b 75 70 73 20 6d 75  * the backups mu
1f350 73 74 20 62 65 20 72 65 73 74 61 72 74 65 64 2e  st be restarted.
1f360 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42  .  */.  sqlite3B
1f370 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61  ackupRestart(pPa
1f380 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 0a  ger->pBackup);..
1f390 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1f3a0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1f3b0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
1f3c0 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e   rollback a tran
1f3d0 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57 41 4c  saction on a WAL
1f3e0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
1f3f0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 52 6f  atic int pagerRo
1f400 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67 65 72 20  llbackWal(Pager 
1f410 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1f420 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1f430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1f440 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
1f450 50 67 48 64 72 20 2a 70 4c 69 73 74 3b 20 20 20  PgHdr *pList;   
1f460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f470 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69 72 74 79  /* List of dirty
1f480 20 70 61 67 65 73 20 74 6f 20 72 65 76 65 72 74   pages to revert
1f490 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20 61 6c   */..  /* For al
1f4a0 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  l pages in the c
1f4b0 61 63 68 65 20 74 68 61 74 20 61 72 65 20 63 75  ache that are cu
1f4c0 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 6f 72  rrently dirty or
1f4d0 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20   have already.  
1f4e0 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ** been written 
1f4f0 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69 74 74  (but not committ
1f500 65 64 29 20 74 6f 20 74 68 65 20 6c 6f 67 20 66  ed) to the log f
1f510 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66 20 74  ile, do one of t
1f520 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  he .  ** followi
1f530 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ng:.  **.  **   
1f540 2b 20 44 69 73 63 61 72 64 20 74 68 65 20 63 61  + Discard the ca
1f550 63 68 65 64 20 70 61 67 65 20 28 69 66 20 72 65  ched page (if re
1f560 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72 0a 20  fcount==0), or. 
1f570 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64 20 70   **   + Reload p
1f580 61 67 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  age content from
1f590 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69   the database (i
1f5a0 66 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e 0a 20  f refcount>0).. 
1f5b0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
1f5c0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
1f5d0 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 63 20  bOrigSize;.  rc 
1f5e0 3d 20 73 71 6c 69 74 65 33 57 61 6c 55 6e 64 6f  = sqlite3WalUndo
1f5f0 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 70  (pPager->pWal, p
1f600 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61 63 6b  agerUndoCallback
1f610 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72  , (void *)pPager
1f620 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  );.  pList = sql
1f630 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
1f640 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
1f650 63 68 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  che);.  while( p
1f660 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51 4c 49  List && rc==SQLI
1f670 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 67 48  TE_OK ){.    PgH
1f680 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69 73  dr *pNext = pLis
1f690 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 72  t->pDirty;.    r
1f6a0 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43 61 6c  c = pagerUndoCal
1f6b0 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29 70 50  lback((void *)pP
1f6c0 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ager, pList->pgn
1f6d0 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  o);.    pList = 
1f6e0 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 72 65  pNext;.  }..  re
1f6f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1f700 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f710 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f  is a wrapper aro
1f720 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c 46 72  und sqlite3WalFr
1f730 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c 6c 20  ames(). As well 
1f740 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20 74 68  as logging.** th
1f750 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1f760 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
1f770 68 65 61 64 65 64 20 62 79 20 70 4c 69 73 74 20  headed by pList 
1f780 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44  (connected by pD
1f790 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73 20 66  irty),.** this f
1f7a0 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69 65 73  unction notifies
1f7b0 20 61 6e 79 20 61 63 74 69 76 65 20 62 61 63 6b   any active back
1f7c0 75 70 20 70 72 6f 63 65 73 73 65 73 20 74 68 61  up processes tha
1f7d0 74 20 74 68 65 20 70 61 67 65 73 20 68 61 76 65  t the pages have
1f7e0 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a  .** changed. .**
1f7f0 0a 2a 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20  .** The list of 
1f800 70 61 67 65 73 20 70 61 73 73 65 64 20 69 6e 74  pages passed int
1f810 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
1f820 73 20 61 6c 77 61 79 73 20 73 6f 72 74 65 64 20  s always sorted 
1f830 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  by page number..
1f840 2a 2a 20 48 65 6e 63 65 2c 20 69 66 20 70 61 67  ** Hence, if pag
1f850 65 20 31 20 61 70 70 65 61 72 73 20 61 6e 79 77  e 1 appears anyw
1f860 68 65 72 65 20 6f 6e 20 74 68 65 20 6c 69 73 74  here on the list
1f870 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 74 68 65  , it will be the
1f880 20 66 69 72 73 74 20 70 61 67 65 2e 0a 2a 2f 20   first page..*/ 
1f890 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1f8a0 72 57 61 6c 46 72 61 6d 65 73 28 0a 20 20 50 61  rWalFrames(.  Pa
1f8b0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
1f8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f8d0 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
1f8e0 0a 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 2c  .  PgHdr *pList,
1f8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f900 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
1f910 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a 2f 0a 20  ames to log */. 
1f920 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61 74 65 2c   Pgno nTruncate,
1f930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f940 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a   /* Database siz
1f950 65 20 61 66 74 65 72 20 74 68 69 73 20 63 6f 6d  e after this com
1f960 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43  mit */.  int isC
1f970 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20  ommit           
1f980 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1f990 20 69 66 20 74 68 69 73 20 69 73 20 61 20 63 6f   if this is a co
1f9a0 6d 6d 69 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  mmit */.){.  int
1f9b0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1f9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f9d0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1f9e0 20 69 6e 74 20 6e 4c 69 73 74 3b 20 20 20 20 20   int nList;     
1f9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa00 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1fa10 67 65 73 20 69 6e 20 70 4c 69 73 74 20 2a 2f 0a  ges in pList */.
1fa20 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20 20 20    PgHdr *p;     
1fa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa40 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
1fa50 20 6f 76 65 72 20 70 61 67 65 73 20 2a 2f 0a 0a   over pages */..
1fa60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1fa70 2d 3e 70 57 61 6c 20 29 3b 0a 20 20 61 73 73 65  ->pWal );.  asse
1fa80 72 74 28 20 70 4c 69 73 74 20 29 3b 0a 23 69 66  rt( pList );.#if
1fa90 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1faa0 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .  /* Verify tha
1fab0 74 20 74 68 65 20 70 61 67 65 20 6c 69 73 74 20  t the page list 
1fac0 69 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20  is in accending 
1fad0 6f 72 64 65 72 20 2a 2f 0a 20 20 66 6f 72 28 70  order */.  for(p
1fae0 3d 70 4c 69 73 74 3b 20 70 20 26 26 20 70 2d 3e  =pList; p && p->
1faf0 70 44 69 72 74 79 3b 20 70 3d 70 2d 3e 70 44 69  pDirty; p=p->pDi
1fb00 72 74 79 29 7b 0a 20 20 20 20 61 73 73 65 72 74  rty){.    assert
1fb10 28 20 70 2d 3e 70 67 6e 6f 20 3c 20 70 2d 3e 70  ( p->pgno < p->p
1fb20 44 69 72 74 79 2d 3e 70 67 6e 6f 20 29 3b 0a 20  Dirty->pgno );. 
1fb30 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
1fb40 65 72 74 28 20 70 4c 69 73 74 2d 3e 70 44 69 72  ert( pList->pDir
1fb50 74 79 3d 3d 30 20 7c 7c 20 69 73 43 6f 6d 6d 69  ty==0 || isCommi
1fb60 74 20 29 3b 0a 20 20 69 66 28 20 69 73 43 6f 6d  t );.  if( isCom
1fb70 6d 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  mit ){.    /* If
1fb80 20 61 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69   a WAL transacti
1fb90 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d  on is being comm
1fba0 69 74 74 65 64 2c 20 74 68 65 72 65 20 69 73 20  itted, there is 
1fbb0 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 77 72 69 74  no point in writ
1fbc0 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 79 20 70  ing.    ** any p
1fbd0 61 67 65 73 20 77 69 74 68 20 70 61 67 65 20 6e  ages with page n
1fbe0 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 20 74  umbers greater t
1fbf0 68 61 6e 20 6e 54 72 75 6e 63 61 74 65 20 69 6e  han nTruncate in
1fc00 74 6f 20 74 68 65 20 57 41 4c 20 66 69 6c 65 2e  to the WAL file.
1fc10 0a 20 20 20 20 2a 2a 20 54 68 65 79 20 77 69 6c  .    ** They wil
1fc20 6c 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  l never be read 
1fc30 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2e 20 53  by any client. S
1fc40 6f 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72  o remove them fr
1fc50 6f 6d 20 74 68 65 20 70 44 69 72 74 79 0a 20 20  om the pDirty.  
1fc60 20 20 2a 2a 20 6c 69 73 74 20 68 65 72 65 2e 20    ** list here. 
1fc70 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a 2a 70  */.    PgHdr **p
1fc80 70 4e 65 78 74 20 3d 20 26 70 4c 69 73 74 3b 0a  pNext = &pList;.
1fc90 20 20 20 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20      nList = 0;. 
1fca0 20 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20     for(p=pList; 
1fcb0 28 2a 70 70 4e 65 78 74 20 3d 20 70 29 21 3d 30  (*ppNext = p)!=0
1fcc0 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a  ; p=p->pDirty){.
1fcd0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e        if( p->pgn
1fce0 6f 3c 3d 6e 54 72 75 6e 63 61 74 65 20 29 7b 0a  o<=nTruncate ){.
1fcf0 20 20 20 20 20 20 20 20 70 70 4e 65 78 74 20 3d          ppNext =
1fd00 20 26 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20   &p->pDirty;.   
1fd10 20 20 20 20 20 6e 4c 69 73 74 2b 2b 3b 0a 20 20       nList++;.  
1fd20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1fd30 61 73 73 65 72 74 28 20 70 4c 69 73 74 20 29 3b  assert( pList );
1fd40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c  .  }else{.    nL
1fd50 69 73 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70  ist = 1;.  }.  p
1fd60 50 61 67 65 72 2d 3e 61 53 74 61 74 5b 50 41 47  Pager->aStat[PAG
1fd70 45 52 5f 53 54 41 54 5f 57 52 49 54 45 5d 20 2b  ER_STAT_WRITE] +
1fd80 3d 20 6e 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20  = nList;..  if( 
1fd90 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pList->pgno==1 )
1fda0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63 68 61   pager_write_cha
1fdb0 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69 73 74  ngecounter(pList
1fdc0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1fdd0 33 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65  3WalFrames(pPage
1fde0 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20 20 20 20  r->pWal, .      
1fdf0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1fe00 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75 6e 63 61  , pList, nTrunca
1fe10 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c 20 70 50  te, isCommit, pP
1fe20 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61  ager->walSyncFla
1fe30 67 73 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  gs.  );.  if( rc
1fe40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1fe50 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29  Pager->pBackup )
1fe60 7b 0a 20 20 20 20 66 6f 72 28 70 3d 70 4c 69 73  {.    for(p=pLis
1fe70 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74  t; p; p=p->pDirt
1fe80 79 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  y){.      sqlite
1fe90 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50  3BackupUpdate(pP
1fea0 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70  ager->pBackup, p
1feb0 2d 3e 70 67 6e 6f 2c 20 28 75 38 20 2a 29 70 2d  ->pgno, (u8 *)p-
1fec0 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  >pData);.    }. 
1fed0 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
1fee0 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
1fef0 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 50  pList = sqlite3P
1ff00 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
1ff10 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
1ff20 0a 20 20 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20  .  for(p=pList; 
1ff30 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  p; p=p->pDirty){
1ff40 0a 20 20 20 20 70 61 67 65 72 5f 73 65 74 5f 70  .    pager_set_p
1ff50 61 67 65 68 61 73 68 28 70 29 3b 0a 20 20 7d 0a  agehash(p);.  }.
1ff60 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
1ff70 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65   rc;.}../*.** Be
1ff80 67 69 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73  gin a read trans
1ff90 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 57 41  action on the WA
1ffa0 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  L..**.** This ro
1ffb0 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20 62 65  utine used to be
1ffc0 20 63 61 6c 6c 65 64 20 22 70 61 67 65 72 4f 70   called "pagerOp
1ffd0 65 6e 53 6e 61 70 73 68 6f 74 28 29 22 20 62 65  enSnapshot()" be
1ffe0 63 61 75 73 65 20 69 74 20 65 73 73 65 6e 74 69  cause it essenti
1fff0 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20 61 20  ally.** makes a 
20000 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68 65 20  snapshot of the 
20010 64 61 74 61 62 61 73 65 20 61 74 20 74 68 65 20  database at the 
20020 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 20 69 6e  current point in
20030 20 74 69 6d 65 20 61 6e 64 20 70 72 65 73 65 72   time and preser
20040 76 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e 61 70  ves.** that snap
20050 73 68 6f 74 20 66 6f 72 20 75 73 65 20 62 79 20  shot for use by 
20060 74 68 65 20 72 65 61 64 65 72 20 69 6e 20 73 70  the reader in sp
20070 69 74 65 20 6f 66 20 63 6f 6e 63 75 72 72 65 6e  ite of concurren
20080 74 6c 79 20 63 68 61 6e 67 65 73 20 62 79 0a 2a  tly changes by.*
20090 2a 20 6f 74 68 65 72 20 77 72 69 74 65 72 73 20  * other writers 
200a0 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 73  or checkpointers
200b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
200c0 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54 72  pagerBeginReadTr
200d0 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20  ansaction(Pager 
200e0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
200f0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
20100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
20110 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
20120 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20 30 3b  int changed = 0;
20130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20140 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65  /* True if cache
20150 20 6d 75 73 74 20 62 65 20 72 65 73 65 74 20 2a   must be reset *
20160 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  /..  assert( pag
20170 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
20180 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
20190 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41  ager->eState==PA
201a0 47 45 52 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67  GER_OPEN || pPag
201b0 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45  er->eState==PAGE
201c0 52 5f 52 45 41 44 45 52 20 29 3b 0a 0a 20 20 2f  R_READER );..  /
201d0 2a 20 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52  * sqlite3WalEndR
201e0 65 61 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29  eadTransaction()
201f0 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20   was not called 
20200 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73  for the previous
20210 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
20220 6e 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  n in locking_mod
20230 65 3d 45 58 43 4c 55 53 49 56 45 2e 20 20 53 6f  e=EXCLUSIVE.  So
20240 20 63 61 6c 6c 20 69 74 20 6e 6f 77 2e 20 20 49   call it now.  I
20250 66 20 77 65 0a 20 20 2a 2a 20 61 72 65 20 69 6e  f we.  ** are in
20260 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 4e 4f   locking_mode=NO
20270 52 4d 41 4c 20 61 6e 64 20 45 6e 64 52 65 61 64  RMAL and EndRead
20280 28 29 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  () was previousl
20290 79 20 63 61 6c 6c 65 64 2c 0a 20 20 2a 2a 20 74  y called,.  ** t
202a0 68 65 20 64 75 70 6c 69 63 61 74 65 20 63 61 6c  he duplicate cal
202b0 6c 20 69 73 20 68 61 72 6d 6c 65 73 73 2e 0a 20  l is harmless.. 
202c0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57 61 6c   */.  sqlite3Wal
202d0 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74 69  EndReadTransacti
202e0 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 29  on(pPager->pWal)
202f0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
20300 33 57 61 6c 42 65 67 69 6e 52 65 61 64 54 72 61  3WalBeginReadTra
20310 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2d  nsaction(pPager-
20320 3e 70 57 61 6c 2c 20 26 63 68 61 6e 67 65 64 29  >pWal, &changed)
20330 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
20340 54 45 5f 4f 4b 20 7c 7c 20 63 68 61 6e 67 65 64  TE_OK || changed
20350 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65   ){.    pager_re
20360 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
20370 20 69 66 28 20 55 53 45 46 45 54 43 48 28 70 50   if( USEFETCH(pP
20380 61 67 65 72 29 20 29 20 73 71 6c 69 74 65 33 4f  ager) ) sqlite3O
20390 73 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d  sUnfetch(pPager-
203a0 3e 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  >fd, 0, 0);.  }.
203b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
203c0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
203d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
203e0 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66  alled as part of
203f0 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20   the transition 
20400 66 72 6f 6d 20 50 41 47 45 52 5f 4f 50 45 4e 0a  from PAGER_OPEN.
20410 2a 2a 20 74 6f 20 50 41 47 45 52 5f 52 45 41 44  ** to PAGER_READ
20420 45 52 20 73 74 61 74 65 20 74 6f 20 64 65 74 65  ER state to dete
20430 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65 20 6f  rmine the size o
20440 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
20450 69 6c 65 0a 2a 2a 20 69 6e 20 70 61 67 65 73 20  ile.** in pages 
20460 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20 70 61  (assuming the pa
20470 67 65 20 73 69 7a 65 20 63 75 72 72 65 6e 74 6c  ge size currentl
20480 79 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65  y stored in Page
20490 72 2e 70 61 67 65 53 69 7a 65 29 2e 0a 2a 2a 0a  r.pageSize)..**.
204a0 2a 2a 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ** If no error o
204b0 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4f 4b  ccurs, SQLITE_OK
204c0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
204d0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
204e0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20   database.** in 
204f0 70 61 67 65 73 20 69 73 20 73 74 6f 72 65 64 20  pages is stored 
20500 69 6e 20 2a 70 6e 50 61 67 65 2e 20 4f 74 68 65  in *pnPage. Othe
20510 72 77 69 73 65 2c 20 61 6e 20 65 72 72 6f 72 20  rwise, an error 
20520 63 6f 64 65 20 28 70 65 72 68 61 70 73 0a 2a 2a  code (perhaps.**
20530 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
20540 54 41 54 29 20 69 73 20 72 65 74 75 72 6e 65 64  TAT) is returned
20550 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20   and *pnPage is 
20560 6c 65 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 2e  left unmodified.
20570 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
20580 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61  agerPagecount(Pa
20590 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
205a0 6f 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67  o *pnPage){.  Pg
205b0 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  no nPage;       
205c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
205d0 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
205e0 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a   via *pnPage */.
205f0 0a 20 20 2f 2a 20 51 75 65 72 79 20 74 68 65 20  .  /* Query the 
20600 57 41 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 66  WAL sub-system f
20610 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
20620 73 69 7a 65 2e 20 54 68 65 20 57 61 6c 44 62 73  size. The WalDbs
20630 69 7a 65 28 29 0a 20 20 2a 2a 20 66 75 6e 63 74  ize().  ** funct
20640 69 6f 6e 20 72 65 74 75 72 6e 73 20 7a 65 72 6f  ion returns zero
20650 20 69 66 20 74 68 65 20 57 41 4c 20 69 73 20 6e   if the WAL is n
20660 6f 74 20 6f 70 65 6e 20 28 69 2e 65 2e 20 50 61  ot open (i.e. Pa
20670 67 65 72 2e 70 57 61 6c 3d 3d 30 29 2c 20 6f 72  ger.pWal==0), or
20680 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 64 61 74  .  ** if the dat
20690 61 62 61 73 65 20 73 69 7a 65 20 69 73 20 6e 6f  abase size is no
206a0 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 54 68 65  t available. The
206b0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69   database size i
206c0 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 76 61 69 6c  s not.  ** avail
206d0 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 57 41  able from the WA
206e0 4c 20 73 75 62 2d 73 79 73 74 65 6d 20 69 66 20  L sub-system if 
206f0 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20  the log file is 
20700 65 6d 70 74 79 20 6f 72 0a 20 20 2a 2a 20 63 6f  empty or.  ** co
20710 6e 74 61 69 6e 73 20 6e 6f 20 76 61 6c 69 64 20  ntains no valid 
20720 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61  committed transa
20730 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 61  ctions..  */.  a
20740 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
20750 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
20760 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  N );.  assert( p
20770 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48  Pager->eLock>=SH
20780 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
20790 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
207a0 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61  ager->fd) );.  a
207b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
207c0 65 6d 70 46 69 6c 65 3d 3d 30 20 29 3b 0a 20 20  empFile==0 );.  
207d0 6e 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 57  nPage = sqlite3W
207e0 61 6c 44 62 73 69 7a 65 28 70 50 61 67 65 72 2d  alDbsize(pPager-
207f0 3e 70 57 61 6c 29 3b 0a 0a 20 20 2f 2a 20 49 66  >pWal);..  /* If
20800 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
20810 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
20820 62 61 73 65 20 69 73 20 6e 6f 74 20 61 76 61 69  base is not avai
20830 6c 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 0a 20  lable from the. 
20840 20 2a 2a 20 57 41 4c 20 73 75 62 2d 73 79 73 74   ** WAL sub-syst
20850 65 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68  em, determine th
20860 65 20 70 61 67 65 20 63 6f 75 6e 74 20 62 61 73  e page count bas
20870 65 64 20 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f  ed on the size o
20880 66 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62  f.  ** the datab
20890 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
208a0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
208b0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e  tabase file is n
208c0 6f 74 20 61 6e 0a 20 20 2a 2a 20 69 6e 74 65 67  ot an.  ** integ
208d0 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74  er multiple of t
208e0 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 72 6f  he page-size, ro
208f0 75 6e 64 20 75 70 20 74 68 65 20 72 65 73 75 6c  und up the resul
20900 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50  t..  */.  if( nP
20910 61 67 65 3d 3d 30 20 26 26 20 41 4c 57 41 59 53  age==0 && ALWAYS
20920 28 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  (isOpen(pPager->
20930 66 64 29 29 20 29 7b 0a 20 20 20 20 69 36 34 20  fd)) ){.    i64 
20940 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
20950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
20960 65 20 6f 66 20 64 62 20 66 69 6c 65 20 69 6e 20  e of db file in 
20970 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74  bytes */.    int
20980 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
20990 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
209a0 66 64 2c 20 26 6e 29 3b 0a 20 20 20 20 69 66 28  fd, &n);.    if(
209b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
209c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
209d0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61  c;.    }.    nPa
209e0 67 65 20 3d 20 28 50 67 6e 6f 29 28 28 6e 2b 70  ge = (Pgno)((n+p
209f0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d  Pager->pageSize-
20a00 31 29 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67  1) / pPager->pag
20a10 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  eSize);.  }..  /
20a20 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
20a30 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
20a40 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20   in the file is 
20a50 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
20a60 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64  .  ** configured
20a70 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e   maximum pager n
20a80 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20  umber, increase 
20a90 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69  the allowed limi
20aa0 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74  t so.  ** that t
20ab0 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72  he file can be r
20ac0 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ead..  */.  if( 
20ad0 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78  nPage>pPager->mx
20ae0 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  Pgno ){.    pPag
20af0 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67  er->mxPgno = (Pg
20b00 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20  no)nPage;.  }.. 
20b10 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65   *pnPage = nPage
20b20 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
20b30 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
20b40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
20b50 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20  ./*.** Check if 
20b60 74 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74  the *-wal file t
20b70 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
20b80 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
20b90 6f 70 65 6e 65 64 20 62 79 20 70 50 61 67 65 72  opened by pPager
20ba0 0a 2a 2a 20 65 78 69 73 74 73 20 69 66 20 74 68  .** exists if th
20bb0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f  e database is no
20bc0 74 20 65 6d 70 79 2c 20 6f 72 20 76 65 72 69 66  t empy, or verif
20bd0 79 20 74 68 61 74 20 74 68 65 20 2a 2d 77 61 6c  y that the *-wal
20be0 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   file does.** no
20bf0 74 20 65 78 69 73 74 20 28 62 79 20 64 65 6c 65  t exist (by dele
20c00 74 69 6e 67 20 69 74 29 20 69 66 20 74 68 65 20  ting it) if the 
20c10 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
20c20 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66   empty..**.** If
20c30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
20c40 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64 20 74   not empty and t
20c50 68 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 65 78  he *-wal file ex
20c60 69 73 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 70  ists, open the p
20c70 61 67 65 72 0a 2a 2a 20 69 6e 20 57 41 4c 20 6d  ager.** in WAL m
20c80 6f 64 65 2e 20 20 49 66 20 74 68 65 20 64 61 74  ode.  If the dat
20c90 61 62 61 73 65 20 69 73 20 65 6d 70 74 79 20 6f  abase is empty o
20ca0 72 20 69 66 20 6e 6f 20 2a 2d 77 61 6c 20 66 69  r if no *-wal fi
20cb0 6c 65 20 65 78 69 73 74 73 20 61 6e 64 0a 2a 2a  le exists and.**
20cc0 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
20cd0 75 72 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 50  urs, make sure P
20ce0 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ager.journalMode
20cf0 20 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 0a 2a   is not set to.*
20d00 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  * PAGER_JOURNALM
20d10 4f 44 45 5f 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 52  ODE_WAL..**.** R
20d20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
20d30 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
20d40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
20d50 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 20 53  er must hold a S
20d60 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  HARED lock on th
20d70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
20d80 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20  to call this.** 
20d90 66 75 6e 63 74 69 6f 6e 2e 20 42 65 63 61 75 73  function. Becaus
20da0 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
20db0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 62 20 66 69  ock on the db fi
20dc0 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 74  le is required t
20dd0 6f 20 64 65 6c 65 74 65 20 0a 2a 2a 20 61 20 57  o delete .** a W
20de0 41 4c 20 6f 6e 20 61 20 6e 6f 6e 65 2d 65 6d 70  AL on a none-emp
20df0 74 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 69  ty database, thi
20e00 73 20 65 6e 73 75 72 65 73 20 74 68 65 72 65 20  s ensures there 
20e10 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e 64 69  is no race condi
20e20 74 69 6f 6e 20 0a 2a 2a 20 62 65 74 77 65 65 6e  tion .** between
20e30 20 74 68 65 20 78 41 63 63 65 73 73 28 29 20 62   the xAccess() b
20e40 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44 65 6c  elow and an xDel
20e50 65 74 65 28 29 20 62 65 69 6e 67 20 65 78 65 63  ete() being exec
20e60 75 74 65 64 20 62 79 20 73 6f 6d 65 20 0a 2a 2a  uted by some .**
20e70 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
20e80 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
20e90 20 70 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50   pagerOpenWalIfP
20ea0 72 65 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50  resent(Pager *pP
20eb0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
20ec0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
20ed0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
20ee0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45  State==PAGER_OPE
20ef0 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  N );.  assert( p
20f00 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3e 3d 53 48  Pager->eLock>=SH
20f10 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ARED_LOCK );..  
20f20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
20f30 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  pFile ){.    int
20f40 20 69 73 57 61 6c 3b 20 20 20 20 20 20 20 20 20   isWal;         
20f50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
20f60 75 65 20 69 66 20 57 41 4c 20 66 69 6c 65 20 65  ue if WAL file e
20f70 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 72 63 20  xists */.    rc 
20f80 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
20f90 73 28 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  s(.        pPage
20fa0 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
20fb0 3e 7a 57 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43  >zWal, SQLITE_AC
20fc0 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 69 73  CESS_EXISTS, &is
20fd0 57 61 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  Wal.    );.    i
20fe0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20ff0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
21000 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 50  Wal ){.        P
21010 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20  gno nPage;      
21020 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21030 53 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  Size of the data
21040 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
21050 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
21060 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
21070 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
21080 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
21090 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69  rn rc;.        i
210a0 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20  f( nPage==0 ){. 
210b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
210c0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
210d0 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
210e0 65 72 2d 3e 7a 57 61 6c 2c 20 30 29 3b 0a 20 20  er->zWal, 0);.  
210f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21100 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
21110 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
21120 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
21130 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20  pPCache)==0 );. 
21140 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
21150 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61  lite3PagerOpenWa
21160 6c 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  l(pPager, 0);.  
21170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
21180 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
21190 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
211a0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57  ER_JOURNALMODE_W
211b0 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  AL ){.        pP
211c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
211d0 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
211e0 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b 0a 20 20  LMODE_DELETE;.  
211f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
21200 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
21210 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61  endif../*.** Pla
21220 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20  yback savepoint 
21230 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20  pSavepoint. Or, 
21240 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e  if pSavepoint==N
21250 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61  ULL, then playba
21260 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65  ck.** the entire
21270 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
21280 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70  file. The case p
21290 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20  Savepoint==NULL 
212a0 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20  occurs when .** 
212b0 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f  a ROLLBACK TO co
212c0 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64  mmand is invoked
212d0 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20   on a SAVEPOINT 
212e0 74 68 61 74 20 69 73 20 61 20 74 72 61 6e 73 61  that is a transa
212f0 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f  ction .** savepo
21300 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  int..**.** When 
21310 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f  pSavepoint is no
21320 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20  t NULL (meaning 
21330 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f  a non-transactio
21340 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a  n savepoint is .
21350 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  ** being rolled 
21360 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20  back), then the 
21370 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74  rollback consist
21380 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65  s of up to three
21390 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66   stages,.** perf
213a0 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64  ormed in the ord
213b0 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a  er specified:.**
213c0 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72  .**   * Pages ar
213d0 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  e played back fr
213e0 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
213f0 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20  nal starting at 
21400 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73  byte.**     offs
21410 65 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  et PagerSavepoin
21420 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f  t.iOffset and co
21430 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20  ntinuing to .** 
21440 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
21450 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f  nt.iHdrOffset, o
21460 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  r to the end of 
21470 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
21480 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20  .**     file if 
21490 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
214a0 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72  HdrOffset is zer
214b0 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  o..**.**   * If 
214c0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
214d0 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74  HdrOffset is not
214e0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65   zero, then page
214f0 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20  s are played.** 
21500 20 20 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e      back startin
21510 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  g from the journ
21520 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69  al header immedi
21530 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
21540 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
21550 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
21560 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
21570 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
21580 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a   file..**.**   *
21590 20 50 61 67 65 73 20 61 72 65 20 74 68 65 6e 20   Pages are then 
215a0 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
215b0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
215c0 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a   file, starting.
215d0 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68 65 20  **     with the 
215e0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
215f0 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69  SubRec and conti
21600 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64  nuing to the end
21610 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a   of.**     the j
21620 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
21630 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68  ** Throughout th
21640 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65  e rollback proce
21650 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20  ss, each time a 
21660 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62  page is rolled b
21670 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72  ack, the.** corr
21680 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
21690 20 73 65 74 20 69 6e 20 61 20 62 69 74 76 65 63   set in a bitvec
216a0 20 73 74 72 75 63 74 75 72 65 20 28 76 61 72 69   structure (vari
216b0 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68  able pDone in th
216c0 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
216d0 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73  ion below). This
216e0 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75   is used to ensu
216f0 72 65 20 74 68 61 74 20 61 20 70 61 67 65 20 69  re that a page i
21700 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64  s only.** rolled
21710 20 62 61 63 6b 20 74 68 65 20 66 69 72 73 74 20   back the first 
21720 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75  time it is encou
21730 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68 65 72  ntered in either
21740 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
21750 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73  If pSavepoint is
21760 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65   NULL, then page
21770 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65  s are only playe
21780 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
21790 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
217a0 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e  file. There is n
217b0 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74  o need for a bit
217c0 76 65 63 20 69 6e 20 74 68 69 73 20 63 61 73 65  vec in this case
217d0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65  ..**.** In eithe
217e0 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70  r case, before p
217f0 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65  layback commence
21800 73 20 74 68 65 20 50 61 67 65 72 2e 64 62 53 69  s the Pager.dbSi
21810 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69  ze variable.** i
21820 73 20 72 65 73 65 74 20 74 6f 20 74 68 65 20 76  s reset to the v
21830 61 6c 75 65 20 74 68 61 74 20 69 74 20 68 65 6c  alue that it hel
21840 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
21850 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  f the savepoint 
21860 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74  .** (or transact
21870 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69  ion). No page wi
21880 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72  th a page-number
21890 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
218a0 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70  is value.** is p
218b0 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f  layed back. If o
218c0 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ne is encountere
218d0 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73  d it is simply s
218e0 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  kipped..*/.stati
218f0 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62  c int pagerPlayb
21900 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67  ackSavepoint(Pag
21910 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65  er *pPager, Page
21920 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76  rSavepoint *pSav
21930 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73  epoint){.  i64 s
21940 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
21950 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65      /* Effective
21960 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69   size of the mai
21970 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
21980 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
21990 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
219a0 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20  f first segment 
219b0 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20  of main-journal 
219c0 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74  records */.  int
219d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
219e0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
219f0 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63  code */.  Bitvec
21a00 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20   *pDone = 0;    
21a10 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20     /* Bitvec to 
21a20 65 6e 73 75 72 65 20 70 61 67 65 73 20 70 6c 61  ensure pages pla
21a30 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e  yed back only on
21a40 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ce */..  assert(
21a50 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 21   pPager->eState!
21a60 3d 50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a  =PAGER_ERROR );.
21a70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
21a80 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45 52 5f  ->eState>=PAGER_
21a90 57 52 49 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b  WRITER_LOCKED );
21aa0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
21ab0 61 20 62 69 74 76 65 63 20 74 6f 20 75 73 65 20  a bitvec to use 
21ac0 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74  to store the set
21ad0 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64   of pages rolled
21ae0 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   back */.  if( p
21af0 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
21b00 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33   pDone = sqlite3
21b10 42 69 74 76 65 63 43 72 65 61 74 65 28 70 53 61  BitvecCreate(pSa
21b20 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b  vepoint->nOrig);
21b30 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20  .    if( !pDone 
21b40 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
21b50 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
21b60 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  T;.    }.  }..  
21b70 2f 2a 20 53 65 74 20 74 68 65 20 64 61 74 61 62  /* Set the datab
21b80 61 73 65 20 73 69 7a 65 20 62 61 63 6b 20 74 6f  ase size back to
21b90 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 77 61   the value it wa
21ba0 73 20 62 65 66 6f 72 65 20 74 68 65 20 73 61 76  s before the sav
21bb0 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69  epoint .  ** bei
21bc0 6e 67 20 72 65 76 65 72 74 65 64 20 77 61 73 20  ng reverted was 
21bd0 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  opened..  */.  p
21be0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
21bf0 70 53 61 76 65 70 6f 69 6e 74 20 3f 20 70 53 61  pSavepoint ? pSa
21c00 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a  vepoint->nOrig :
21c10 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
21c20 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63  ize;.  pPager->c
21c30 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
21c40 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
21c50 65 3b 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65  e;..  if( !pSave
21c60 70 6f 69 6e 74 20 26 26 20 70 61 67 65 72 55 73  point && pagerUs
21c70 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
21c80 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
21c90 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67  RollbackWal(pPag
21ca0 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  er);.  }..  /* U
21cb0 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  se pPager->journ
21cc0 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66 66  alOff as the eff
21cd0 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74  ective size of t
21ce0 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
21cf0 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20  .  ** journal.  
21d00 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20  The actual file 
21d10 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20  might be larger 
21d20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a  than this in.  *
21d30 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  * PAGER_JOURNALM
21d40 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20  ODE_TRUNCATE or 
21d50 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
21d60 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74 20  E_PERSIST.  But 
21d70 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61  anything.  ** pa
21d80 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  st pPager->journ
21d90 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d  alOff is off-lim
21da0 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a  its to us..  */.
21db0 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e    szJ = pPager->
21dc0 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73  journalOff;.  as
21dd0 73 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61  sert( pagerUseWa
21de0 6c 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20  l(pPager)==0 || 
21df0 73 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  szJ==0 );..  /* 
21e00 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67  Begin by rolling
21e10 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72   back records fr
21e20 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
21e30 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a  nal starting at.
21e40 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f    ** PagerSavepo
21e50 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20  int.iOffset and 
21e60 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68  continuing to th
21e70 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
21e80 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72  eader..  ** Ther
21e90 65 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72  e might be recor
21ea0 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  ds in the main j
21eb0 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65  ournal that have
21ec0 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20   a page number. 
21ed0 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e   ** greater than
21ee0 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74   the current dat
21ef0 61 62 61 73 65 20 73 69 7a 65 20 28 70 50 61 67  abase size (pPag
21f00 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20  er->dbSize) but 
21f10 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20  those.  ** will 
21f20 62 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d  be skipped autom
21f30 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73  atically.  Pages
21f40 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 70 44   are added to pD
21f50 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a  one as they.  **
21f60 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b   are played back
21f70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
21f80 76 65 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65  vepoint && !page
21f90 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
21fa0 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d  ){.    iHdrOff =
21fb0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64   pSavepoint->iHd
21fc0 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70  rOffset ? pSavep
21fd0 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74  oint->iHdrOffset
21fe0 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67   : szJ;.    pPag
21ff0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
22000 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66   pSavepoint->iOf
22010 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28  fset;.    while(
22020 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
22030 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
22040 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a  lOff<iHdrOff ){.
22050 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
22060 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
22070 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  ge(pPager, &pPag
22080 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
22090 70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20  pDone, 1, 1);.  
220a0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
220b0 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
220c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
220d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
220e0 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ff = 0;.  }..  /
220f0 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69  * Continue rolli
22100 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20  ng back records 
22110 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
22120 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
22130 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72   at.  ** the fir
22140 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
22150 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69  r seen and conti
22160 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20  nuing until the 
22170 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20  effective end.  
22180 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ** of the main j
22190 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f  ournal file.  Co
221a0 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f  ntinue to skip o
221b0 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65  ut-of-range page
221c0 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69  s and.  ** conti
221d0 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 73  nue adding pages
221e0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20   rolled back to 
221f0 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68  pDone..  */.  wh
22200 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
22210 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  OK && pPager->jo
22220 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a  urnalOff<szJ ){.
22230 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20      u32 ii;     
22240 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
22250 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33  ounter */.    u3
22260 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20  2 nJRec = 0;    
22270 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f   /* Number of Jo
22280 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f  urnal Records */
22290 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a  .    u32 dummy;.
222a0 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
222b0 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
222c0 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20  0, szJ, &nJRec, 
222d0 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73  &dummy);.    ass
222e0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
222f0 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a  DONE );..    /*.
22300 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67      ** The "pPag
22310 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
22320 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
22330 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
22340 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a  ournalOff".    *
22350 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65  * test is relate
22360 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36  d to ticket #256
22370 35 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63  5.  See the disc
22380 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20  ussion in the.  
22390 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62    ** pager_playb
223a0 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  ack() function f
223b0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
223c0 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  formation..    *
223d0 2f 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d  /.    if( nJRec=
223e0 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50 61 67  =0 .     && pPag
223f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
22400 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
22410 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
22420 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b  ournalOff.    ){
22430 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28  .      nJRec = (
22440 75 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67  u32)((szJ - pPag
22450 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f  er->journalOff)/
22460 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
22470 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ager));.    }.  
22480 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d    for(ii=0; rc==
22490 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c  SQLITE_OK && ii<
224a0 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65 72 2d  nJRec && pPager-
224b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b  >journalOff<szJ;
224c0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63   ii++){.      rc
224d0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
224e0 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
224f0 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r, &pPager->jour
22500 6e 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31  nalOff, pDone, 1
22510 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
22520 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
22530 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20  TE_DONE );.  }. 
22540 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
22550 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
22560 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 3d 73 7a  ->journalOff>=sz
22570 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c  J );..  /* Final
22580 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61  ly,  rollback pa
22590 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62  ges from the sub
225a0 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20  -journal.  Page 
225b0 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70  that were.  ** p
225c0 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64  reviously rolled
225d0 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65   back out of the
225e0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61   main journal (a
225f0 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20  nd are hence in 
22600 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c  pDone).  ** will
22610 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75   be skipped.  Ou
22620 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73  t-of-range pages
22630 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65   are also skippe
22640 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53  d..  */.  if( pS
22650 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
22660 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20  u32 ii;         
22670 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
22680 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66  er */.    i64 of
22690 66 73 65 74 20 3d 20 28 69 36 34 29 70 53 61 76  fset = (i64)pSav
226a0 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a  epoint->iSubRec*
226b0 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
226c0 69 7a 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  ize);..    if( p
226d0 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
226e0 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r) ){.      rc =
226f0 20 73 71 6c 69 74 65 33 57 61 6c 53 61 76 65 70   sqlite3WalSavep
22700 6f 69 6e 74 55 6e 64 6f 28 70 50 61 67 65 72 2d  ointUndo(pPager-
22710 3e 70 57 61 6c 2c 20 70 53 61 76 65 70 6f 69 6e  >pWal, pSavepoin
22720 74 2d 3e 61 57 61 6c 44 61 74 61 29 3b 0a 20 20  t->aWalData);.  
22730 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 70    }.    for(ii=p
22740 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52  Savepoint->iSubR
22750 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ec; rc==SQLITE_O
22760 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e  K && ii<pPager->
22770 6e 53 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a  nSubRec; ii++){.
22780 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 66        assert( of
22790 66 73 65 74 3d 3d 28 69 36 34 29 69 69 2a 28 34  fset==(i64)ii*(4
227a0 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
227b0 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  e) );.      rc =
227c0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
227d0 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
227e0 20 26 6f 66 66 73 65 74 2c 20 70 44 6f 6e 65 2c   &offset, pDone,
227f0 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 1);.    }.  
22800 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
22810 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
22820 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  ..  sqlite3Bitve
22830 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b  cDestroy(pDone);
22840 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
22850 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
22860 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
22870 20 73 7a 4a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   szJ;.  }..  ret
22880 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22890 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   Change the maxi
228a0 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  mum number of in
228b0 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68  -memory pages th
228c0 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 0a 2a  at are allowed.*
228d0 2a 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  * before attempt
228e0 69 6e 67 20 74 6f 20 72 65 63 79 63 6c 65 20 63  ing to recycle c
228f0 6c 65 61 6e 20 61 6e 64 20 75 6e 75 73 65 64 20  lean and unused 
22900 70 61 67 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  pages..*/.void s
22910 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
22920 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  chesize(Pager *p
22930 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
22940 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  e){.  sqlite3Pca
22950 63 68 65 53 65 74 43 61 63 68 65 73 69 7a 65 28  cheSetCachesize(
22960 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
22970 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a   mxPage);.}../*.
22980 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
22990 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
229a0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
229b0 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
229c0 0a 2a 2a 20 62 65 66 6f 72 65 20 61 74 74 65 6d  .** before attem
229d0 70 74 69 6e 67 20 74 6f 20 73 70 69 6c 6c 20 70  pting to spill p
229e0 61 67 65 73 20 74 6f 20 6a 6f 75 72 6e 61 6c 2e  ages to journal.
229f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
22a00 61 67 65 72 53 65 74 53 70 69 6c 6c 73 69 7a 65  agerSetSpillsize
22a10 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
22a20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 72  int mxPage){.  r
22a30 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61  eturn sqlite3Pca
22a40 63 68 65 53 65 74 53 70 69 6c 6c 73 69 7a 65 28  cheSetSpillsize(
22a50 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
22a60 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a   mxPage);.}../*.
22a70 2a 2a 20 49 6e 76 6f 6b 65 20 53 51 4c 49 54 45  ** Invoke SQLITE
22a80 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45  _FCNTL_MMAP_SIZE
22a90 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 75   based on the cu
22aa0 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 73  rrent value of s
22ab0 7a 4d 6d 61 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  zMmap..*/.static
22ac0 20 76 6f 69 64 20 70 61 67 65 72 46 69 78 4d 61   void pagerFixMa
22ad0 70 6c 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50  plimit(Pager *pP
22ae0 61 67 65 72 29 7b 0a 23 69 66 20 53 51 4c 49 54  ager){.#if SQLIT
22af0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
22b00 30 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  0.  sqlite3_file
22b10 20 2a 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 66   *fd = pPager->f
22b20 64 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  d;.  if( isOpen(
22b30 66 64 29 20 26 26 20 66 64 2d 3e 70 4d 65 74 68  fd) && fd->pMeth
22b40 6f 64 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 33  ods->iVersion>=3
22b50 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
22b60 69 6e 74 36 34 20 73 7a 3b 0a 20 20 20 20 73 7a  int64 sz;.    sz
22b70 20 3d 20 70 50 61 67 65 72 2d 3e 73 7a 4d 6d 61   = pPager->szMma
22b80 70 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 62  p;.    pPager->b
22b90 55 73 65 46 65 74 63 68 20 3d 20 28 73 7a 3e 30  UseFetch = (sz>0
22ba0 29 3b 0a 20 20 20 20 73 65 74 47 65 74 74 65 72  );.    setGetter
22bb0 4d 65 74 68 6f 64 28 70 50 61 67 65 72 29 3b 0a  Method(pPager);.
22bc0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c      sqlite3OsFil
22bd0 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61  eControlHint(pPa
22be0 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f  ger->fd, SQLITE_
22bf0 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c  FCNTL_MMAP_SIZE,
22c00 20 26 73 7a 29 3b 0a 20 20 7d 0a 23 65 6e 64 69   &sz);.  }.#endi
22c10 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  f.}../*.** Chang
22c20 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69  e the maximum si
22c30 7a 65 20 6f 66 20 61 6e 79 20 6d 65 6d 6f 72 79  ze of any memory
22c40 20 6d 61 70 70 69 6e 67 20 6d 61 64 65 20 6f 66   mapping made of
22c50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
22c60 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  le..*/.void sqli
22c70 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c  te3PagerSetMmapL
22c80 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  imit(Pager *pPag
22c90 65 72 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  er, sqlite3_int6
22ca0 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 70 50 61  4 szMmap){.  pPa
22cb0 67 65 72 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 7a  ger->szMmap = sz
22cc0 4d 6d 61 70 3b 0a 20 20 70 61 67 65 72 46 69 78  Mmap;.  pagerFix
22cd0 4d 61 70 6c 69 6d 69 74 28 70 50 61 67 65 72 29  Maplimit(pPager)
22ce0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
22cf0 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61  as much memory a
22d00 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20  s possible from 
22d10 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 76 6f  the pager..*/.vo
22d20 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
22d30 68 72 69 6e 6b 28 50 61 67 65 72 20 2a 70 50 61  hrink(Pager *pPa
22d40 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  ger){.  sqlite3P
22d50 63 61 63 68 65 53 68 72 69 6e 6b 28 70 50 61 67  cacheShrink(pPag
22d60 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a  er->pPCache);.}.
22d70 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 73 65  ./*.** Adjust se
22d80 74 74 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61  ttings of the pa
22d90 67 65 72 20 74 6f 20 74 68 6f 73 65 20 73 70 65  ger to those spe
22da0 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 70 67  cified in the pg
22db0 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e  Flags parameter.
22dc0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 6c 65 76 65  .**.** The "leve
22dd0 6c 22 20 69 6e 20 70 67 46 6c 61 67 73 20 26 20  l" in pgFlags & 
22de0 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
22df0 53 5f 4d 41 53 4b 20 73 65 74 73 20 74 68 65 20  S_MASK sets the 
22e00 72 6f 62 75 73 74 6e 65 73 73 0a 2a 2a 20 6f 66  robustness.** of
22e10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
22e20 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
22e30 53 20 63 72 61 73 68 65 73 20 6f 72 20 70 6f 77  S crashes or pow
22e40 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 0a 2a  er failures by.*
22e50 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e  * changing the n
22e60 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29  umber of syncs()
22e70 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74  s when writing t
22e80 68 65 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20  he journals..** 
22e90 54 68 65 72 65 20 61 72 65 20 66 6f 75 72 20 6c  There are four l
22ea0 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  evels:.**.**    
22eb0 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65  OFF       sqlite
22ec0 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76  3OsSync() is nev
22ed0 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73  er called.  This
22ee0 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a   is the default.
22ef0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22f00 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  for temporary an
22f10 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  d transient file
22f20 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d  s..**.**    NORM
22f30 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  AL    The journa
22f40 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65  l is synced once
22f50 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
22f60 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
22f70 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
22f80 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e  base.  This is n
22f90 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65  ormally adequate
22fa0 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74   protection, but
22fb0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
22fc0 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63   it is theoretic
22fd0 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74  ally possible, t
22fe0 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b  hough very unlik
22ff0 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ely,.**         
23000 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f       that an ino
23010 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61  pertune power fa
23020 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76  ilure could leav
23030 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  e the journal.**
23040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
23050 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77   a state which w
23060 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67  ould cause damag
23070 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
23080 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
23090 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c    when it is rol
230a0 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
230b0 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65     FULL      The
230c0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
230d0 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20  ed twice before 
230e0 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
230f0 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
23100 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69      database (wi
23110 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  th some addition
23120 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  al information -
23130 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
23140 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
23150 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
23160 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72  eader - being wr
23170 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e  itten in between
23180 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20   the two.**     
23190 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e           syncs).
231a0 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74    If we assume t
231b0 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a  hat writing a.**
231c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
231d0 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
231e0 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e   is atomic, then
231f0 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69   this mode provi
23200 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  des.**          
23210 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68      assurance th
23220 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  at the journal w
23230 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75  ill not be corru
23240 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20  pted to the.**  
23250 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e              poin
23260 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d  t of causing dam
23270 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
23280 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ase during rollb
23290 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 58  ack..**.**    EX
232a0 54 52 41 20 20 20 20 20 54 68 69 73 20 69 73 20  TRA     This is 
232b0 6c 69 6b 65 20 46 55 4c 4c 20 65 78 63 65 70 74  like FULL except
232c0 20 74 68 61 74 20 69 73 20 61 6c 73 6f 20 73 79   that is also sy
232d0 6e 63 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  ncs the director
232e0 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  y.**            
232f0 20 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20    that contains 
23300 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
23310 72 6e 61 6c 20 61 66 74 65 72 20 74 68 65 20 72  rnal after the r
23320 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 20 20 20 20 20  ollback.**      
23330 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20          journal 
23340 69 73 20 75 6e 6c 69 6e 6b 65 64 2e 0a 2a 2a 0a  is unlinked..**.
23350 2a 2a 20 54 68 65 20 61 62 6f 76 65 20 69 73 20  ** The above is 
23360 66 6f 72 20 61 20 72 6f 6c 6c 62 61 63 6b 2d 6a  for a rollback-j
23370 6f 75 72 6e 61 6c 20 6d 6f 64 65 2e 20 20 46 6f  ournal mode.  Fo
23380 72 20 57 41 4c 20 6d 6f 64 65 2c 20 4f 46 46 20  r WAL mode, OFF 
23390 63 6f 6e 74 69 6e 75 65 73 0a 2a 2a 20 74 6f 20  continues.** to 
233a0 6d 65 61 6e 20 74 68 61 74 20 6e 6f 20 73 79 6e  mean that no syn
233b0 63 73 20 65 76 65 72 20 6f 63 63 75 72 2e 20 20  cs ever occur.  
233c0 4e 4f 52 4d 41 4c 20 6d 65 61 6e 73 20 74 68 61  NORMAL means tha
233d0 74 20 74 68 65 20 57 41 4c 20 69 73 20 73 79 6e  t the WAL is syn
233e0 63 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20  ced.** prior to 
233f0 74 68 65 20 73 74 61 72 74 20 6f 66 20 63 68 65  the start of che
23400 63 6b 70 6f 69 6e 74 20 61 6e 64 20 74 68 61 74  ckpoint and that
23410 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23420 6c 65 20 69 73 20 73 79 6e 63 65 64 0a 2a 2a 20  le is synced.** 
23430 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
23440 6e 20 6f 66 20 74 68 65 20 63 68 65 63 6b 70 6f  n of the checkpo
23450 69 6e 74 20 69 66 20 74 68 65 20 65 6e 74 69 72  int if the entir
23460 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
23470 20 57 41 4c 0a 2a 2a 20 77 61 73 20 77 72 69 74   WAL.** was writ
23480 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ten back into th
23490 65 20 64 61 74 61 62 61 73 65 2e 20 20 42 75 74  e database.  But
234a0 20 6e 6f 20 73 79 6e 63 20 6f 70 65 72 61 74 69   no sync operati
234b0 6f 6e 73 20 6f 63 63 75 72 20 66 6f 72 0a 2a 2a  ons occur for.**
234c0 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 63 6f 6d   an ordinary com
234d0 6d 69 74 20 69 6e 20 4e 4f 52 4d 41 4c 20 6d 6f  mit in NORMAL mo
234e0 64 65 20 77 69 74 68 20 57 41 4c 2e 20 20 46 55  de with WAL.  FU
234f0 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  LL means that th
23500 65 20 57 41 4c 0a 2a 2a 20 66 69 6c 65 20 69 73  e WAL.** file is
23510 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f 77 69 6e   synced followin
23520 67 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 6f 70  g each commit op
23530 65 72 61 74 69 6f 6e 2c 20 69 6e 20 61 64 64 69  eration, in addi
23540 74 69 6f 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 73  tion to the.** s
23550 79 6e 63 73 20 61 73 73 6f 63 69 61 74 65 64 20  yncs associated 
23560 77 69 74 68 20 4e 4f 52 4d 41 4c 2e 20 20 54 68  with NORMAL.  Th
23570 65 72 65 20 69 73 20 6e 6f 20 64 69 66 66 65 72  ere is no differ
23580 65 6e 63 65 20 62 65 74 77 65 65 6e 20 46 55 4c  ence between FUL
23590 4c 0a 2a 2a 20 61 6e 64 20 45 58 54 52 41 20 66  L.** and EXTRA f
235a0 6f 72 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a  or WAL mode..**.
235b0 2a 2a 20 44 6f 20 6e 6f 74 20 63 6f 6e 66 75 73  ** Do not confus
235c0 65 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55  e synchronous=FU
235d0 4c 4c 20 77 69 74 68 20 53 51 4c 49 54 45 5f 53  LL with SQLITE_S
235e0 59 4e 43 5f 46 55 4c 4c 2e 20 20 54 68 65 0a 2a  YNC_FULL.  The.*
235f0 2a 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  * SQLITE_SYNC_FU
23600 4c 4c 20 6d 61 63 72 6f 20 6d 65 61 6e 73 20 74  LL macro means t
23610 6f 20 75 73 65 20 74 68 65 20 4d 61 63 4f 53 58  o use the MacOSX
23620 2d 73 74 79 6c 65 20 66 75 6c 6c 2d 66 73 79 6e  -style full-fsyn
23630 63 0a 2a 2a 20 75 73 69 6e 67 20 66 63 6e 74 6c  c.** using fcntl
23640 28 46 5f 46 55 4c 4c 46 53 59 4e 43 29 2e 20 20  (F_FULLFSYNC).  
23650 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
23660 41 4c 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 61  AL means to do a
23670 6e 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 66 73  n.** ordinary fs
23680 79 6e 63 28 29 20 63 61 6c 6c 2e 20 20 54 68 65  ync() call.  The
23690 72 65 20 69 73 20 6e 6f 20 64 69 66 66 65 72 65  re is no differe
236a0 6e 63 65 20 62 65 74 77 65 65 6e 20 53 51 4c 49  nce between SQLI
236b0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 2a 2a 20  TE_SYNC_FULL.** 
236c0 61 6e 64 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  and SQLITE_SYNC_
236d0 4e 4f 52 4d 41 4c 20 6f 6e 20 70 6c 61 74 66 6f  NORMAL on platfo
236e0 72 6d 73 20 6f 74 68 65 72 20 74 68 61 6e 20 4d  rms other than M
236f0 61 63 4f 53 58 2e 20 20 42 75 74 20 74 68 65 0a  acOSX.  But the.
23700 2a 2a 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46  ** synchronous=F
23710 55 4c 4c 20 76 65 72 73 75 73 20 73 79 6e 63 68  ULL versus synch
23720 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20 73 65  ronous=NORMAL se
23730 74 74 69 6e 67 20 64 65 74 65 72 6d 69 6e 65 73  tting determines
23740 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 78 53 79   when.** the xSy
23750 6e 63 20 70 72 69 6d 69 74 69 76 65 20 69 73 20  nc primitive is 
23760 63 61 6c 6c 65 64 20 61 6e 64 20 69 73 20 72 65  called and is re
23770 6c 65 76 61 6e 74 20 74 6f 20 61 6c 6c 20 70 6c  levant to all pl
23780 61 74 66 6f 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 4e  atforms..**.** N
23790 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73  umeric values as
237a0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
237b0 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f  ese states are O
237c0 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c  FF==1, NORMAL=2,
237d0 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a  .** and FULL=3..
237e0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
237f0 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
23800 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65  GMAS.void sqlite
23810 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28 0a  3PagerSetFlags(.
23820 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
23830 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
23840 61 67 65 72 20 74 6f 20 73 65 74 20 73 61 66 65  ager to set safe
23850 74 79 20 6c 65 76 65 6c 20 66 6f 72 20 2a 2f 0a  ty level for */.
23860 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61    unsigned pgFla
23870 67 73 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f  gs      /* Vario
23880 75 73 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  us flags */.){. 
23890 20 75 6e 73 69 67 6e 65 64 20 6c 65 76 65 6c 20   unsigned level 
238a0 3d 20 70 67 46 6c 61 67 73 20 26 20 50 41 47 45  = pgFlags & PAGE
238b0 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4d 41  R_SYNCHRONOUS_MA
238c0 53 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  SK;.  if( pPager
238d0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
238e0 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
238f0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
23900 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 30 3b 0a  ->fullSync = 0;.
23910 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 74 72      pPager->extr
23920 61 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c  aSync = 0;.  }el
23930 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
23940 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d  noSync =  level=
23950 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f  =PAGER_SYNCHRONO
23960 55 53 5f 4f 46 46 20 3f 31 3a 30 3b 0a 20 20 20  US_OFF ?1:0;.   
23970 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
23980 63 20 3d 20 6c 65 76 65 6c 3e 3d 50 41 47 45 52  c = level>=PAGER
23990 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 46 55 4c  _SYNCHRONOUS_FUL
239a0 4c 20 3f 31 3a 30 3b 0a 20 20 20 20 70 50 61 67  L ?1:0;.    pPag
239b0 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 20 3d 20  er->extraSync = 
239c0 6c 65 76 65 6c 3d 3d 50 41 47 45 52 5f 53 59 4e  level==PAGER_SYN
239d0 43 48 52 4f 4e 4f 55 53 5f 45 58 54 52 41 20 3f  CHRONOUS_EXTRA ?
239e0 31 3a 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  1:0;.  }.  if( p
239f0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
23a00 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  .    pPager->syn
23a10 63 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 65  cFlags = 0;.  }e
23a20 6c 73 65 20 69 66 28 20 70 67 46 6c 61 67 73 20  lse if( pgFlags 
23a30 26 20 50 41 47 45 52 5f 46 55 4c 4c 46 53 59 4e  & PAGER_FULLFSYN
23a40 43 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  C ){.    pPager-
23a50 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  >syncFlags = SQL
23a60 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 20  ITE_SYNC_FULL;. 
23a70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
23a80 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20  er->syncFlags = 
23a90 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
23aa0 41 4c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  AL;.  }.  pPager
23ab0 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73 20 3d  ->walSyncFlags =
23ac0 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c   (pPager->syncFl
23ad0 61 67 73 3c 3c 32 29 3b 0a 20 20 69 66 28 20 70  ags<<2);.  if( p
23ae0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
23af0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77  ){.    pPager->w
23b00 61 6c 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20 70  alSyncFlags |= p
23b10 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
23b20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 67 46  ;.  }.  if( (pgF
23b30 6c 61 67 73 20 26 20 50 41 47 45 52 5f 43 4b 50  lags & PAGER_CKP
23b40 54 5f 46 55 4c 4c 46 53 59 4e 43 29 20 26 26 20  T_FULLFSYNC) && 
23b50 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
23b60 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77  ){.    pPager->w
23b70 61 6c 53 79 6e 63 46 6c 61 67 73 20 7c 3d 20 28  alSyncFlags |= (
23b80 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
23b90 3c 3c 32 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  <<2);.  }.  if( 
23ba0 70 67 46 6c 61 67 73 20 26 20 50 41 47 45 52 5f  pgFlags & PAGER_
23bb0 43 41 43 48 45 53 50 49 4c 4c 20 29 7b 0a 20 20  CACHESPILL ){.  
23bc0 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
23bd0 70 69 6c 6c 20 26 3d 20 7e 53 50 49 4c 4c 46 4c  pill &= ~SPILLFL
23be0 41 47 5f 4f 46 46 3b 0a 20 20 7d 65 6c 73 65 7b  AG_OFF;.  }else{
23bf0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
23c00 6f 74 53 70 69 6c 6c 20 7c 3d 20 53 50 49 4c 4c  otSpill |= SPILL
23c10 46 4c 41 47 5f 4f 46 46 3b 0a 20 20 7d 0a 7d 0a  FLAG_OFF;.  }.}.
23c20 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
23c30 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
23c40 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
23c50 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65  ncremented whene
23c60 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a  ver the library.
23c70 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f  ** attempts to o
23c80 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
23c90 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f  file.  This info
23ca0 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
23cb0 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
23cc0 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
23cd0 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  .  .*/.#ifdef SQ
23ce0 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
23cf0 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
23d00 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
23d10 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74  ../*.** Open a t
23d20 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a  emporary file..*
23d30 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66  *.** Write the f
23d40 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
23d50 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75  nto *pFile. Retu
23d60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
23d70 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73  success .** or s
23d80 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
23d90 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e  code if we fail.
23da0 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74   The OS will aut
23db0 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64  omatically .** d
23dc0 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72  elete the tempor
23dd0 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74  ary file when it
23de0 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
23df0 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 73 73  * The flags pass
23e00 65 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61  ed to the VFS la
23e10 79 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c  yer xOpen() call
23e20 20 61 72 65 20 74 68 6f 73 65 20 73 70 65 63 69   are those speci
23e30 66 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d  fied.** by param
23e40 65 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52  eter vfsFlags OR
23e50 65 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  ed with the foll
23e60 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
23e70 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
23e80 44 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51  DWRITE.**     SQ
23e90 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
23ea0 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  .**     SQLITE_O
23eb0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a  PEN_EXCLUSIVE.**
23ec0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
23ed0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a  _DELETEONCLOSE.*
23ee0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
23ef0 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61  erOpentemp(.  Pa
23f00 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
23f10 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
23f20 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c   object */.  sql
23f30 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
23f40 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  ,  /* Write the 
23f50 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
23f60 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  here */.  int vf
23f70 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
23f80 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
23f90 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56  through to the V
23fa0 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  FS */.){.  int r
23fb0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
23fc0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
23fd0 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
23fe0 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33  E_TEST.  sqlite3
23ff0 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b  _opentemp_count+
24000 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20  +;  /* Used for 
24010 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
24020 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e  ysis only */.#en
24030 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20  dif..  vfsFlags 
24040 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  |=  SQLITE_OPEN_
24050 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
24060 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
24070 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c  .            SQL
24080 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
24090 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  VE | SQLITE_OPEN
240a0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a  _DELETEONCLOSE;.
240b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
240c0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66  Open(pPager->pVf
240d0 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73  s, 0, pFile, vfs
240e0 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73  Flags, 0);.  ass
240f0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
24100 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69  OK || isOpen(pFi
24110 6c 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  le) );.  return 
24120 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rc;.}../*.** Set
24130 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
24140 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  r function..**.*
24150 2a 20 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f  * The pager invo
24160 6b 65 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e  kes the busy-han
24170 64 6c 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f  dler if sqlite3O
24180 73 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20  sLock() returns 
24190 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
241a0 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75  when trying to u
241b0 70 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c  pgrade from no-l
241c0 6f 63 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20  ock to a SHARED 
241d0 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e  lock,.** or when
241e0 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61   trying to upgra
241f0 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56  de from a RESERV
24200 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58  ED lock to an EX
24210 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b  CLUSIVE .** lock
24220 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20  . It does *not* 
24230 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
24240 68 61 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67  handler when upg
24250 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53  rading from.** S
24260 48 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45  HARED to RESERVE
24270 44 2c 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61  D, or when upgra
24280 64 69 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44  ding from SHARED
24290 20 74 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   to EXCLUSIVE.**
242a0 20 28 77 68 69 63 68 20 6f 63 63 75 72 73 20 64   (which occurs d
242b0 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61  uring hot-journa
242c0 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d  l rollback). Sum
242d0 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72  mary:.**.**   Tr
242e0 61 6e 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20  ansition        
242f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24300 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48  | Invokes xBusyH
24310 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d  andler.**   ----
24320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24350 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43  ----.**   NO_LOC
24360 4b 20 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45  K       -> SHARE
24370 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65  D_LOCK      | Ye
24380 73 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f  s.**   SHARED_LO
24390 43 4b 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44  CK   -> RESERVED
243a0 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a  _LOCK    | No.**
243b0 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20     SHARED_LOCK  
243c0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   -> EXCLUSIVE_LO
243d0 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52  CK   | No.**   R
243e0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20  ESERVED_LOCK -> 
243f0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20  EXCLUSIVE_LOCK  
24400 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20   | Yes.**.** If 
24410 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
24420 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e   callback return
24430 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20  s non-zero, the 
24440 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72  lock is .** retr
24450 69 65 64 2e 20 49 66 20 69 74 20 72 65 74 75 72  ied. If it retur
24460 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  ns zero, then th
24470 65 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72  e SQLITE_BUSY er
24480 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ror is.** return
24490 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
244a0 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 41 50   of the pager AP
244b0 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  I function..*/.v
244c0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
244d0 53 65 74 42 75 73 79 48 61 6e 64 6c 65 72 28 0a  SetBusyHandler(.
244e0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
244f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24500 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
24510 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
24520 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28  (*xBusyHandler)(
24530 76 6f 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20  void *),        
24540 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
24550 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy-handler func
24560 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  tion */.  void *
24570 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
24580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24590 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61  * Argument to pa
245a0 73 73 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c  ss to xBusyHandl
245b0 65 72 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20  er */.){.  void 
245c0 2a 2a 61 70 3b 0a 20 20 70 50 61 67 65 72 2d 3e  **ap;.  pPager->
245d0 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78  xBusyHandler = x
245e0 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70  BusyHandler;.  p
245f0 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
24600 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79 48 61  lerArg = pBusyHa
24610 6e 64 6c 65 72 41 72 67 3b 0a 20 20 61 70 20 3d  ndlerArg;.  ap =
24620 20 28 76 6f 69 64 20 2a 2a 29 26 70 50 61 67 65   (void **)&pPage
24630 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 3b  r->xBusyHandler;
24640 0a 20 20 61 73 73 65 72 74 28 20 28 28 69 6e 74  .  assert( ((int
24650 28 2a 29 28 76 6f 69 64 20 2a 29 29 28 61 70 5b  (*)(void *))(ap[
24660 30 5d 29 29 3d 3d 78 42 75 73 79 48 61 6e 64 6c  0]))==xBusyHandl
24670 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
24680 61 70 5b 31 5d 3d 3d 70 42 75 73 79 48 61 6e 64  ap[1]==pBusyHand
24690 6c 65 72 41 72 67 20 29 3b 0a 20 20 73 71 6c 69  lerArg );.  sqli
246a0 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
246b0 48 69 6e 74 28 70 50 61 67 65 72 2d 3e 66 64 2c  Hint(pPager->fd,
246c0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 42 55   SQLITE_FCNTL_BU
246d0 53 59 48 41 4e 44 4c 45 52 2c 20 28 76 6f 69 64  SYHANDLER, (void
246e0 20 2a 29 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   *)ap);.}../*.**
246f0 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   Change the page
24700 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68   size used by th
24710 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20  e Pager object. 
24720 54 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a  The new page siz
24730 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20  e .** is passed 
24740 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a  in *pPageSize..*
24750 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
24760 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f  r is in the erro
24770 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  r state when thi
24780 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
24790 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61  lled, it.** is a
247a0 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75   no-op. The valu
247b0 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
247c0 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72  e error state er
247d0 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a  ror code (i.e. .
247e0 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  ** one of SQLITE
247f0 5f 49 4f 45 52 52 2c 20 61 6e 20 53 51 4c 49 54  _IOERR, an SQLIT
24800 45 5f 49 4f 45 52 52 5f 78 78 78 20 73 75 62 2d  E_IOERR_xxx sub-
24810 63 6f 64 65 20 6f 72 20 53 51 4c 49 54 45 5f 46  code or SQLITE_F
24820 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ULL)..**.** Othe
24830 72 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66  rwise, if all of
24840 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
24850 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
24860 20 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 20   * the new page 
24870 73 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a  size (value of *
24880 70 50 61 67 65 53 69 7a 65 29 20 69 73 20 76 61  pPageSize) is va
24890 6c 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a  lid (a power .**
248a0 20 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77       of two betw
248b0 65 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49  een 512 and SQLI
248c0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
248d0 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e  , inclusive), an
248e0 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72  d.**.**   * ther
248f0 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
24900 64 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65  ding page refere
24910 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  nces, and.**.** 
24920 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65    * the database
24930 20 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61   is either not a
24940 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
24950 62 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a  base or it is.**
24960 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72       an in-memor
24970 79 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  y database that 
24980 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73  currently consis
24990 74 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73  ts of zero pages
249a0 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ..**.** then the
249b0 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61   pager object pa
249c0 67 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74  ge size is set t
249d0 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a  o *pPageSize..**
249e0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
249f0 73 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c  size is changed,
24a00 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
24a10 69 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33  ion uses sqlite3
24a20 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a  PagerMalloc() .*
24a30 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65  * to obtain a ne
24a40 77 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  w Pager.pTmpSpac
24a50 65 20 62 75 66 66 65 72 2e 20 49 66 20 74 68 69  e buffer. If thi
24a60 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74  s allocation att
24a70 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20  empt .** fails, 
24a80 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
24a90 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
24aa0 20 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69   page size remai
24ab0 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a  ns unchanged. .*
24ac0 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63  * In all other c
24ad0 61 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ases, SQLITE_OK 
24ae0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
24af0 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73  ** If the page s
24b00 69 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67  ize is not chang
24b10 65 64 2c 20 65 69 74 68 65 72 20 62 65 63 61 75  ed, either becau
24b20 73 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e  se one of the en
24b30 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64  umerated.** cond
24b40 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20  itions above is 
24b50 6e 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70 61  not true, the pa
24b60 67 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72  ger was in error
24b70 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
24b80 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  .** function was
24b90 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61   called, or beca
24ba0 75 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  use the memory a
24bb0 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70  llocation attemp
24bc0 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68  t failed, .** th
24bd0 65 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73  en *pPageSize is
24be0 20 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c   set to the old,
24bf0 20 72 65 74 61 69 6e 65 64 20 70 61 67 65 20 73   retained page s
24c00 69 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ize before retur
24c10 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ning..*/.int sql
24c20 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
24c30 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
24c40 65 72 2c 20 75 33 32 20 2a 70 50 61 67 65 53 69  er, u32 *pPageSi
24c50 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
24c60 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
24c70 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49  LITE_OK;..  /* I
24c80 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
24c90 65 20 74 6f 20 64 6f 20 61 20 66 75 6c 6c 20 61  e to do a full a
24ca0 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
24cb0 65 28 29 20 68 65 72 65 2c 20 61 73 20 74 68 69  e() here, as thi
24cc0 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
24cd0 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72  may be called fr
24ce0 6f 6d 20 77 69 74 68 69 6e 20 50 61 67 65 72 4f  om within PagerO
24cf0 70 65 6e 28 29 2c 20 62 65 66 6f 72 65 20 74 68  pen(), before th
24d00 65 20 73 74 61 74 65 0a 20 20 2a 2a 20 6f 66 20  e state.  ** of 
24d10 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
24d20 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 63   is internally c
24d30 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2a 0a  onsistent..  **.
24d40 20 20 2a 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e    ** At one poin
24d50 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  t this function 
24d60 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f  returned an erro
24d70 72 20 69 66 20 74 68 65 20 70 61 67 65 72 20 77  r if the pager w
24d80 61 73 20 69 6e 20 0a 20 20 2a 2a 20 50 41 47 45  as in .  ** PAGE
24d90 52 5f 45 52 52 4f 52 20 73 74 61 74 65 2e 20 42  R_ERROR state. B
24da0 75 74 20 73 69 6e 63 65 20 50 41 47 45 52 5f 45  ut since PAGER_E
24db0 52 52 4f 52 20 73 74 61 74 65 20 67 75 61 72 61  RROR state guara
24dc0 6e 74 65 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  ntees that.  ** 
24dd0 74 68 65 72 65 20 69 73 20 61 74 20 6c 65 61 73  there is at leas
24de0 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e  t one outstandin
24df0 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  g page reference
24e00 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
24e10 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 20    ** is a no-op 
24e20 66 6f 72 20 74 68 61 74 20 63 61 73 65 20 61 6e  for that case an
24e30 79 68 6f 77 2e 0a 20 20 2a 2f 0a 0a 20 20 75 33  yhow..  */..  u3
24e40 32 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50  2 pageSize = *pP
24e50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  ageSize;.  asser
24e60 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c  t( pageSize==0 |
24e70 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  | (pageSize>=512
24e80 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51   && pageSize<=SQ
24e90 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
24ea0 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 28 70 50  ZE) );.  if( (pP
24eb0 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c  ager->memDb==0 |
24ec0 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
24ed0 3d 3d 30 29 0a 20 20 20 26 26 20 73 71 6c 69 74  ==0).   && sqlit
24ee0 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
24ef0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
24f00 29 3d 3d 30 20 0a 20 20 20 26 26 20 70 61 67 65  )==0 .   && page
24f10 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65  Size && pageSize
24f20 21 3d 28 75 33 32 29 70 50 61 67 65 72 2d 3e 70  !=(u32)pPager->p
24f30 61 67 65 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20  ageSize .  ){.  
24f40 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 4e    char *pNew = N
24f50 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ULL;            
24f60 20 2f 2a 20 4e 65 77 20 74 65 6d 70 20 73 70 61   /* New temp spa
24f70 63 65 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 42  ce */.    i64 nB
24f80 79 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  yte = 0;..    if
24f90 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65  ( pPager->eState
24fa0 3e 50 41 47 45 52 5f 4f 50 45 4e 20 26 26 20 69  >PAGER_OPEN && i
24fb0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
24fc0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
24fd0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
24fe0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  e(pPager->fd, &n
24ff0 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Byte);.    }.   
25000 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25010 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  OK ){.      pNew
25020 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
25030 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67  e3PageMalloc(pag
25040 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  eSize);.      if
25050 28 20 21 70 4e 65 77 20 29 20 72 63 20 3d 20 53  ( !pNew ) rc = S
25060 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
25070 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
25080 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
25090 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65  {.      pager_re
250a0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
250b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
250c0 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a 65  cacheSetPageSize
250d0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
250e0 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  , pageSize);.   
250f0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
25100 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25110 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
25120 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  e(pPager->pTmpSp
25130 61 63 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ace);.      pPag
25140 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  er->pTmpSpace = 
25150 70 4e 65 77 3b 0a 20 20 20 20 20 20 70 50 61 67  pNew;.      pPag
25160 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50 67  er->dbSize = (Pg
25170 6e 6f 29 28 28 6e 42 79 74 65 2b 70 61 67 65 53  no)((nByte+pageS
25180 69 7a 65 2d 31 29 2f 70 61 67 65 53 69 7a 65 29  ize-1)/pageSize)
25190 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
251a0 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
251b0 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ize;.    }else{.
251c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
251d0 65 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20  eFree(pNew);.   
251e0 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 61 67 65   }.  }..  *pPage
251f0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
25200 61 67 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 72  ageSize;.  if( r
25210 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
25220 20 20 20 20 69 66 28 20 6e 52 65 73 65 72 76 65      if( nReserve
25230 3c 30 20 29 20 6e 52 65 73 65 72 76 65 20 3d 20  <0 ) nReserve = 
25240 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65  pPager->nReserve
25250 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 52  ;.    assert( nR
25260 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65  eserve>=0 && nRe
25270 73 65 72 76 65 3c 31 30 30 30 20 29 3b 0a 20 20  serve<1000 );.  
25280 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 73 65 72    pPager->nReser
25290 76 65 20 3d 20 28 69 31 36 29 6e 52 65 73 65 72  ve = (i16)nReser
252a0 76 65 3b 0a 20 20 20 20 70 61 67 65 72 52 65 70  ve;.    pagerRep
252b0 6f 72 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b  ortSize(pPager);
252c0 0a 20 20 20 20 70 61 67 65 72 46 69 78 4d 61 70  .    pagerFixMap
252d0 6c 69 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20  limit(pPager);. 
252e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
252f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
25300 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
25310 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65   "temporary page
25320 22 20 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e  " buffer held in
25330 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74  ternally.** by t
25340 68 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20  he pager.  This 
25350 69 73 20 61 20 62 75 66 66 65 72 20 74 68 61 74  is a buffer that
25360 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74   is big enough t
25370 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e  o hold the.** en
25380 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  tire content of 
25390 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e  a database page.
253a0 20 20 54 68 69 73 20 62 75 66 66 65 72 20 69 73    This buffer is
253b0 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
253c0 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  .** during rollb
253d0 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20  ack and will be 
253e0 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e  overwritten when
253f0 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a  ever a rollback.
25400 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20  ** occurs.  But 
25410 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72  other modules ar
25420 65 20 66 72 65 65 20 74 6f 20 75 73 65 20 69 74  e free to use it
25430 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73   too, as long as
25440 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73  .** no rollbacks
25450 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a   are happening..
25460 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
25470 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 50  PagerTempSpace(P
25480 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
25490 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
254a0 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a  pTmpSpace;.}../*
254b0 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
254c0 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64  et the maximum d
254d0 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75  atabase page cou
254e0 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  nt if mxPage is 
254f0 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61  positive. .** Ma
25500 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66  ke no changes if
25510 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20   mxPage is zero 
25520 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e  or negative.  An
25530 64 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74  d never reduce t
25540 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61  he.** maximum pa
25550 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74  ge count below t
25560 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
25570 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
25580 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73  .**.** Regardles
25590 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74  s of mxPage, ret
255a0 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
255b0 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
255c0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
255d0 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f  e3PagerMaxPageCo
255e0 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  unt(Pager *pPage
255f0 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
25600 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29    if( mxPage>0 )
25610 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
25620 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20  Pgno = mxPage;. 
25630 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
25640 67 65 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47  ger->eState!=PAG
25650 45 52 5f 4f 50 45 4e 20 29 3b 20 20 20 20 20 20  ER_OPEN );      
25660 2f 2a 20 43 61 6c 6c 65 64 20 6f 6e 6c 79 20 62  /* Called only b
25670 79 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 2a 2f  y OP_MaxPgcnt */
25680 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
25690 72 2d 3e 6d 78 50 67 6e 6f 3e 3d 70 50 61 67 65  r->mxPgno>=pPage
256a0 72 2d 3e 64 62 53 69 7a 65 20 29 3b 20 20 2f 2a  r->dbSize );  /*
256b0 20 4f 50 5f 4d 61 78 50 67 63 6e 74 20 65 6e 66   OP_MaxPgcnt enf
256c0 6f 72 63 65 73 20 74 68 69 73 20 2a 2f 0a 20 20  orces this */.  
256d0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d  return pPager->m
256e0 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xPgno;.}../*.** 
256f0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  The following se
25700 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72  t of routines ar
25710 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c  e used to disabl
25720 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a  e the simulated.
25730 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63  ** I/O error mec
25740 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72  hanism.  These r
25750 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
25760 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61   to avoid simula
25770 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e  ted.** errors in
25780 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65   places where we
25790 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
257a0 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  ut errors..**.**
257b0 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45   Unless -DSQLITE
257c0 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c  _TEST=1 is used,
257d0 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   these routines 
257e0 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a  are all no-ops.*
257f0 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e  * and generate n
25800 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65  o code..*/.#ifde
25810 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78  f SQLITE_TEST.ex
25820 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
25830 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
25840 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  g;.extern int sq
25850 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68  lite3_io_error_h
25860 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73  it;.static int s
25870 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64  aved_cnt;.void d
25880 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
25890 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
258a0 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20  {.  saved_cnt = 
258b0 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
258c0 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69  _pending;.  sqli
258d0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
258e0 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69  ding = -1;.}.voi
258f0 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  d enable_simulat
25900 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
25910 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  d){.  sqlite3_io
25920 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
25930 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65   saved_cnt;.}.#e
25940 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73  lse.# define dis
25950 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
25960 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66  o_errors().# def
25970 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ine enable_simul
25980 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
25990 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
259a0 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20  ead the first N 
259b0 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62  bytes from the b
259c0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
259d0 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  file into memory
259e0 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70  .** that pDest p
259f0 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a  oints to. .**.**
25a00 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77 61   If the pager wa
25a10 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72  s opened on a tr
25a20 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46  ansient file (zF
25a30 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72  ilename==""), or
25a40 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  .** opened on a 
25a50 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e  file less than N
25a60 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
25a70 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
25a80 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61  r is.** zeroed a
25a90 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
25aa0 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f  urned. The ratio
25ab0 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73  nale for this is
25ac0 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66   that this .** f
25ad0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
25ae0 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73 65  to read database
25af0 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20   headers, and a 
25b00 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72  new transient or
25b10 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64  .** zero sized d
25b20 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68 65  atabase has a he
25b30 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73  ader than consis
25b40 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a  ts entirely of z
25b50 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eroes..**.** If 
25b60 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61  any IO error apa
25b70 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49  rt from SQLITE_I
25b80 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
25b90 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a  is encountered,.
25ba0 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  ** the error cod
25bb0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
25bc0 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20   the caller and 
25bd0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
25be0 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75  the.** output bu
25bf0 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ffer undefined..
25c00 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
25c10 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
25c20 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
25c30 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64   int N, unsigned
25c40 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20   char *pDest){. 
25c50 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
25c60 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44  _OK;.  memset(pD
25c70 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73  est, 0, N);.  as
25c80 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
25c90 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
25ca0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
25cb0 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
25cc0 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65  ne is only calle
25cd0 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65 64  d by btree immed
25ce0 69 61 74 65 6c 79 20 61 66 74 65 72 20 63 72 65  iately after cre
25cf0 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 50  ating.  ** the P
25d00 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54 68  ager object.  Th
25d10 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ere has not been
25d20 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
25d30 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20 20  to transition.  
25d40 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20 79  ** to WAL mode y
25d50 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
25d60 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28  t( !pagerUseWal(
25d70 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 69 66  pPager) );..  if
25d80 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
25d90 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52  >fd) ){.    IOTR
25da0 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30  ACE(("DBHDR %p 0
25db0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
25dc0 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  N)).    rc = sql
25dd0 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
25de0 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c  r->fd, pDest, N,
25df0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
25e00 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
25e10 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
25e20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
25e30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
25e40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
25e50 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
25e60 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  may only be call
25e70 65 64 20 77 68 65 6e 20 61 20 72 65 61 64 2d 74  ed when a read-t
25e80 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
25e90 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67  en on.** the pag
25ea0 65 72 2e 20 49 74 20 72 65 74 75 72 6e 73 20 74  er. It returns t
25eb0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
25ec0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
25ed0 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
25ee0 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
25ef0 66 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20  file is between 
25f00 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65  1 and <page-size
25f10 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  > bytes in size,
25f20 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69   then .** this i
25f30 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31  s considered a 1
25f40 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2f 0a 76   page file..*/.v
25f50 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
25f60 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
25f70 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e  *pPager, int *pn
25f80 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
25f90 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
25fa0 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 29 3b  =PAGER_READER );
25fb0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
25fc0 72 2d 3e 65 53 74 61 74 65 21 3d 50 41 47 45 52  r->eState!=PAGER
25fd0 5f 57 52 49 54 45 52 5f 46 49 4e 49 53 48 45 44  _WRITER_FINISHED
25fe0 20 29 3b 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20   );.  *pnPage = 
25ff0 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 64 62 53  (int)pPager->dbS
26000 69 7a 65 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ize;.}.../*.** T
26010 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c  ry to obtain a l
26020 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b  ock of type lock
26030 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61 74 61  type on the data
26040 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a  base file. If.**
26050 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20 67 72   a similar or gr
26060 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c  eater lock is al
26070 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68 69 73  ready held, this
26080 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
26090 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69  o-op.** (returni
260a0 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d  ng SQLITE_OK imm
260b0 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a  ediately)..**.**
260c0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 74 65   Otherwise, atte
260d0 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  mpt to obtain th
260e0 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c  e lock using sql
260f0 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e  ite3OsLock(). In
26100 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62 75 73  voke .** the bus
26110 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68  y callback if th
26120 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72 65 6e  e lock is curren
26130 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  tly not availabl
26140 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e  e. Repeat .** un
26150 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c  til the busy cal
26160 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 66 61  lback returns fa
26170 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65  lse or until the
26180 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20   attempt to .** 
26190 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20  obtain the lock 
261a0 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20  succeeds..**.** 
261b0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
261c0 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20   on success and 
261d0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
261e0 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69   we cannot obtai
261f0 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49  n.** the lock. I
26200 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62  f the lock is ob
26210 74 61 69 6e 65 64 20 73 75 63 63 65 73 73 66 75  tained successfu
26220 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50 61 67  lly, set the Pag
26230 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76 61 72  er.state .** var
26240 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70  iable to locktyp
26250 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
26260 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
26270 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  t pager_wait_on_
26280 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
26290 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  er, int locktype
262a0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
262b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
262d0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f  urn code */..  /
262e0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 69  * Check that thi
262f0 73 20 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f  s is either a no
26300 2d 6f 70 20 28 62 65 63 61 75 73 65 20 74 68 65  -op (because the
26310 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
26320 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79  is .  ** already
26330 20 68 65 6c 64 29 2c 20 6f 72 20 6f 6e 65 20 6f   held), or one o
26340 66 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f 6e  f the transition
26350 73 20 74 68 61 74 20 74 68 65 20 62 75 73 79 2d  s that the busy-
26360 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79  handler.  ** may
26370 20 62 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69   be invoked duri
26380 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ng, according to
26390 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f   the comment abo
263a0 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  ve.  ** sqlite3P
263b0 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
263c0 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  er()..  */.  ass
263d0 65 72 74 28 20 28 70 50 61 67 65 72 2d 3e 65 4c  ert( (pPager->eL
263e0 6f 63 6b 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20  ock>=locktype). 
263f0 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
26400 2d 3e 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ->eLock==NO_LOCK
26410 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   && locktype==SH
26420 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  ARED_LOCK).     
26430 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 4c    || (pPager->eL
26440 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
26450 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d  CK && locktype==
26460 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
26470 20 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20    );..  do {.   
26480 20 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44   rc = pagerLockD
26490 62 28 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79  b(pPager, lockty
264a0 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72  pe);.  }while( r
264b0 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
264c0 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  & pPager->xBusyH
264d0 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70  andler(pPager->p
264e0 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20  BusyHandlerArg) 
264f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
26500 7d 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f  }../*.** Functio
26510 6e 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  n assertTruncate
26520 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65  Constraint(pPage
26530 72 29 20 63 68 65 63 6b 73 20 74 68 61 74 20 6f  r) checks that o
26540 6e 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f  ne of the .** fo
26550 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65 20  llowing is true 
26560 66 6f 72 20 61 6c 6c 20 64 69 72 74 79 20 70 61  for all dirty pa
26570 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ges currently in
26580 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 3a   the page-cache:
26590 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 54 68 65 20  .**.**   a) The 
265a0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 6c  page number is l
265b0 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
265c0 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  l to the size of
265d0 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 63 75   the .**      cu
265e0 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 69  rrent database i
265f0 6d 61 67 65 2c 20 69 6e 20 70 61 67 65 73 2c 20  mage, in pages, 
26600 4f 52 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 69 66  OR.**.**   b) if
26610 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
26620 74 20 77 65 72 65 20 77 72 69 74 74 65 6e 20 61  t were written a
26630 74 20 74 68 69 73 20 74 69 6d 65 2c 20 69 74 20  t this time, it 
26640 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20  would not.**    
26650 20 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74    be necessary t
26660 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  o write the curr
26670 65 6e 74 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20  ent content out 
26680 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
26690 61 6c 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 64  al.**      (as d
266a0 65 74 65 72 6d 69 6e 65 64 20 62 79 20 66 75 6e  etermined by fun
266b0 63 74 69 6f 6e 20 73 75 62 6a 52 65 71 75 69 72  ction subjRequir
266c0 65 73 50 61 67 65 28 29 29 2e 0a 2a 2a 0a 2a 2a  esPage())..**.**
266d0 20 49 66 20 74 68 65 20 63 6f 6e 64 69 74 69 6f   If the conditio
266e0 6e 20 61 73 73 65 72 74 65 64 20 62 79 20 74 68  n asserted by th
266f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 65 72 65  is function were
26700 20 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 74   not true, and t
26710 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65  he.** dirty page
26720 20 77 65 72 65 20 74 6f 20 62 65 20 64 69 73 63   were to be disc
26730 61 72 64 65 64 20 66 72 6f 6d 20 74 68 65 20 63  arded from the c
26740 61 63 68 65 20 76 69 61 20 74 68 65 20 70 61 67  ache via the pag
26750 65 72 53 74 72 65 73 73 28 29 0a 2a 2a 20 72 6f  erStress().** ro
26760 75 74 69 6e 65 2c 20 70 61 67 65 72 53 74 72 65  utine, pagerStre
26770 73 73 28 29 20 77 6f 75 6c 64 20 6e 6f 74 20 77  ss() would not w
26780 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
26790 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 6f   page content to
267a0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
267b0 20 66 69 6c 65 2e 20 49 66 20 61 20 73 61 76 65   file. If a save
267c0 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  point transactio
267d0 6e 20 77 65 72 65 20 72 6f 6c 6c 65 64 20 62 61  n were rolled ba
267e0 63 6b 20 61 66 74 65 72 0a 2a 2a 20 74 68 69 73  ck after.** this
267f0 20 68 61 70 70 65 6e 65 64 2c 20 74 68 65 20 63   happened, the c
26800 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20  orrect behavior 
26810 77 6f 75 6c 64 20 62 65 20 74 6f 20 72 65 73 74  would be to rest
26820 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a  ore the current.
26830 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  ** content of th
26840 65 20 70 61 67 65 2e 20 48 6f 77 65 76 65 72 2c  e page. However,
26850 20 73 69 6e 63 65 20 74 68 69 73 20 63 6f 6e 74   since this cont
26860 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65  ent is not prese
26870 6e 74 20 69 6e 20 65 69 74 68 65 72 0a 2a 2a 20  nt in either.** 
26880 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26890 65 20 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e  e or the portion
268a0 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   of the rollback
268b0 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 0a 2a 2a   journal and .**
268c0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   sub-journal rol
268d0 6c 65 64 20 62 61 63 6b 20 74 68 65 20 63 6f 6e  led back the con
268e0 74 65 6e 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62  tent could not b
268f0 65 20 72 65 73 74 6f 72 65 64 20 61 6e 64 20 74  e restored and t
26900 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 69  he.** database i
26910 6d 61 67 65 20 77 6f 75 6c 64 20 62 65 63 6f 6d  mage would becom
26920 65 20 63 6f 72 72 75 70 74 2e 20 49 74 20 69 73  e corrupt. It is
26930 20 74 68 65 72 65 66 6f 72 65 20 66 6f 72 74 75   therefore fortu
26940 6e 61 74 65 20 74 68 61 74 20 0a 2a 2a 20 74 68  nate that .** th
26950 69 73 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20  is circumstance 
26960 63 61 6e 6e 6f 74 20 61 72 69 73 65 2e 0a 2a 2f  cannot arise..*/
26970 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
26980 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69  ITE_DEBUG).stati
26990 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75  c void assertTru
269a0 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43  ncateConstraintC
269b0 62 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  b(PgHdr *pPg){. 
269c0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c   assert( pPg->fl
269d0 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20  ags&PGHDR_DIRTY 
269e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 75  );.  assert( !su
269f0 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
26a00 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f  Pg) || pPg->pgno
26a10 3c 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 64  <=pPg->pPager->d
26a20 62 53 69 7a 65 20 29 3b 0a 7d 0a 73 74 61 74 69  bSize );.}.stati
26a30 63 20 76 6f 69 64 20 61 73 73 65 72 74 54 72 75  c void assertTru
26a40 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
26a50 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
26a60 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49    sqlite3PcacheI
26a70 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67  terateDirty(pPag
26a80 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 61 73 73  er->pPCache, ass
26a90 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74  ertTruncateConst
26aa0 72 61 69 6e 74 43 62 29 3b 0a 7d 0a 23 65 6c 73  raintCb);.}.#els
26ab0 65 0a 23 20 64 65 66 69 6e 65 20 61 73 73 65 72  e.# define asser
26ac0 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61  tTruncateConstra
26ad0 69 6e 74 28 70 50 61 67 65 72 29 0a 23 65 6e 64  int(pPager).#end
26ae0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  if../*.** Trunca
26af0 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
26b00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
26b10 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61  mage to nPage pa
26b20 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  ges. This .** fu
26b30 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
26b40 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20  actually modify 
26b50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26b60 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a  e on disk. It .*
26b70 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68 65 20  * just sets the 
26b80 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f  internal state o
26b90 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  f the pager obje
26ba0 63 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a  ct so that the .
26bb0 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69  ** truncation wi
26bc0 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20  ll be done when 
26bd0 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
26be0 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
26bf0 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tted..**.** This
26c00 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
26c10 79 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62  y called right b
26c20 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67  efore committing
26c30 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a   a transaction..
26c40 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 66 75 6e  ** Once this fun
26c50 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63  ction has been c
26c60 61 6c 6c 65 64 2c 20 74 68 65 20 74 72 61 6e 73  alled, the trans
26c70 61 63 74 69 6f 6e 20 6d 75 73 74 20 65 69 74 68  action must eith
26c80 65 72 20 62 65 0a 2a 2a 20 72 6f 6c 6c 65 64 20  er be.** rolled 
26c90 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 74 65  back or committe
26ca0 64 2e 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66  d. It is not saf
26cb0 65 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66  e to call this f
26cc0 75 6e 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 74  unction and.** t
26cd0 68 65 6e 20 63 6f 6e 74 69 6e 75 65 20 77 72 69  hen continue wri
26ce0 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
26cf0 62 61 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  base..*/.void sq
26d00 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
26d10 74 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70  teImage(Pager *p
26d20 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
26d30 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e){.  assert( pP
26d40 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50  ager->dbSize>=nP
26d50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
26d60 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e   pPager->eState>
26d70 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41  =PAGER_WRITER_CA
26d80 43 48 45 4d 4f 44 20 29 3b 0a 20 20 70 50 61 67  CHEMOD );.  pPag
26d90 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
26da0 67 65 3b 0a 0a 20 20 2f 2a 20 41 74 20 6f 6e 65  ge;..  /* At one
26db0 20 70 6f 69 6e 74 20 74 68 65 20 63 6f 64 65 20   point the code 
26dc0 68 65 72 65 20 63 61 6c 6c 65 64 20 61 73 73 65  here called asse
26dd0 72 74 54 72 75 6e 63 61 74 65 43 6f 6e 73 74 72  rtTruncateConstr
26de0 61 69 6e 74 28 29 20 74 6f 0a 20 20 2a 2a 20 65  aint() to.  ** e
26df0 6e 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 70  nsure that all p
26e00 61 67 65 73 20 62 65 69 6e 67 20 74 72 75 6e 63  ages being trunc
26e10 61 74 65 64 20 61 77 61 79 20 62 79 20 74 68 69  ated away by thi
26e20 73 20 6f 70 65 72 61 74 69 6f 6e 20 61 72 65 2c  s operation are,
26e30 0a 20 20 2a 2a 20 69 66 20 6f 6e 65 20 6f 72 20  .  ** if one or 
26e40 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 73 20  more savepoints 
26e50 61 72 65 20 6f 70 65 6e 2c 20 70 72 65 73 65 6e  are open, presen
26e60 74 20 69 6e 20 74 68 65 20 73 61 76 65 70 6f 69  t in the savepoi
26e70 6e 74 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  nt .  ** journal
26e80 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 63 61   so that they ca
26e90 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 66  n be restored if
26ea0 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69   the savepoint i
26eb0 73 20 72 6f 6c 6c 65 64 0a 20 20 2a 2a 20 62 61  s rolled.  ** ba
26ec0 63 6b 2e 20 54 68 69 73 20 69 73 20 6e 6f 20 6c  ck. This is no l
26ed0 6f 6e 67 65 72 20 6e 65 63 65 73 73 61 72 79 20  onger necessary 
26ee0 61 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  as this function
26ef0 20 69 73 20 6e 6f 77 20 6f 6e 6c 79 0a 20 20 2a   is now only.  *
26f00 2a 20 63 61 6c 6c 65 64 20 72 69 67 68 74 20 62  * called right b
26f10 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69 6e 67  efore committing
26f20 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
26f30 53 6f 20 61 6c 74 68 6f 75 67 68 20 74 68 65 20  So although the 
26f40 0a 20 20 2a 2a 20 50 61 67 65 72 20 6f 62 6a 65  .  ** Pager obje
26f50 63 74 20 6d 61 79 20 73 74 69 6c 6c 20 68 61 76  ct may still hav
26f60 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  e open savepoint
26f70 73 20 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  s (Pager.nSavepo
26f80 69 6e 74 21 3d 30 29 2c 20 0a 20 20 2a 2a 20 74  int!=0), .  ** t
26f90 68 65 79 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f  hey cannot be ro
26fa0 6c 6c 65 64 20 62 61 63 6b 2e 20 53 6f 20 74 68  lled back. So th
26fb0 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65  e assertTruncate
26fc0 43 6f 6e 73 74 72 61 69 6e 74 28 29 20 63 61 6c  Constraint() cal
26fd0 6c 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e  l.  ** is no lon
26fe0 67 65 72 20 63 6f 72 72 65 63 74 2e 20 2a 2f 0a  ger correct. */.
26ff0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
27000 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
27010 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  d before attempt
27020 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ing a hot-journa
27030 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 74 0a 2a  l rollback. It.*
27040 2a 20 73 79 6e 63 73 20 74 68 65 20 6a 6f 75 72  * syncs the jour
27050 6e 61 6c 20 66 69 6c 65 20 74 6f 20 64 69 73 6b  nal file to disk
27060 2c 20 74 68 65 6e 20 73 65 74 73 20 70 50 61 67  , then sets pPag
27070 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 74  er->journalHdr t
27080 6f 20 74 68 65 0a 2a 2a 20 73 69 7a 65 20 6f 66  o the.** size of
27090 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
270a0 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61  e so that the pa
270b0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72  ger_playback() r
270c0 6f 75 74 69 6e 65 20 6b 6e 6f 77 73 0a 2a 2a 20  outine knows.** 
270d0 74 68 61 74 20 74 68 65 20 65 6e 74 69 72 65 20  that the entire 
270e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
270f0 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 2a 2a   been synced..**
27100 0a 2a 2a 20 53 79 6e 63 69 6e 67 20 61 20 68 6f  .** Syncing a ho
27110 74 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 64 69 73  t-journal to dis
27120 6b 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  k before attempt
27130 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62  ing to roll it b
27140 61 63 6b 20 65 6e 73 75 72 65 73 20 0a 2a 2a 20  ack ensures .** 
27150 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 2d  that if a power-
27160 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 64  failure occurs d
27170 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61  uring the rollba
27180 63 6b 2c 20 74 68 65 20 70 72 6f 63 65 73 73 20  ck, the process 
27190 74 68 61 74 0a 2a 2a 20 61 74 74 65 6d 70 74 73  that.** attempts
271a0 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77   rollback follow
271b0 69 6e 67 20 73 79 73 74 65 6d 20 72 65 63 6f 76  ing system recov
271c0 65 72 79 20 73 65 65 73 20 74 68 65 20 73 61 6d  ery sees the sam
271d0 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 6e  e journal.** con
271e0 74 65 6e 74 20 61 73 20 74 68 69 73 20 70 72 6f  tent as this pro
271f0 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  cess..**.** If e
27200 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61  verything goes a
27210 73 20 70 6c 61 6e 6e 65 64 2c 20 53 51 4c 49 54  s planned, SQLIT
27220 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
27230 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a  . Otherwise, .**
27240 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
27250 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
27260 20 69 6e 74 20 70 61 67 65 72 53 79 6e 63 48 6f   int pagerSyncHo
27270 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  tJournal(Pager *
27280 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
27290 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
272a0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
272b0 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sync ){.    rc =
272c0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
272d0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49  Pager->jfd, SQLI
272e0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b  TE_SYNC_NORMAL);
272f0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
27300 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27310 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
27320 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
27330 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75  fd, &pPager->jou
27340 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d 0a 20 20  rnalHdr);.  }.  
27350 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
27360 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
27370 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 4f  P_SIZE>0./*.** O
27380 62 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63  btain a referenc
27390 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 20 6d 61  e to a memory ma
273a0 70 70 65 64 20 70 61 67 65 20 6f 62 6a 65 63 74  pped page object
273b0 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72   for page number
273c0 20 70 67 6e 6f 2e 20 0a 2a 2a 20 54 68 65 20 6e   pgno. .** The n
273d0 65 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 75  ew object will u
273e0 73 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70  se the pointer p
273f0 44 61 74 61 2c 20 6f 62 74 61 69 6e 65 64 20 66  Data, obtained f
27400 72 6f 6d 20 78 46 65 74 63 68 28 29 2e 0a 2a 2a  rom xFetch()..**
27410 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
27420 73 65 74 20 2a 70 70 50 61 67 65 20 74 6f 20 70  set *ppPage to p
27430 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
27440 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 0a 2a  page reference.*
27450 2a 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  * and return SQL
27460 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73  ITE_OK. Otherwis
27470 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  e, return an SQL
27480 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61  ite error code a
27490 6e 64 20 73 65 74 0a 2a 2a 20 2a 70 70 50 61 67  nd set.** *ppPag
274a0 65 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a  e to zero..**.**
274b0 20 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 73   Page references
274c0 20 6f 62 74 61 69 6e 65 64 20 62 79 20 63 61 6c   obtained by cal
274d0 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
274e0 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 72 65 6c  on should be rel
274f0 65 61 73 65 64 0a 2a 2a 20 62 79 20 63 61 6c 6c  eased.** by call
27500 69 6e 67 20 70 61 67 65 72 52 65 6c 65 61 73 65  ing pagerRelease
27510 4d 61 70 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74  MapPage()..*/.st
27520 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 41 63  atic int pagerAc
27530 71 75 69 72 65 4d 61 70 50 61 67 65 28 0a 20 20  quireMapPage(.  
27540 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
27550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27560 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
27570 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
27580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27590 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
275a0 62 65 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ber */.  void *p
275b0 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20  Data,           
275c0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74           /* xFet
275d0 63 68 28 29 27 64 20 64 61 74 61 20 66 6f 72 20  ch()'d data for 
275e0 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50  this page */.  P
275f0 67 48 64 72 20 2a 2a 70 70 50 61 67 65 20 20 20  gHdr **ppPage   
27600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27610 2a 20 4f 55 54 3a 20 41 63 71 75 69 72 65 64 20  * OUT: Acquired 
27620 70 61 67 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  page object */.)
27630 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20  {.  PgHdr *p;   
27640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27650 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61      /* Memory ma
27660 70 70 65 64 20 70 61 67 65 20 74 6f 20 72 65 74  pped page to ret
27670 75 72 6e 20 2a 2f 0a 20 20 0a 20 20 69 66 28 20  urn */.  .  if( 
27680 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46 72 65  pPager->pMmapFre
27690 65 6c 69 73 74 20 29 7b 0a 20 20 20 20 2a 70 70  elist ){.    *pp
276a0 50 61 67 65 20 3d 20 70 20 3d 20 70 50 61 67 65  Page = p = pPage
276b0 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74  r->pMmapFreelist
276c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4d  ;.    pPager->pM
276d0 6d 61 70 46 72 65 65 6c 69 73 74 20 3d 20 70 2d  mapFreelist = p-
276e0 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e  >pDirty;.    p->
276f0 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
27700 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
27710 6e 45 78 74 72 61 3e 3d 38 20 29 3b 0a 20 20 20  nExtra>=8 );.   
27720 20 6d 65 6d 73 65 74 28 70 2d 3e 70 45 78 74 72   memset(p->pExtr
27730 61 2c 20 30 2c 20 38 29 3b 0a 20 20 7d 65 6c 73  a, 0, 8);.  }els
27740 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  e{.    *ppPage =
27750 20 70 20 3d 20 28 50 67 48 64 72 20 2a 29 73 71   p = (PgHdr *)sq
27760 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
27770 73 69 7a 65 6f 66 28 50 67 48 64 72 29 20 2b 20  sizeof(PgHdr) + 
27780 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
27790 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  .    if( p==0 ){
277a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
277b0 55 6e 66 65 74 63 68 28 70 50 61 67 65 72 2d 3e  Unfetch(pPager->
277c0 66 64 2c 20 28 69 36 34 29 28 70 67 6e 6f 2d 31  fd, (i64)(pgno-1
277d0 29 20 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ) * pPager->page
277e0 53 69 7a 65 2c 20 70 44 61 74 61 29 3b 0a 20 20  Size, pData);.  
277f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27800 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
27810 20 20 7d 0a 20 20 20 20 70 2d 3e 70 45 78 74 72    }.    p->pExtr
27820 61 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 31  a = (void *)&p[1
27830 5d 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  ];.    p->flags 
27840 3d 20 50 47 48 44 52 5f 4d 4d 41 50 3b 0a 20 20  = PGHDR_MMAP;.  
27850 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20    p->nRef = 1;. 
27860 20 20 20 70 2d 3e 70 50 61 67 65 72 20 3d 20 70     p->pPager = p
27870 50 61 67 65 72 3b 0a 20 20 7d 0a 0a 20 20 61 73  Pager;.  }..  as
27880 73 65 72 74 28 20 70 2d 3e 70 45 78 74 72 61 3d  sert( p->pExtra=
27890 3d 28 76 6f 69 64 20 2a 29 26 70 5b 31 5d 20 29  =(void *)&p[1] )
278a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
278b0 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Page==0 );.  ass
278c0 65 72 74 28 20 70 2d 3e 66 6c 61 67 73 3d 3d 50  ert( p->flags==P
278d0 47 48 44 52 5f 4d 4d 41 50 20 29 3b 0a 20 20 61  GHDR_MMAP );.  a
278e0 73 73 65 72 74 28 20 70 2d 3e 70 50 61 67 65 72  ssert( p->pPager
278f0 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73  ==pPager );.  as
27900 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3d 3d 31  sert( p->nRef==1
27910 20 29 3b 0a 0a 20 20 70 2d 3e 70 67 6e 6f 20 3d   );..  p->pgno =
27920 20 70 67 6e 6f 3b 0a 20 20 70 2d 3e 70 44 61 74   pgno;.  p->pDat
27930 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 70 50 61  a = pData;.  pPa
27940 67 65 72 2d 3e 6e 4d 6d 61 70 4f 75 74 2b 2b 3b  ger->nMmapOut++;
27950 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
27960 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
27970 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
27980 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
27990 65 20 70 50 67 2e 20 70 50 67 20 6d 75 73 74 20  e pPg. pPg must 
279a0 68 61 76 65 20 62 65 65 6e 20 72 65 74 75 72 6e  have been return
279b0 65 64 20 62 79 20 61 6e 20 0a 2a 2a 20 65 61 72  ed by an .** ear
279c0 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 70 61 67  lier call to pag
279d0 65 72 41 63 71 75 69 72 65 4d 61 70 50 61 67 65  erAcquireMapPage
279e0 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
279f0 69 64 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d  id pagerReleaseM
27a00 61 70 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  apPage(PgHdr *pP
27a10 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
27a20 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
27a30 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 6d  r;.  pPager->nMm
27a40 61 70 4f 75 74 2d 2d 3b 0a 20 20 70 50 67 2d 3e  apOut--;.  pPg->
27a50 70 44 69 72 74 79 20 3d 20 70 50 61 67 65 72 2d  pDirty = pPager-
27a60 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73 74 3b 0a  >pMmapFreelist;.
27a70 20 20 70 50 61 67 65 72 2d 3e 70 4d 6d 61 70 46    pPager->pMmapF
27a80 72 65 65 6c 69 73 74 20 3d 20 70 50 67 3b 0a 0a  reelist = pPg;..
27a90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
27aa0 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e  ->fd->pMethods->
27ab0 69 56 65 72 73 69 6f 6e 3e 3d 33 20 29 3b 0a 20  iVersion>=3 );. 
27ac0 20 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63   sqlite3OsUnfetc
27ad0 68 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69  h(pPager->fd, (i
27ae0 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29  64)(pPg->pgno-1)
27af0 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  *pPager->pageSiz
27b00 65 2c 20 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a  e, pPg->pData);.
27b10 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c  }../*.** Free al
27b20 6c 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20  l PgHdr objects 
27b30 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 50 61  stored in the Pa
27b40 67 65 72 2e 70 4d 6d 61 70 46 72 65 65 6c 69 73  ger.pMmapFreelis
27b50 74 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  t list..*/.stati
27b60 63 20 76 6f 69 64 20 70 61 67 65 72 46 72 65 65  c void pagerFree
27b70 4d 61 70 48 64 72 73 28 50 61 67 65 72 20 2a 70  MapHdrs(Pager *p
27b80 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
27b90 2a 70 3b 0a 20 20 50 67 48 64 72 20 2a 70 4e 65  *p;.  PgHdr *pNe
27ba0 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67  xt;.  for(p=pPag
27bb0 65 72 2d 3e 70 4d 6d 61 70 46 72 65 65 6c 69 73  er->pMmapFreelis
27bc0 74 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a  t; p; p=pNext){.
27bd0 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70      pNext = p->p
27be0 44 69 72 74 79 3b 0a 20 20 20 20 73 71 6c 69 74  Dirty;.    sqlit
27bf0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a  e3_free(p);.  }.
27c00 7d 0a 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61  }../* Verify tha
27c10 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
27c20 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 20 64  ile has not be d
27c30 65 6c 65 74 65 64 20 6f 72 20 72 65 6e 61 6d 65  eleted or rename
27c40 64 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 75 6e  d out from.** un
27c50 64 65 72 20 74 68 65 20 70 61 67 65 72 2e 20 20  der the pager.  
27c60 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
27c70 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
27c80 20 69 73 20 73 74 69 6c 6c 20 77 68 65 72 65 20   is still where 
27c90 69 74 20 6f 75 67 68 74 0a 2a 2a 20 74 6f 20 62  it ought.** to b
27ca0 65 20 6f 6e 20 64 69 73 6b 2e 20 20 52 65 74 75  e on disk.  Retu
27cb0 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 28 53 51 4c  rn non-zero (SQL
27cc0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d  ITE_READONLY_DBM
27cd0 4f 56 45 44 20 6f 72 20 73 6f 6d 65 20 6f 74 68  OVED or some oth
27ce0 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  er error.** code
27cf0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 4f 73 41   from sqlite3OsA
27d00 63 63 65 73 73 28 29 29 20 69 66 20 74 68 65 20  ccess()) if the 
27d10 64 61 74 61 62 61 73 65 20 68 61 73 20 67 6f 6e  database has gon
27d20 65 20 6d 69 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74  e missing..*/.st
27d30 61 74 69 63 20 69 6e 74 20 64 61 74 61 62 61 73  atic int databas
27d40 65 49 73 55 6e 6d 6f 76 65 64 28 50 61 67 65 72  eIsUnmoved(Pager
27d50 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
27d60 20 62 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a   bHasMoved = 0;.
27d70 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
27d80 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
27d90 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  e ) return SQLIT
27da0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
27db0 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 20 29 20  er->dbSize==0 ) 
27dc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27dd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
27de0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 26 26  er->zFilename &&
27df0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
27e00 6d 65 5b 30 5d 20 29 3b 0a 20 20 72 63 20 3d 20  me[0] );.  rc = 
27e10 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
27e20 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c  trol(pPager->fd,
27e30 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41   SQLITE_FCNTL_HA
27e40 53 5f 4d 4f 56 45 44 2c 20 26 62 48 61 73 4d 6f  S_MOVED, &bHasMo
27e50 76 65 64 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ved);.  if( rc==
27e60 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
27e70 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
27e80 20 48 41 53 5f 4d 4f 56 45 44 20 66 69 6c 65 2d   HAS_MOVED file-
27e90 63 6f 6e 74 72 6f 6c 20 69 73 20 75 6e 69 6d 70  control is unimp
27ea0 6c 65 6d 65 6e 74 65 64 2c 20 61 73 73 75 6d 65  lemented, assume
27eb0 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 0a 20   that the file. 
27ec0 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65     ** has not be
27ed0 65 6e 20 6d 6f 76 65 64 2e 20 20 54 68 61 74 20  en moved.  That 
27ee0 69 73 20 74 68 65 20 68 69 73 74 6f 72 69 63 61  is the historica
27ef0 6c 20 62 65 68 61 76 69 6f 72 20 6f 66 20 53 51  l behavior of SQ
27f00 4c 69 74 65 3a 20 70 72 69 6f 72 20 74 6f 0a 20  Lite: prior to. 
27f10 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e     ** version 3.
27f20 38 2e 33 2c 20 69 74 20 6e 65 76 65 72 20 63 68  8.3, it never ch
27f30 65 63 6b 65 64 20 2a 2f 0a 20 20 20 20 72 63 20  ecked */.    rc 
27f40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
27f50 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
27f60 49 54 45 5f 4f 4b 20 26 26 20 62 48 61 73 4d 6f  ITE_OK && bHasMo
27f70 76 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ved ){.    rc = 
27f80 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
27f90 44 42 4d 4f 56 45 44 3b 0a 20 20 7d 0a 20 20 72  DBMOVED;.  }.  r
27fa0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
27fb0 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
27fc0 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72   page cache.  Fr
27fd0 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e  ee all memory an
27fe0 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65  d close all file
27ff0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72  s..**.** If a tr
28000 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e  ansaction was in
28010 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74   progress when t
28020 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
28030 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74  alled, that.** t
28040 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
28050 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20  lled back.  All 
28060 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
28070 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
28080 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d  d.** and their m
28090 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20  emory is freed. 
280a0 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
280b0 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63  use a page assoc
280c0 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
280d0 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66  is page cache af
280e0 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
280f0 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c  n returns will l
28100 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20  ikely.** result 
28110 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
28120 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
28130 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  on always succee
28140 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  ds. If a transac
28150 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
28160 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20  n attempt.** is 
28170 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20  made to roll it 
28180 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f  back. If an erro
28190 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
281a0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a  the rollback .**
281b0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d   a hot journal m
281c0 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68  ay be left in th
281d0 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74  e filesystem but
281e0 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74   no error is ret
281f0 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  urned.** to the 
28200 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  caller..*/.int s
28210 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
28220 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
28230 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
28240 75 38 20 2a 70 54 6d 70 20 3d 20 28 75 38 2a 29  u8 *pTmp = (u8*)
28250 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
28260 65 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 20  e;.  assert( db 
28270 7c 7c 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  || pagerUseWal(p
28280 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61  Pager)==0 );.  a
28290 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61  ssert( assert_pa
282a0 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72  ger_state(pPager
282b0 29 20 29 3b 0a 20 20 64 69 73 61 62 6c 65 5f 73  ) );.  disable_s
282c0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
282d0 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  rs();.  sqlite3B
282e0 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
282f0 28 29 3b 0a 20 20 70 61 67 65 72 46 72 65 65 4d  ();.  pagerFreeM
28300 61 70 48 64 72 73 28 70 50 61 67 65 72 29 3b 0a  apHdrs(pPager);.
28310 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72    /* pPager->err
28320 43 6f 64 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Code = 0; */.  p
28330 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
28340 4d 6f 64 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Mode = 0;.#ifnde
28350 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
28360 4c 0a 20 20 7b 0a 20 20 20 20 75 38 20 2a 61 20  L.  {.    u8 *a 
28370 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
28380 20 64 62 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70   db || pPager->p
28390 57 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  Wal==0 );.    if
283a0 28 20 64 62 20 26 26 20 30 3d 3d 28 64 62 2d 3e  ( db && 0==(db->
283b0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4e  flags & SQLITE_N
283c0 6f 43 6b 70 74 4f 6e 43 6c 6f 73 65 29 20 0a 20  oCkptOnClose) . 
283d0 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b      && SQLITE_OK
283e0 3d 3d 64 61 74 61 62 61 73 65 49 73 55 6e 6d 6f  ==databaseIsUnmo
283f0 76 65 64 28 70 50 61 67 65 72 29 0a 20 20 20 20  ved(pPager).    
28400 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 54 6d  ){.      a = pTm
28410 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  p;.    }.    sql
28420 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50 61  ite3WalClose(pPa
28430 67 65 72 2d 3e 70 57 61 6c 2c 20 64 62 2c 20 70  ger->pWal, db, p
28440 50 61 67 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c  Pager->walSyncFl
28450 61 67 73 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ags, pPager->pag
28460 65 53 69 7a 65 2c 61 29 3b 0a 20 20 20 20 70 50  eSize,a);.    pP
28470 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a  ager->pWal = 0;.
28480 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 61 67    }.#endif.  pag
28490 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
284a0 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
284b0 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63  .    pager_unloc
284c0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c  k(pPager);.  }el
284d0 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 69 74  se{.    /* If it
284e0 20 69 73 20 6f 70 65 6e 2c 20 73 79 6e 63 20 74   is open, sync t
284f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
28500 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 55  before calling U
28510 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
28520 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73  ..    ** If this
28530 20 69 73 20 6e 6f 74 20 64 6f 6e 65 2c 20 74 68   is not done, th
28540 65 6e 20 61 6e 20 75 6e 73 79 6e 63 65 64 20 70  en an unsynced p
28550 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 70  ortion of the op
28560 65 6e 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20  en journal .    
28570 2a 2a 20 66 69 6c 65 20 6d 61 79 20 62 65 20 70  ** file may be p
28580 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20  layed back into 
28590 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
285a0 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
285b0 20 6f 63 63 75 72 73 20 0a 20 20 20 20 2a 2a 20   occurs .    ** 
285c0 77 68 69 6c 65 20 74 68 69 73 20 69 73 20 68 61  while this is ha
285d0 70 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74  ppening, the dat
285e0 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 63 6f  abase could beco
285f0 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20  me corrupt..    
28600 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 20  **.    ** If an 
28610 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
28620 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 73 79 6e  le trying to syn
28630 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73  c the journal, s
28640 68 69 66 74 20 74 68 65 20 70 61 67 65 72 0a 20  hift the pager. 
28650 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 45     ** into the E
28660 52 52 4f 52 20 73 74 61 74 65 2e 20 54 68 69 73  RROR state. This
28670 20 63 61 75 73 65 73 20 55 6e 6c 6f 63 6b 41 6e   causes UnlockAn
28680 64 52 6f 6c 6c 62 61 63 6b 20 74 6f 20 75 6e 6c  dRollback to unl
28690 6f 63 6b 20 74 68 65 0a 20 20 20 20 2a 2a 20 64  ock the.    ** d
286a0 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c 6f 73  atabase and clos
286b0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
286c0 6c 65 20 77 69 74 68 6f 75 74 20 61 74 74 65 6d  le without attem
286d0 70 74 69 6e 67 20 74 6f 20 72 6f 6c 6c 20 69 74  pting to roll it
286e0 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 6f 72 20  .    ** back or 
286f0 66 69 6e 61 6c 69 7a 65 20 69 74 2e 20 54 68 65  finalize it. The
28700 20 6e 65 78 74 20 64 61 74 61 62 61 73 65 20 75   next database u
28710 73 65 72 20 77 69 6c 6c 20 68 61 76 65 20 74 6f  ser will have to
28720 20 64 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a   do hot-journal.
28730 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
28740 62 65 66 6f 72 65 20 61 63 63 65 73 73 69 6e 67  before accessing
28750 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
28760 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
28770 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
28780 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
28790 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
287a0 65 72 2c 20 70 61 67 65 72 53 79 6e 63 48 6f 74  er, pagerSyncHot
287b0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 29  Journal(pPager))
287c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
287d0 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
287e0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
287f0 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
28800 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e  gnMalloc();.  en
28810 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
28820 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41  o_errors();.  PA
28830 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45  GERTRACE(("CLOSE
28840 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
28850 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54  pPager)));.  IOT
28860 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c  RACE(("CLOSE %p\
28870 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73  n", pPager)).  s
28880 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
28890 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 73 71  ager->jfd);.  sq
288a0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
288b0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69  ger->fd);.  sqli
288c0 74 65 33 50 61 67 65 46 72 65 65 28 70 54 6d 70  te3PageFree(pTmp
288d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
288e0 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  heClose(pPager->
288f0 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65  pPCache);..#ifde
28900 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
28910 45 43 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  EC.  if( pPager-
28920 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50  >xCodecFree ) pP
28930 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
28940 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29  (pPager->pCodec)
28950 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
28960 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61  rt( !pPager->aSa
28970 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67  vepoint && !pPag
28980 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->pInJournal )
28990 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f  ;.  assert( !isO
289a0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
289b0 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67   && !isOpen(pPag
289c0 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20  er->sjfd) );..  
289d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
289e0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
289f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
28a00 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
28a10 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
28a20 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
28a30 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
28a40 6e 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20  number for page 
28a50 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c  pPg..*/.Pgno sql
28a60 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
28a70 62 65 72 28 44 62 50 61 67 65 20 2a 70 50 67 29  ber(DbPage *pPg)
28a80 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  {.  return pPg->
28a90 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  pgno;.}.#endif..
28aa0 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  /*.** Increment 
28ab0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
28ac0 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67  unt for page pPg
28ad0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
28ae0 33 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65  3PagerRef(DbPage
28af0 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65   *pPg){.  sqlite
28b00 33 50 63 61 63 68 65 52 65 66 28 70 50 67 29 3b  3PcacheRef(pPg);
28b10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
28b20 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f  he journal. In o
28b30 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65  ther words, make
28b40 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61   sure all the pa
28b50 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a  ges that have.**
28b60 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
28b70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76   the journal hav
28b80 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68  e actually reach
28b90 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f  ed the surface o
28ba0 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  f the.** disk an
28bb0 64 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  d can be restore
28bc0 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  d in the event o
28bd0 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  f a hot-journal 
28be0 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
28bf0 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53  If the Pager.noS
28c00 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ync flag is set,
28c10 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
28c20 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
28c30 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  ** Otherwise, th
28c40 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72  e actions requir
28c50 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65  ed depend on the
28c60 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 61 6e   journal-mode an
28c70 64 20 74 68 65 20 0a 2a 2a 20 64 65 76 69 63 65  d the .** device
28c80 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
28c90 20 6f 66 20 74 68 65 20 66 69 6c 65 2d 73 79 73   of the file-sys
28ca0 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  tem, as follows:
28cb0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68  .**.**   * If th
28cc0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
28cd0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  s an in-memory j
28ce0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f 20  ournal file, no 
28cf0 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20  action need.**  
28d00 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a     be taken..**.
28d10 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73 65  **   * Otherwise
28d20 2c 20 69 66 20 74 68 65 20 64 65 76 69 63 65 20  , if the device 
28d30 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
28d40 20 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e 44   the SAFE_APPEND
28d50 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20 20   property,.**   
28d60 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20    then the nRec 
28d70 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73  field of the mos
28d80 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74  t recently writt
28d90 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  en journal heade
28da0 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64 61  r.**     is upda
28db0 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ted to contain t
28dc0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f 75  he number of jou
28dd0 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68 61  rnal records tha
28de0 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62 65  t have.**     be
28df0 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c 6f  en written follo
28e00 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65 20  wing it. If the 
28e10 70 61 67 65 72 20 69 73 20 6f 70 65 72 61 74 69  pager is operati
28e20 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a  ng in full-sync.
28e30 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68 65  **     mode, the
28e40 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
28e50 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62 65 66  le is synced bef
28e60 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64 20 69  ore this field i
28e70 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  s updated..**.**
28e80 20 20 20 2a 20 49 66 20 74 68 65 20 64 65 76 69     * If the devi
28e90 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  ce does not supp
28ea0 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e 54 49  ort the SEQUENTI
28eb0 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68 65  AL property, the
28ec0 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  n .**     journa
28ed0 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  l file is synced
28ee0 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70  ..**.** Or, in p
28ef0 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a  seudo-code:.**.*
28f00 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e 2d  *   if( NOT <in-
28f10 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e 20  memory journal> 
28f20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f  ){.**     if( NO
28f30 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29 7b  T SAFE_APPEND ){
28f40 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c 66  .**       if( <f
28f50 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20 29  ull-sync mode> )
28f60 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20   xSync(<journal 
28f70 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20 20  file>);.**      
28f80 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66 69   <update nRec fi
28f90 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a  eld>.**     } .*
28fa0 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 45  *     if( NOT SE
28fb0 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e 63  QUENTIAL ) xSync
28fc0 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29  (<journal file>)
28fd0 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 49  ;.**   }.**.** I
28fe0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  f successful, th
28ff0 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72  is routine clear
29000 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  s the PGHDR_NEED
29010 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76  _SYNC flag of ev
29020 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72  ery .** page cur
29030 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d  rently held in m
29040 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74  emory before ret
29050 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b  urning SQLITE_OK
29060 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72  . If an IO.** er
29070 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
29080 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  ed, then the IO 
29090 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
290a0 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
290b0 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
290c0 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
290d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
290e0 6e 74 20 6e 65 77 48 64 72 29 7b 0a 20 20 69 6e  nt newHdr){.  in
290f0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
29100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29110 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
29120 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
29130 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
29140 5f 57 52 49 54 45 52 5f 43 41 43 48 45 4d 4f 44  _WRITER_CACHEMOD
29150 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65  .       || pPage
29160 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
29170 5f 57 52 49 54 45 52 5f 44 42 4d 4f 44 0a 20 20  _WRITER_DBMOD.  
29180 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 73 73  );.  assert( ass
29190 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
291a0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73  pPager) );.  ass
291b0 65 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61  ert( !pagerUseWa
291c0 6c 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  l(pPager) );..  
291d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
291e0 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70  rExclusiveLock(p
291f0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
29200 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
29210 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20  turn rc;..  if( 
29220 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
29230 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
29240 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
29250 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70   );.    if( isOp
29260 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
29270 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
29280 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
29290 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
292a0 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
292b0 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
292c0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
292d0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
292e0 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >fd);.      asse
292f0 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
29300 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20  r->jfd) );..    
29310 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
29320 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
29330 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20  APPEND) ){.     
29340 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
29350 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f   deals with an o
29360 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20  bscure problem. 
29370 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e  If the last conn
29380 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a  ection.        *
29390 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20  * that wrote to 
293a0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77 61  this database wa
293b0 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70  s operating in p
293c0 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61  ersistent-journa
293d0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64  l.        ** mod
293e0 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  e, then the jour
293f0 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20  nal file may at 
29400 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61  this point actua
29410 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20  lly be larger.  
29420 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61        ** than Pa
29430 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62  ger.journalOff b
29440 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78  ytes. If the nex
29450 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a  t thing in the j
29460 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a  ournal.        *
29470 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74  * file happens t
29480 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  o be a journal-h
29490 65 61 64 65 72 20 28 77 72 69 74 74 65 6e 20 61  eader (written a
294a0 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20  s part of the.  
294b0 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
294c0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74  s connection's t
294d0 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64  ransaction), and
294e0 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65   a crash or powe
294f0 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20  r-failure .     
29500 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74     ** occurs aft
29510 65 72 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  er nRec is updat
29520 65 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68  ed but before th
29530 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72  is connection wr
29540 69 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  ites .        **
29550 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74   anything else t
29560 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
29570 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72  le (or commits/r
29580 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20  olls back its . 
29590 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61         ** transa
295a0 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c  ction), then SQL
295b0 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63  ite may become c
295c0 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69  onfused when doi
295d0 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  ng the .        
295e0 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ** hot-journal r
295f0 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e  ollback followin
29600 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d  g recovery. It m
29610 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c  ay roll back all
29620 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
29630 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  his connections 
29640 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65  data, then proce
29650 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61  ed to rolling ba
29660 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20  ck the old,.    
29670 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61      ** out-of-da
29680 74 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c  te data that fol
29690 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61 73  lows it. Databas
296a0 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
296b0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
296c0 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75   ** To work arou
296d0 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68 65 20  nd this, if the 
296e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
296f0 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74  s appear to cont
29700 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ain.        ** a
29710 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f   valid header fo
29720 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f  llowing Pager.jo
29730 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77  urnalOff, then w
29740 72 69 74 65 20 61 20 30 78 30 30 0a 20 20 20 20  rite a 0x00.    
29750 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74      ** byte to t
29760 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 20 74  he start of it t
29770 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f  o prevent it fro
29780 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a  m being recogniz
29790 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ed..        **. 
297a0 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62         ** Variab
297b0 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  le iNextHdrOffse
297c0 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
297d0 6f 66 66 73 65 74 20 61 74 20 77 68 69 63 68 20  offset at which 
297e0 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  this.        ** 
297f0 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64  problematic head
29800 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69  er will occur, i
29810 66 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61  f it exists. aMa
29820 67 69 63 20 69 73 20 75 73 65 64 20 0a 20 20 20  gic is used .   
29830 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d       ** as a tem
29840 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f  porary buffer to
29850 20 69 6e 73 70 65 63 74 20 74 68 65 20 66 69 72   inspect the fir
29860 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74  st couple of byt
29870 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  es of.        **
29880 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a   the potential j
29890 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20  ournal header.. 
298a0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
298b0 20 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66    i64 iNextHdrOf
298c0 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75 38  fset;.        u8
298d0 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20   aMagic[8];.    
298e0 20 20 20 20 75 38 20 7a 48 65 61 64 65 72 5b 73      u8 zHeader[s
298f0 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
29900 67 69 63 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20  gic)+4];..      
29910 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72    memcpy(zHeader
29920 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
29930 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
29940 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20  Magic));.       
29950 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
29960 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
29970 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61 67  nalMagic)], pPag
29980 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20  er->nRec);..    
29990 20 20 20 20 69 4e 65 78 74 48 64 72 4f 66 66 73      iNextHdrOffs
299a0 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  et = journalHdrO
299b0 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
299c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
299d0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
299e0 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38  ->jfd, aMagic, 8
299f0 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  , iNextHdrOffset
29a00 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
29a10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
29a20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  0==memcmp(aMagic
29a30 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
29a40 20 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   8) ){.         
29a50 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
29a60 20 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20   zerobyte = 0;. 
29a70 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
29a80 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
29a90 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62  ger->jfd, &zerob
29aa0 79 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72  yte, 1, iNextHdr
29ab0 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  Offset);.       
29ac0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
29ad0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
29ae0 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
29af0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
29b00 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
29b10 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  rc;.        }.. 
29b20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
29b30 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
29b40 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
29b50 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20  file header. If 
29b60 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  in.        ** fu
29b70 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  ll-synchronous m
29b80 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  ode, sync the jo
29b90 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69  urnal first. Thi
29ba0 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20  s ensures that. 
29bb0 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61         ** all da
29bc0 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69  ta has really hi
29bd0 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72  t the disk befor
29be0 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65  e nRec is update
29bf0 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20  d to mark.      
29c00 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e    ** it as a can
29c10 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62  didate for rollb
29c20 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ack..        **.
29c30 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
29c40 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20  is not required 
29c50 69 66 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  if the persisten
29c60 74 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73  t media supports
29c70 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
29c80 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70  SAFE_APPEND prop
29c90 65 72 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e  erty. Because in
29ca0 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73   this case it is
29cb0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20   not possible . 
29cc0 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61         ** for ga
29cd0 72 62 61 67 65 20 64 61 74 61 20 74 6f 20 62 65  rbage data to be
29ce0 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
29cf0 20 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20   file, the nRec 
29d00 66 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  field.        **
29d10 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
29d20 74 68 20 30 78 46 46 46 46 46 46 46 46 20 77 68  th 0xFFFFFFFF wh
29d30 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  en the journal h
29d40 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
29d50 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  .        ** and 
29d60 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62  never needs to b
29d70 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20  e updated..     
29d80 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
29d90 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
29da0 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51  nc && 0==(iDc&SQ
29db0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
29dc0 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
29dd0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
29de0 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
29df0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
29e00 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20  pPager)));.     
29e10 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
29e20 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
29e30 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72  er)).          r
29e40 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
29e50 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
29e60 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67 73  Pager->syncFlags
29e70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
29e80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
29e90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
29ea0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f      }.        IO
29eb0 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
29ec0 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  %lld\n", pPager,
29ed0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
29ee0 48 64 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72  Hdr));.        r
29ef0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
29f00 74 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  te(.            
29f10 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65  pPager->jfd, zHe
29f20 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65  ader, sizeof(zHe
29f30 61 64 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a  ader), pPager->j
29f40 6f 75 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20  ournalHdr.      
29f50 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
29f60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
29f70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
29f80 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d    }.      if( 0=
29f90 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
29fa0 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29  AP_SEQUENTIAL) )
29fb0 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  {.        PAGERT
29fc0 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72  RACE(("SYNC jour
29fd0 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
29fe0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
29ff0 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
2a000 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20  (("JSYNC %p\n", 
2a010 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20  pPager)).       
2a020 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
2a030 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
2a040 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61   pPager->syncFla
2a050 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28  gs| .          (
2a060 70 50 61 67 65 72 2d 3e 73 79 6e 63 46 6c 61 67  pPager->syncFlag
2a070 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  s==SQLITE_SYNC_F
2a080 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ULL?SQLITE_SYNC_
2a090 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20  DATAONLY:0).    
2a0a0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
2a0b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2a0c0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2a0d0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61      }..      pPa
2a0e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
2a0f0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
2a100 6c 4f 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20  lOff;.      if( 
2a110 6e 65 77 48 64 72 20 26 26 20 30 3d 3d 28 69 44  newHdr && 0==(iD
2a120 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
2a130 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20  AFE_APPEND) ){. 
2a140 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
2a150 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Rec = 0;.       
2a160 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
2a170 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
2a180 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2a190 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
2a1a0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
2a1b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2a1c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
2a1d0 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r = pPager->jour
2a1e0 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20  nalOff;.    }.  
2a1f0 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 74  }..  /* Unless t
2a200 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e  he pager is in n
2a210 6f 53 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20  oSync mode, the 
2a220 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73  journal file was
2a230 20 6a 75 73 74 20 0a 20 20 2a 2a 20 73 75 63 63   just .  ** succ
2a240 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e  essfully synced.
2a250 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 6c 65   Either way, cle
2a260 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ar the PGHDR_NEE
2a270 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e 20 0a  D_SYNC flag on .
2a280 20 20 2a 2a 20 61 6c 6c 20 70 61 67 65 73 2e 0a    ** all pages..
2a290 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63    */.  sqlite3Pc
2a2a0 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61  acheClearSyncFla
2a2b0 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  gs(pPager->pPCac
2a2c0 68 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  he);.  pPager->e
2a2d0 53 74 61 74 65 20 3d 20 50 41 47 45 52 5f 57 52  State = PAGER_WR
2a2e0 49 54 45 52 5f 44 42 4d 4f 44 3b 0a 20 20 61 73  ITER_DBMOD;.  as
2a2f0 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
2a300 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
2a310 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
2a320 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2a330 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
2a340 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20   the first in a 
2a350 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 64  linked list of d
2a360 69 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e 65  irty pages conne
2a370 63 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 50  cted.** by the P
2a380 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e  gHdr.pDirty poin
2a390 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ter. This functi
2a3a0 6f 6e 20 77 72 69 74 65 73 20 65 61 63 68 20 6f  on writes each o
2a3b0 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 2d  ne of the.** in-
2a3c0 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e 20  memory pages in 
2a3d0 74 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65 20  the list to the 
2a3e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
2a3f0 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 0a  he argument may.
2a400 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70 72  ** be NULL, repr
2a410 65 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70 74  esenting an empt
2a420 79 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73 20  y list. In this 
2a430 63 61 73 65 20 74 68 69 73 20 66 75 6e 63 74 69  case this functi
2a440 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70  on is.** a no-op
2a450 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
2a460 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20 6c  r must hold at l
2a470 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44 20  east a RESERVED 
2a480 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20 66  lock when this f
2a490 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61  unction.** is ca
2a4a0 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72 69  lled. Before wri
2a4b0 74 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74 6f  ting anything to
2a4c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a4d0 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a  le, this lock.**
2a4e0 20 69 73 20 75 70 67 72 61 64 65 64 20 74 6f 20   is upgraded to 
2a4f0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
2a500 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 63  k. If the lock c
2a510 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65  annot be obtaine
2a520 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  d,.** SQLITE_BUS
2a530 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  Y is returned an
2a540 64 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72 69  d no data is wri
2a550 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
2a560 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a  base file..** .*
2a570 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
2a580 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70 61  s a temp-file pa
2a590 67 65 72 20 61 6e 64 20 74 68 65 20 61 63 74 75  ger and the actu
2a5a0 61 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66  al file-system f
2a5b0 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79 65  ile.** is not ye
2a5c0 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63 72  t open, it is cr
2a5d0 65 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64  eated and opened
2a5e0 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61   before any data
2a5f0 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20   is .** written 
2a600 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  out..**.** Once 
2a610 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65  the lock has bee
2a620 6e 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c 20  n upgraded and, 
2a630 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74 68  if necessary, th
2a640 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a  e file opened,.*
2a650 2a 20 74 68 65 20 70 61 67 65 73 20 61 72 65 20  * the pages are 
2a660 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74  written out to t
2a670 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2a680 20 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e 20   in list order. 
2a690 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61 67  Writing.** a pag
2a6a0 65 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  e is skipped if 
2a6b0 69 74 20 6d 65 65 74 73 20 65 69 74 68 65 72 20  it meets either 
2a6c0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2a6d0 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a   criteria:.**.**
2a6e0 20 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e 75     * The page nu
2a6f0 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20  mber is greater 
2a700 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
2a710 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68 65  e, or.**   * The
2a720 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54   PGHDR_DONT_WRIT
2a730 45 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f 6e  E flag is set on
2a740 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   the page..**.**
2a750 20 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74 20   If writing out 
2a760 61 20 70 61 67 65 20 63 61 75 73 65 73 20 74 68  a page causes th
2a770 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2a780 74 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e 64  to grow, Pager.d
2a790 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73 20  bFileSize.** is 
2a7a0 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69 6e  updated accordin
2a7b0 67 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20 69  gly. If page 1 i
2a7c0 73 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20 74  s written out, t
2a7d0 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63 61  hen the value ca
2a7e0 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65 72  ched.** in Pager
2a7f0 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73  .dbFileVers[] is
2a800 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74 63   updated to matc
2a810 68 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 20  h the new value 
2a820 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68 65  stored in.** the
2a830 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2a840 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68  **.** If everyth
2a850 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
2a860 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
2a870 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
2a880 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63  IO error .** occ
2a890 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72  urs, an IO error
2a8a0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2a8b0 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45 58  d. Or, if the EX
2a8c0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61 6e  CLUSIVE lock can
2a8d0 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69 6e  not.** be obtain
2a8e0 65 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ed, SQLITE_BUSY 
2a8f0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
2a900 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
2a910 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
2a920 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
2a930 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20  gHdr *pList){.  
2a940 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2a950 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
2a960 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2a970 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69  ode */..  /* Thi
2a980 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
2a990 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72 20 72 6f  ly called for ro
2a9a0 6c 6c 62 61 63 6b 20 70 61 67 65 72 73 20 69 6e  llback pagers in
2a9b0 20 57 52 49 54 45 52 5f 44 42 4d 4f 44 20 73 74   WRITER_DBMOD st
2a9c0 61 74 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ate. */.  assert
2a9d0 28 20 21 70 61 67 65 72 55 73 65 57 61 6c 28 70  ( !pagerUseWal(p
2a9e0 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65  Pager) );.  asse
2a9f0 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  rt( pPager->temp
2aa00 46 69 6c 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  File || pPager->
2aa10 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52  eState==PAGER_WR
2aa20 49 54 45 52 5f 44 42 4d 4f 44 20 29 3b 0a 20 20  ITER_DBMOD );.  
2aa30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2aa40 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
2aa50 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
2aa60 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
2aa70 2d 3e 66 64 29 20 7c 7c 20 70 4c 69 73 74 2d 3e  ->fd) || pList->
2aa80 70 44 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20  pDirty==0 );..  
2aa90 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  /* If the file i
2aaa0 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 68 61  s a temp-file ha
2aab0 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  s not yet been o
2aac0 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e  pened, open it n
2aad0 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e  ow. It.  ** is n
2aae0 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
2aaf0 72 63 20 74 6f 20 62 65 20 6f 74 68 65 72 20 74  rc to be other t
2ab00 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  han SQLITE_OK if
2ab10 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a   this branch.  *
2ab20 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61 73 20 70  * is taken, as p
2ab30 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
2ab40 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66  k() is a no-op f
2ab50 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20  or temp-files.. 
2ab60 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65   */.  if( !isOpe
2ab70 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
2ab80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2ab90 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26  ger->tempFile &&
2aba0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2abb0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
2abc0 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c  Opentemp(pPager,
2abd0 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61   pPager->fd, pPa
2abe0 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a  ger->vfsFlags);.
2abf0 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65    }..  /* Before
2ac00 20 74 68 65 20 66 69 72 73 74 20 77 72 69 74 65   the first write
2ac10 2c 20 67 69 76 65 20 74 68 65 20 56 46 53 20 61  , give the VFS a
2ac20 20 68 69 6e 74 20 6f 66 20 77 68 61 74 20 74 68   hint of what th
2ac30 65 20 66 69 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  e final.  ** fil
2ac40 65 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 2e 0a  e size will be..
2ac50 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72    */.  assert( r
2ac60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
2ac70 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
2ac80 64 29 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  d) );.  if( rc==
2ac90 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26  SQLITE_OK .   &&
2aca0 20 70 50 61 67 65 72 2d 3e 64 62 48 69 6e 74 53   pPager->dbHintS
2acb0 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69  ize<pPager->dbSi
2acc0 7a 65 0a 20 20 20 26 26 20 28 70 4c 69 73 74 2d  ze.   && (pList-
2acd0 3e 70 44 69 72 74 79 20 7c 7c 20 70 4c 69 73 74  >pDirty || pList
2ace0 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ->pgno>pPager->d
2acf0 62 48 69 6e 74 53 69 7a 65 29 0a 20 20 29 7b 0a  bHintSize).  ){.
2ad00 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
2ad10 34 20 73 7a 46 69 6c 65 20 3d 20 70 50 61 67 65  4 szFile = pPage
2ad20 72 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20 28 73  r->pageSize * (s
2ad30 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 50 61  qlite3_int64)pPa
2ad40 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
2ad50 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
2ad60 6e 74 72 6f 6c 48 69 6e 74 28 70 50 61 67 65 72  ntrolHint(pPager
2ad70 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46 43 4e  ->fd, SQLITE_FCN
2ad80 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 26 73  TL_SIZE_HINT, &s
2ad90 7a 46 69 6c 65 29 3b 0a 20 20 20 20 70 50 61 67  zFile);.    pPag
2ada0 65 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d  er->dbHintSize =
2adb0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
2adc0 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 72  .  }..  while( r
2add0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2ade0 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50 67 6e  pList ){.    Pgn
2adf0 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e  o pgno = pList->
2ae00 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  pgno;..    /* If
2ae10 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79   there are dirty
2ae20 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61   pages in the pa
2ae30 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61  ge cache with pa
2ae40 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74  ge numbers great
2ae50 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50  er.    ** than P
2ae60 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69  ager.dbSize, thi
2ae70 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50  s means sqlite3P
2ae80 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
2ae90 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74  e() was called t
2aea0 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68  o.    ** make th
2aeb0 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28  e file smaller (
2aec0 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75  presumably by au
2aed0 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e  to-vacuum code).
2aee0 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20   Do not write.  
2aef0 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61    ** any such pa
2af00 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  ges to the file.
2af10 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
2af20 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74  lso, do not writ
2af30 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65 20 74  e out any page t
2af40 68 61 74 20 68 61 73 20 74 68 65 20 50 47 48 44  hat has the PGHD
2af50 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61  R_DONT_WRITE fla
2af60 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28 73 65  g.    ** set (se
2af70 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65  t by sqlite3Page
2af80 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a 20  rDontWrite()).. 
2af90 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67     */.    if( pg
2afa0 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69  no<=pPager->dbSi
2afb0 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d  ze && 0==(pList-
2afc0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e  >flags&PGHDR_DON
2afd0 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20  T_WRITE) ){.    
2afe0 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28    i64 offset = (
2aff0 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
2b000 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 20  ger->pageSize;  
2b010 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72   /* Offset to wr
2b020 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61  ite */.      cha
2b030 72 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20  r *pData;       
2b040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2b060 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a 2f 20  ata to write */ 
2b070 20 20 20 0a 0a 20 20 20 20 20 20 61 73 73 65 72     ..      asser
2b080 74 28 20 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73  t( (pList->flags
2b090 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
2b0a0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )==0 );.      if
2b0b0 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31  ( pList->pgno==1
2b0c0 20 29 20 70 61 67 65 72 5f 77 72 69 74 65 5f 63   ) pager_write_c
2b0d0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 4c 69  hangecounter(pLi
2b0e0 73 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45  st);..      /* E
2b0f0 6e 63 6f 64 65 20 74 68 65 20 64 61 74 61 62 61  ncode the databa
2b100 73 65 20 2a 2f 0a 20 20 20 20 20 20 43 4f 44 45  se */.      CODE
2b110 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74  C2(pPager, pList
2b120 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36  ->pData, pgno, 6
2b130 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
2b140 4e 4f 4d 45 4d 5f 42 4b 50 54 2c 20 70 44 61 74  NOMEM_BKPT, pDat
2b150 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72  a);..      /* Wr
2b160 69 74 65 20 6f 75 74 20 74 68 65 20 70 61 67 65  ite out the page
2b170 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20   data. */.      
2b180 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
2b190 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
2b1a0 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
2b1b0 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29  ageSize, offset)
2b1c0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  ;..      /* If p
2b1d0 61 67 65 20 31 20 77 61 73 20 6a 75 73 74 20 77  age 1 was just w
2b1e0 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50  ritten, update P
2b1f0 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20  ager.dbFileVers 
2b200 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a  to match.      *
2b210 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20  * the value now 
2b220 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61  stored in the da
2b230 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
2b240 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20  writing this .  
2b250 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73      ** page caus
2b260 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
2b270 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70  file to grow, up
2b280 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e  date dbFileSize.
2b290 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
2b2a0 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
2b2b0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2b2c0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
2b2d0 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20  rs, &pData[24], 
2b2e0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
2b2f0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
2b300 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
2b310 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69  gno>pPager->dbFi
2b320 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
2b330 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
2b340 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  Size = pgno;.   
2b350 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
2b360 72 2d 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53  r->aStat[PAGER_S
2b370 54 41 54 5f 57 52 49 54 45 5d 2b 2b 3b 0a 0a 20  TAT_WRITE]++;.. 
2b380 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61       /* Update a
2b390 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  ny backup object
2b3a0 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f  s copying the co
2b3b0 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70  ntents of this p
2b3c0 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73  ager. */.      s
2b3d0 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
2b3e0 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  te(pPager->pBack
2b3f0 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70  up, pgno, (u8*)p
2b400 4c 69 73 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20  List->pData);.. 
2b410 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
2b420 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  ("STORE %d page 
2b430 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
2b440 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2b450 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
2b460 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
2b470 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
2b480 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  )));.      IOTRA
2b490 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64  CE(("PGOUT %p %d
2b4a0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
2b4b0 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  o));.      PAGER
2b4c0 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
2b4d0 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
2b4e0 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
2b4f0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
2b500 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67  ("NOSTORE %d pag
2b510 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
2b520 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29  (pPager), pgno))
2b530 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
2b540 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 70  r_set_pagehash(p
2b550 4c 69 73 74 29 3b 0a 20 20 20 20 70 4c 69 73 74  List);.    pList
2b560 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
2b570 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2b580 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73  rc;.}../*.** Ens
2b590 75 72 65 20 74 68 61 74 20 74 68 65 20 73 75 62  ure that the sub
2b5a0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
2b5b0 20 6f 70 65 6e 2e 20 49 66 20 69 74 20 69 73 20   open. If it is 
2b5c0 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68  already open, th
2b5d0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
2b5e0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
2b5f0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
2b600 65 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79  eturned if every
2b610 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72  thing goes accor
2b620 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e  ding to plan. An
2b630 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52   .** SQLITE_IOER
2b640 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65  R_XXX error code
2b650 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2b660 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
2b670 33 4f 73 4f 70 65 6e 28 29 20 0a 2a 2a 20 66 61  3OsOpen() .** fa
2b680 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
2b690 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61  nt openSubJourna
2b6a0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
2b6b0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2b6c0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 69  ITE_OK;.  if( !i
2b6d0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
2b6e0 66 64 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  fd) ){.    const
2b6f0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 53 51   int flags =  SQ
2b700 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
2b710 52 4e 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RNAL | SQLITE_OP
2b720 45 4e 5f 52 45 41 44 57 52 49 54 45 20 0a 20 20  EN_READWRITE .  
2b730 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45      | SQLITE_OPE
2b740 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54  N_CREATE | SQLIT
2b750 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
2b760 20 0a 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45   .      | SQLITE
2b770 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
2b780 4f 53 45 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74  OSE;.    int nSt
2b790 6d 74 53 70 69 6c 6c 20 3d 20 73 71 6c 69 74 65  mtSpill = sqlite
2b7a0 33 43 6f 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69  3Config.nStmtSpi
2b7b0 6c 6c 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ll;.    if( pPag
2b7c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
2b7d0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
2b7e0 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61  DE_MEMORY || pPa
2b7f0 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72  ger->subjInMemor
2b800 79 20 29 7b 0a 20 20 20 20 20 20 6e 53 74 6d 74  y ){.      nStmt
2b810 53 70 69 6c 6c 20 3d 20 2d 31 3b 0a 20 20 20 20  Spill = -1;.    
2b820 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
2b830 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50  e3JournalOpen(pP
2b840 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70  ager->pVfs, 0, p
2b850 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 66 6c 61  Pager->sjfd, fla
2b860 67 73 2c 20 6e 53 74 6d 74 53 70 69 6c 6c 29 3b  gs, nStmtSpill);
2b870 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2b880 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
2b890 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68  d a record of th
2b8a0 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
2b8b0 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f 20 74  of page pPg to t
2b8c0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
2b8d0 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
2b8e0 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62 69  sful, set the bi
2b8f0 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
2b900 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20  to pPg->pgno in 
2b910 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20 66  the bitvecs.** f
2b920 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65  or all open save
2b930 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72 65  points before re
2b940 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  turning..**.** T
2b950 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
2b960 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 69  urns SQLITE_OK i
2b970 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
2b980 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 49  successful, an I
2b990 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  O.** error code 
2b9a0 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  if the attempt t
2b9b0 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 73  o write to the s
2b9c0 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c 73  ub-journal fails
2b9d0 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  , or .** SQLITE_
2b9e0 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f  NOMEM if a mallo
2b9f0 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73 65  c fails while se
2ba00 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20 61  tting a bit in a
2ba10 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62 69   savepoint.** bi
2ba20 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tvec..*/.static 
2ba30 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  int subjournalPa
2ba40 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
2ba50 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2ba60 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
2ba70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
2ba80 67 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ger;.  if( pPage
2ba90 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
2baa0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2bab0 45 5f 4f 46 46 20 29 7b 0a 0a 20 20 20 20 2f 2a  E_OFF ){..    /*
2bac0 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f   Open the sub-jo
2bad0 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 68 61 73  urnal, if it has
2bae0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65   not already bee
2baf0 6e 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 20 20  n opened */.    
2bb00 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2bb10 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
2bb20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
2bb30 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c  (pPager->jfd) ||
2bb40 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
2bb50 67 65 72 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ger) );.    asse
2bb60 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
2bb70 72 2d 3e 73 6a 66 64 29 20 7c 7c 20 70 50 61 67  r->sjfd) || pPag
2bb80 65 72 2d 3e 6e 53 75 62 52 65 63 3d 3d 30 20 29  er->nSubRec==0 )
2bb90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61  ;.    assert( pa
2bba0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
2bbb0 29 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  ) .         || p
2bbc0 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 61  ageInJournal(pPa
2bbd0 67 65 72 2c 20 70 50 67 29 20 0a 20 20 20 20 20  ger, pPg) .     
2bbe0 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f      || pPg->pgno
2bbf0 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  >pPager->dbOrigS
2bc00 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20 20 20  ize .    );.    
2bc10 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72  rc = openSubJour
2bc20 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  nal(pPager);..  
2bc30 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d    /* If the sub-
2bc40 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70 65 6e  journal was open
2bc50 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ed successfully 
2bc60 28 6f 72 20 77 61 73 20 61 6c 72 65 61 64 79 20  (or was already 
2bc70 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20 77 72  open),.    ** wr
2bc80 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ite the journal 
2bc90 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
2bca0 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  file.  */.    if
2bcb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2bcc0 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  ){.      void *p
2bcd0 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
2bce0 61 3b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  a;.      i64 off
2bcf0 73 65 74 20 3d 20 28 69 36 34 29 70 50 61 67 65  set = (i64)pPage
2bd00 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50  r->nSubRec*(4+pP
2bd10 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
2bd20 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61  .      char *pDa
2bd30 74 61 32 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  ta2;..#if SQLITE
2bd40 5f 48 41 53 5f 43 4f 44 45 43 20 20 20 0a 20 20  _HAS_CODEC   .  
2bd50 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
2bd60 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b  >subjInMemory ){
2bd70 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 32 28  .        CODEC2(
2bd80 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
2bd90 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74  Pg->pgno, 7, ret
2bda0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2bdb0 5f 42 4b 50 54 2c 20 70 44 61 74 61 32 29 3b 0a  _BKPT, pData2);.
2bdc0 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
2bdd0 69 66 0a 20 20 20 20 20 20 70 44 61 74 61 32 20  if.      pData2 
2bde0 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 20 20 50  = pData;.      P
2bdf0 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4d 54  AGERTRACE(("STMT
2be00 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  -JOURNAL %d page
2be10 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
2be20 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
2be30 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  no));.      rc =
2be40 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
2be50 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65  ger->sjfd, offse
2be60 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  t, pPg->pgno);. 
2be70 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2be80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2be90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2bea0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 6a  Write(pPager->sj
2beb0 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67  fd, pData2, pPag
2bec0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
2bed0 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d  fset+4);.      }
2bee0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2bef0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2bf00 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53  {.    pPager->nS
2bf10 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73  ubRec++;.    ass
2bf20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61  ert( pPager->nSa
2bf30 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20  vepoint>0 );.   
2bf40 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70   rc = addToSavep
2bf50 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
2bf60 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  er, pPg->pgno);.
2bf70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2bf80 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  .}.static int su
2bf90 62 6a 6f 75 72 6e 61 6c 50 61 67 65 49 66 52 65  bjournalPageIfRe
2bfa0 71 75 69 72 65 64 28 50 67 48 64 72 20 2a 70 50  quired(PgHdr *pP
2bfb0 67 29 7b 0a 20 20 69 66 28 20 73 75 62 6a 52 65  g){.  if( subjRe
2bfc0 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
2bfd0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 75  ){.    return su
2bfe0 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67  bjournalPage(pPg
2bff0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2c000 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2c010 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
2c020 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2c030 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63  called by the pc
2c040 61 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20  ache layer when 
2c050 69 74 20 68 61 73 20 72 65 61 63 68 65 64 20 73  it has reached s
2c060 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f  ome.** soft memo
2c070 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69  ry limit. The fi
2c080 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
2c090 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50  a pointer to a P
2c0a0 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28  ager object.** (
2c0b0 63 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29  cast as a void*)
2c0c0 2e 20 54 68 65 20 70 61 67 65 72 20 69 73 20 61  . The pager is a
2c0d0 6c 77 61 79 73 20 27 70 75 72 67 65 61 62 6c 65  lways 'purgeable
2c0e0 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d  ' (not an in-mem
2c0f0 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29  ory.** database)
2c100 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  . The second arg
2c110 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65 72  ument is a refer
2c120 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20 74  ence to a page t
2c130 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65  hat is .** curre
2c140 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74 20 68  ntly dirty but h
2c150 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  as no outstandin
2c160 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68  g references. Th
2c170 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77  e page.** is alw
2c180 61 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ays associated w
2c190 69 74 68 20 74 68 65 20 50 61 67 65 72 20 6f 62  ith the Pager ob
2c1a0 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
2c1b0 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67  he first .** arg
2c1c0 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ument..**.** The
2c1d0 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e   job of this fun
2c1e0 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65  ction is to make
2c1f0 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72   pPg clean by wr
2c200 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e  iting its conten
2c210 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65  ts.** out to the
2c220 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2c230 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69  if possible. Thi
2c240 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79  s may involve sy
2c250 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75  ncing the.** jou
2c260 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  rnal file. .**.*
2c270 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
2c280 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
2c290 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c  keClean() is cal
2c2a0 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20  led on the page 
2c2b0 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  and.** SQLITE_OK
2c2c0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
2c2d0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
2c2e0 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
2c2f0 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67   make the.** pag
2c300 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20  e clean, the IO 
2c310 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
2c320 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70  turned. If the p
2c330 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  age cannot be.**
2c340 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20   made clean for 
2c350 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f  some other reaso
2c360 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  n, but no error 
2c370 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c  occurs, then SQL
2c380 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74  ITE_OK.** is ret
2c390 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
2c3a0 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
2c3b0 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e  ) is not called.
2c3c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2c3d0 61 67 65 72 53 74 72 65 73 73 28 76 6f 69 64 20  agerStress(void 
2c3e0 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b  *p, PgHdr *pPg){
2c3f0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2c400 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20   = (Pager *)p;. 
2c410 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2c420 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
2c430 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  pPg->pPager==pPa
2c440 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ger );.  assert(
2c450 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
2c460 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a  R_DIRTY );..  /*
2c470 20 54 68 65 20 64 6f 4e 6f 74 53 70 69 6c 6c 20   The doNotSpill 
2c480 4e 4f 53 59 4e 43 20 62 69 74 20 69 73 20 73 65  NOSYNC bit is se
2c490 74 20 64 75 72 69 6e 67 20 74 69 6d 65 73 20 77  t during times w
2c4a0 68 65 6e 20 64 6f 69 6e 67 20 61 20 73 79 6e 63  hen doing a sync
2c4b0 20 6f 66 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c   of.  ** journal
2c4c0 20 28 61 6e 64 20 61 64 64 69 6e 67 20 61 20 6e   (and adding a n
2c4d0 65 77 20 68 65 61 64 65 72 29 20 69 73 20 6e 6f  ew header) is no
2c4e0 74 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 69 73  t allowed.  This
2c4f0 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72   occurs.  ** dur
2c500 69 6e 67 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ing calls to sql
2c510 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
2c520 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
2c530 20 6a 6f 75 72 6e 61 6c 20 6d 75 6c 74 69 70 6c   journal multipl
2c540 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 65 6c  e.  ** pages bel
2c550 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 73 61  onging to the sa
2c560 6d 65 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2a 0a  me sector..  **.
2c570 20 20 2a 2a 20 54 68 65 20 64 6f 4e 6f 74 53 70    ** The doNotSp
2c580 69 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64  ill ROLLBACK and
2c590 20 4f 46 46 20 62 69 74 73 20 69 6e 68 69 62 69   OFF bits inhibi
2c5a0 74 73 20 61 6c 6c 20 63 61 63 68 65 20 73 70 69  ts all cache spi
2c5b0 6c 6c 69 6e 67 0a 20 20 2a 2a 20 72 65 67 61 72  lling.  ** regar
2c5c0 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
2c5d0 20 6f 72 20 6e 6f 74 20 61 20 73 79 6e 63 20 69   or not a sync i
2c5e0 73 20 72 65 71 75 69 72 65 64 2e 20 20 54 68 69  s required.  Thi
2c5f0 73 20 69 73 20 73 65 74 20 64 75 72 69 6e 67 0a  s is set during.
2c600 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20    ** a rollback 
2c610 6f 72 20 62 79 20 75 73 65 72 20 72 65 71 75 65  or by user reque
2c620 73 74 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  st, respectively
2c630 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 70 69 6c  ..  **.  ** Spil
2c640 6c 69 6e 67 20 69 73 20 61 6c 73 6f 20 70 72 6f  ling is also pro
2c650 68 69 62 69 74 65 64 20 77 68 65 6e 20 69 6e 20  hibited when in 
2c660 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 73  an error state s
2c670 69 6e 63 65 20 74 68 61 74 20 63 6f 75 6c 64 0a  ince that could.
2c680 20 20 2a 2a 20 6c 65 61 64 20 74 6f 20 64 61 74    ** lead to dat
2c690 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
2c6a0 2e 20 20 20 49 6e 20 74 68 65 20 63 75 72 72 65  .   In the curre
2c6b0 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
2c6c0 6e 20 69 74 20 0a 20 20 2a 2a 20 69 73 20 69 6d  n it .  ** is im
2c6d0 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 73 71 6c  possible for sql
2c6e0 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
2c6f0 29 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 77  ) to be called w
2c700 69 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d  ith createFlag==
2c710 33 0a 20 20 2a 2a 20 77 68 69 6c 65 20 69 6e 20  3.  ** while in 
2c720 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
2c730 20 68 65 6e 63 65 20 69 74 20 69 73 20 69 6d 70   hence it is imp
2c740 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73  ossible for this
2c750 20 72 6f 75 74 69 6e 65 20 74 6f 0a 20 20 2a 2a   routine to.  **
2c760 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 20 74 68   be called in th
2c770 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 20  e error state.  
2c780 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 77 65  Nevertheless, we
2c790 20 69 6e 63 6c 75 64 65 20 61 20 4e 45 56 45 52   include a NEVER
2c7a0 28 29 0a 20 20 2a 2a 20 74 65 73 74 20 66 6f 72  ().  ** test for
2c7b0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2c7c0 20 61 73 20 61 20 73 61 66 65 67 75 61 72 64 20   as a safeguard 
2c7d0 61 67 61 69 6e 73 74 20 66 75 74 75 72 65 20 63  against future c
2c7e0 68 61 6e 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  hanges..  */.  i
2c7f0 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
2c800 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75  >errCode) ) retu
2c810 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2c820 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72  testcase( pPager
2c830 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20 26 20 53  ->doNotSpill & S
2c840 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c 4c 42 41 43  PILLFLAG_ROLLBAC
2c850 4b 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  K );.  testcase(
2c860 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 70   pPager->doNotSp
2c870 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41 47 5f  ill & SPILLFLAG_
2c880 4f 46 46 20 29 3b 0a 20 20 74 65 73 74 63 61 73  OFF );.  testcas
2c890 65 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  e( pPager->doNot
2c8a0 53 70 69 6c 6c 20 26 20 53 50 49 4c 4c 46 4c 41  Spill & SPILLFLA
2c8b0 47 5f 4e 4f 53 59 4e 43 20 29 3b 0a 20 20 69 66  G_NOSYNC );.  if
2c8c0 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
2c8d0 70 69 6c 6c 0a 20 20 20 26 26 20 28 28 70 50 61  pill.   && ((pPa
2c8e0 67 65 72 2d 3e 64 6f 4e 6f 74 53 70 69 6c 6c 20  ger->doNotSpill 
2c8f0 26 20 28 53 50 49 4c 4c 46 4c 41 47 5f 52 4f 4c  & (SPILLFLAG_ROL
2c900 4c 42 41 43 4b 7c 53 50 49 4c 4c 46 4c 41 47 5f  LBACK|SPILLFLAG_
2c910 4f 46 46 29 29 21 3d 30 0a 20 20 20 20 20 20 7c  OFF))!=0.      |
2c920 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 20 26 20  | (pPg->flags & 
2c930 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
2c940 21 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 72 65  !=0).  ){.    re
2c950 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2c960 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 61    }..  pPager->a
2c970 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f  Stat[PAGER_STAT_
2c980 53 50 49 4c 4c 5d 2b 2b 3b 0a 20 20 70 50 67 2d  SPILL]++;.  pPg-
2c990 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 69  >pDirty = 0;.  i
2c9a0 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28 70  f( pagerUseWal(p
2c9b0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f 2a  Pager) ){.    /*
2c9c0 20 57 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20   Write a single 
2c9d0 66 72 61 6d 65 20 66 6f 72 20 74 68 69 73 20 70  frame for this p
2c9e0 61 67 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e 20  age to the log. 
2c9f0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 75 62 6a  */.    rc = subj
2ca00 6f 75 72 6e 61 6c 50 61 67 65 49 66 52 65 71 75  ournalPageIfRequ
2ca10 69 72 65 64 28 70 50 67 29 3b 20 0a 20 20 20 20  ired(pPg); .    
2ca20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2ca30 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
2ca40 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 70  pagerWalFrames(p
2ca50 50 61 67 65 72 2c 20 70 50 67 2c 20 30 2c 20 30  Pager, pPg, 0, 0
2ca60 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
2ca70 7b 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53 51  {.    .#ifdef SQ
2ca80 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43  LITE_ENABLE_BATC
2ca90 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  H_ATOMIC_WRITE. 
2caa0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74     if( pPager->t
2cab0 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  empFile==0 ){.  
2cac0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2cad0 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50  JournalCreate(pP
2cae0 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
2caf0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2cb00 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 70 61 67  _OK ) return pag
2cb10 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
2cb20 20 72 63 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   rc);.    }.#end
2cb30 69 66 0a 20 20 0a 20 20 20 20 2f 2a 20 53 79 6e  if.  .    /* Syn
2cb40 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
2cb50 6c 65 20 69 66 20 72 65 71 75 69 72 65 64 2e 20  le if required. 
2cb60 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  */.    if( pPg->
2cb70 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
2cb80 5f 53 59 4e 43 20 0a 20 20 20 20 20 7c 7c 20 70  _SYNC .     || p
2cb90 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d 50  Pager->eState==P
2cba0 41 47 45 52 5f 57 52 49 54 45 52 5f 43 41 43 48  AGER_WRITER_CACH
2cbb0 45 4d 4f 44 0a 20 20 20 20 29 7b 0a 20 20 20 20  EMOD.    ){.    
2cbc0 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
2cbd0 61 6c 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  al(pPager, 1);. 
2cbe0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57     }.  .    /* W
2cbf0 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  rite the content
2cc00 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75  s of the page ou
2cc10 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
2cc20 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  e file. */.    i
2cc30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2cc40 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2cc50 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  ( (pPg->flags&PG
2cc60 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3d 3d  HDR_NEED_SYNC)==
2cc70 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
2cc80 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
2cc90 6c 69 73 74 28 70 50 61 67 65 72 2c 20 70 50 67  list(pPager, pPg
2cca0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
2ccb0 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  /* Mark the page
2ccc0 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20   as clean. */.  
2ccd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2cce0 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52  K ){.    PAGERTR
2ccf0 41 43 45 28 28 22 53 54 52 45 53 53 20 25 64 20  ACE(("STRESS %d 
2cd00 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
2cd10 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
2cd20 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71  ->pgno));.    sq
2cd30 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
2cd40 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a  lean(pPg);.  }..
2cd50 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
2cd60 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
2cd70 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73  ; .}../*.** Flus
2cd80 68 20 61 6c 6c 20 75 6e 72 65 66 65 72 65 6e 63  h all unreferenc
2cd90 65 64 20 64 69 72 74 79 20 70 61 67 65 73 20 74  ed dirty pages t
2cda0 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  o disk..*/.int s
2cdb0 71 6c 69 74 65 33 50 61 67 65 72 46 6c 75 73 68  qlite3PagerFlush
2cdc0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2cdd0 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67  .  int rc = pPag
2cde0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69  er->errCode;.  i
2cdf0 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
2ce00 20 50 67 48 64 72 20 2a 70 4c 69 73 74 20 3d 20   PgHdr *pList = 
2ce10 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72  sqlite3PcacheDir
2ce20 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70  tyList(pPager->p
2ce30 50 43 61 63 68 65 29 3b 0a 20 20 20 20 61 73 73  PCache);.    ass
2ce40 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65  ert( assert_page
2ce50 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20  r_state(pPager) 
2ce60 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  );.    while( rc
2ce70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
2ce80 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 50 67  List ){.      Pg
2ce90 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c 69  Hdr *pNext = pLi
2cea0 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  st->pDirty;.    
2ceb0 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 52 65    if( pList->nRe
2cec0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
2ced0 72 63 20 3d 20 70 61 67 65 72 53 74 72 65 73 73  rc = pagerStress
2cee0 28 28 76 6f 69 64 2a 29 70 50 61 67 65 72 2c 20  ((void*)pPager, 
2cef0 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  pList);.      }.
2cf00 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4e        pList = pN
2cf10 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ext;.    }.  }..
2cf20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2cf30 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
2cf40 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20  nd initialize a 
2cf50 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65 63 74  new Pager object
2cf60 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74   and put a point
2cf70 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e 20 2a  er to it.** in *
2cf80 70 70 50 61 67 65 72 2e 20 54 68 65 20 70 61 67  ppPager. The pag
2cf90 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e 74 75  er should eventu
2cfa0 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20 62 79  ally be freed by
2cfb0 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a 20 74   passing it.** t
2cfc0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c  o sqlite3PagerCl
2cfd0 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ose()..**.** The
2cfe0 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d   zFilename argum
2cff0 65 6e 74 20 69 73 20 74 68 65 20 70 61 74 68 20  ent is the path 
2d000 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2d010 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a 2a 2a  file to open..**
2d020 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
2d030 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e   NULL then a ran
2d040 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70  domly-named temp
2d050 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72  orary file is cr
2d060 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65  eated.** and use
2d070 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f  d as the file to
2d080 20 62 65 20 63 61 63 68 65 64 2e 20 54 65 6d 70   be cached. Temp
2d090 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72 65 20  orary files are 
2d0a0 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75  be deleted.** au
2d0b0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e  tomatically when
2d0c0 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73 65 64   they are closed
2d0d0 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  . If zFilename i
2d0e0 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65  s ":memory:" the
2d0f0 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f 72 6d  n .** all inform
2d100 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e  ation is held in
2d110 20 63 61 63 68 65 2e 20 49 74 20 69 73 20 6e 65   cache. It is ne
2d120 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64  ver written to d
2d130 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20 63 61  isk. .** This ca
2d140 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70  n be used to imp
2d150 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d 65 6d  lement an in-mem
2d160 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  ory database..**
2d170 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61 20 70  .** The nExtra p
2d180 61 72 61 6d 65 74 65 72 20 73 70 65 63 69 66 69  arameter specifi
2d190 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
2d1a0 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
2d1b0 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f  allocated.** alo
2d1c0 6e 67 20 77 69 74 68 20 65 61 63 68 20 70 61 67  ng with each pag
2d1d0 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69  e reference. Thi
2d1e0 73 20 73 70 61 63 65 20 69 73 20 61 76 61 69 6c  s space is avail
2d1f0 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72  able to the user
2d200 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71 6c 69  .** via the sqli
2d210 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
2d220 28 29 20 41 50 49 2e 20 20 57 68 65 6e 20 61 20  () API.  When a 
2d230 6e 65 77 20 70 61 67 65 20 69 73 20 61 6c 6c 6f  new page is allo
2d240 63 61 74 65 64 2c 20 74 68 65 0a 2a 2a 20 66 69  cated, the.** fi
2d250 72 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74  rst 8 bytes of t
2d260 68 69 73 20 73 70 61 63 65 20 61 72 65 20 7a 65  his space are ze
2d270 72 6f 65 64 20 62 75 74 20 74 68 65 20 72 65 6d  roed but the rem
2d280 61 69 6e 64 65 72 20 69 73 20 75 6e 69 6e 69 74  ainder is uninit
2d290 69 61 6c 69 7a 65 64 2e 0a 2a 2a 20 28 54 68 65  ialized..** (The
2d2a0 20 65 78 74 72 61 20 73 70 61 63 65 20 69 73 20   extra space is 
2d2b0 75 73 65 64 20 62 79 20 62 74 72 65 65 20 61 73  used by btree as
2d2c0 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
2d2d0 65 63 74 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ect.).**.** The 
2d2e0 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69  flags argument i
2d2f0 73 20 75 73 65 64 20 74 6f 20 73 70 65 63 69 66  s used to specif
2d300 79 20 70 72 6f 70 65 72 74 69 65 73 20 74 68 61  y properties tha
2d310 74 20 61 66 66 65 63 74 20 74 68 65 0a 2a 2a 20  t affect the.** 
2d320 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
2d330 20 70 61 67 65 72 2e 20 49 74 20 73 68 6f 75 6c   pager. It shoul
2d340 64 20 62 65 20 70 61 73 73 65 64 20 73 6f 6d 65  d be passed some
2d350 20 62 69 74 77 69 73 65 20 63 6f 6d 62 69 6e 61   bitwise combina
2d360 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50  tion.** of the P
2d370 41 47 45 52 5f 2a 20 66 6c 61 67 73 2e 0a 2a 2a  AGER_* flags..**
2d380 0a 2a 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73  .** The vfsFlags
2d390 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
2d3a0 62 69 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20  bitmask to pass 
2d3b0 74 6f 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  to the flags par
2d3c0 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65  ameter.** of the
2d3d0 20 78 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20   xOpen() method 
2d3e0 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  of the supplied 
2d3f0 56 46 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  VFS when opening
2d400 20 66 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49   files. .**.** I
2d410 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  f the pager obje
2d420 63 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ct is allocated 
2d430 61 6e 64 20 74 68 65 20 73 70 65 63 69 66 69 65  and the specifie
2d440 64 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a  d file opened .*
2d450 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  * successfully, 
2d460 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2d470 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
2d480 65 72 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  er set to point 
2d490 74 6f 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61  to.** the new pa
2d4a0 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61  ger object. If a
2d4b0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2d4c0 2a 70 70 50 61 67 65 72 20 69 73 20 73 65 74 20  *ppPager is set 
2d4d0 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65  to NULL.** and e
2d4e0 72 72 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e  rror code return
2d4f0 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ed. This functio
2d500 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  n may return SQL
2d510 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71  ITE_NOMEM.** (sq
2d520 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73  lite3Malloc() is
2d530 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
2d540 65 20 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54  e memory), SQLIT
2d550 45 5f 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a  E_CANTOPEN or .*
2d560 2a 20 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45  * various SQLITE
2d570 5f 49 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a  _IO_XXX errors..
2d580 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2d590 67 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  gerOpen(.  sqlit
2d5a0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
2d5b0 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75      /* The virtu
2d5c0 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74  al file system t
2d5d0 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72  o use */.  Pager
2d5e0 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20   **ppPager,     
2d5f0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75      /* OUT: Retu
2d600 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72  rn the Pager str
2d610 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
2d620 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
2d630 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d  lename,   /* Nam
2d640 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2d650 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  e file to open *
2d660 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
2d670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d680 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65  Extra bytes appe
2d690 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  nd to each in-me
2d6a0 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
2d6b0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
2d6c0 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
2d6d0 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69   controlling thi
2d6e0 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s file */.  int 
2d6f0 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20 20  vfsFlags,       
2d700 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61       /* flags pa
2d710 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
2d720 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
2d730 6e 28 29 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  n() */.  void (*
2d740 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a  xReinit)(DbPage*
2d750 29 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f  ) /* Function to
2d760 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61   reinitialize pa
2d770 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  ges */.){.  u8 *
2d780 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70  pPtr;.  Pager *p
2d790 50 61 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20  Pager = 0;      
2d7a0 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
2d7b0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64   to allocate and
2d7c0 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
2d7d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2d7e0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2d7f0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65  code */.  int te
2d800 6d 70 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20  mpFile = 0;     
2d810 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74     /* True for t
2d820 65 6d 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e  emp files (incl.
2d830 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73   in-memory files
2d840 29 20 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62  ) */.  int memDb
2d850 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2d860 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
2d870 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
2d880 66 69 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 53  file */.#ifdef S
2d890 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53  QLITE_ENABLE_DES
2d8a0 45 52 49 41 4c 49 5a 45 0a 20 20 69 6e 74 20 6d  ERIALIZE.  int m
2d8b0 65 6d 4a 4d 20 3d 20 30 3b 20 20 20 20 20 20 20  emJM = 0;       
2d8c0 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6a 6f      /* Memory jo
2d8d0 75 72 6e 61 6c 20 6d 6f 64 65 20 2a 2f 0a 23 65  urnal mode */.#e
2d8e0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 6d 65 6d  lse.# define mem
2d8f0 4a 4d 20 30 0a 23 65 6e 64 69 66 0a 20 20 69 6e  JM 0.#endif.  in
2d900 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 20  t readOnly = 0; 
2d910 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2d920 66 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  f this is a read
2d930 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20 20  -only file */.  
2d940 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53  int journalFileS
2d950 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74 65  ize;     /* Byte
2d960 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f  s to allocate fo
2d970 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66  r each journal f
2d980 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61  d */.  char *zPa
2d990 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  thname = 0;     
2d9a0 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f 20  /* Full path to 
2d9b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2d9c0 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65  .  int nPathname
2d9d0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
2d9e0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
2d9f0 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20  n zPathname */. 
2da00 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20   int useJournal 
2da10 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
2da20 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d  _OMIT_JOURNAL)==
2da30 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20 6f  0; /* False to o
2da40 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  mit journal */. 
2da50 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20   int pcacheSize 
2da60 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53  = sqlite3PcacheS
2da70 69 7a 65 28 29 3b 20 20 20 20 20 20 20 2f 2a 20  ize();       /* 
2da80 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74  Bytes to allocat
2da90 65 20 66 6f 72 20 50 43 61 63 68 65 20 2a 2f 0a  e for PCache */.
2daa0 20 20 75 33 32 20 73 7a 50 61 67 65 44 66 6c 74    u32 szPageDflt
2dab0 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
2dac0 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20 2f 2a  T_PAGE_SIZE;  /*
2dad0 20 44 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   Default page si
2dae0 7a 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ze */.  const ch
2daf0 61 72 20 2a 7a 55 72 69 20 3d 20 30 3b 20 20 20  ar *zUri = 0;   
2db00 20 2f 2a 20 55 52 49 20 61 72 67 73 20 74 6f 20   /* URI args to 
2db10 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 55  copy */.  int nU
2db20 72 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ri = 0;         
2db30 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2db40 62 79 74 65 73 20 6f 66 20 55 52 49 20 61 72 67  bytes of URI arg
2db50 73 20 61 74 20 2a 7a 55 72 69 20 2a 2f 0a 0a 20  s at *zUri */.. 
2db60 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
2db70 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73  ow much space is
2db80 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61   required for ea
2db90 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d  ch journal file-
2dba0 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65  handle.  ** (the
2dbb0 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68  re are two of th
2dbc0 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  em, the main jou
2dbd0 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62  rnal and the sub
2dbe0 2d 6a 6f 75 72 6e 61 6c 29 2e 20 20 2a 2f 0a 20  -journal).  */. 
2dbf0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2dc00 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65   = ROUND8(sqlite
2dc10 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
2dc20 73 29 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  s));..  /* Set t
2dc30 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  he output variab
2dc40 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 63 61  le to NULL in ca
2dc50 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  se an error occu
2dc60 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  rs. */.  *ppPage
2dc70 72 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20  r = 0;..#ifndef 
2dc80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
2dc90 52 59 44 42 0a 20 20 69 66 28 20 66 6c 61 67 73  RYDB.  if( flags
2dca0 20 26 20 50 41 47 45 52 5f 4d 45 4d 4f 52 59 20   & PAGER_MEMORY 
2dcb0 29 7b 0a 20 20 20 20 6d 65 6d 44 62 20 3d 20 31  ){.    memDb = 1
2dcc0 3b 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e  ;.    if( zFilen
2dcd0 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
2dce0 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 50 61  [0] ){.      zPa
2dcf0 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
2dd00 44 62 53 74 72 44 75 70 28 30 2c 20 7a 46 69 6c  DbStrDup(0, zFil
2dd10 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  ename);.      if
2dd20 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 20  ( zPathname==0  
2dd30 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2dd40 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
2dd50 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    nPathname = sq
2dd60 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50  lite3Strlen30(zP
2dd70 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
2dd80 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  zFilename = 0;. 
2dd90 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
2dda0 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e  .  /* Compute an
2ddb0 64 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c  d store the full
2ddc0 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20   pathname in an 
2ddd0 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
2dde0 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f   pointed.  ** to
2ddf0 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c   by zPathname, l
2de00 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e  ength nPathname.
2de10 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73 20   Or, if this is 
2de20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
2de30 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74  ,.  ** leave bot
2de40 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20  h nPathname and 
2de50 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f  zPathname set to
2de60 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a   0..  */.  if( z
2de70 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
2de80 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20  ename[0] ){.    
2de90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
2dea0 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70     nPathname = p
2deb0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
2dec0 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65  1;.    zPathname
2ded0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
2dee0 6f 63 52 61 77 28 30 2c 20 6e 50 61 74 68 6e 61  ocRaw(0, nPathna
2def0 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a  me*2);.    if( z
2df00 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Pathname==0 ){. 
2df10 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2df20 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
2df30 20 20 20 7d 0a 20 20 20 20 7a 50 61 74 68 6e 61     }.    zPathna
2df40 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a 20 4d 61  me[0] = 0; /* Ma
2df50 6b 65 20 73 75 72 65 20 69 6e 69 74 69 61 6c 69  ke sure initiali
2df60 7a 65 64 20 65 76 65 6e 20 69 66 20 46 75 6c 6c  zed even if Full
2df70 50 61 74 68 6e 61 6d 65 28 29 20 66 61 69 6c 73  Pathname() fails
2df80 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2df90 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
2dfa0 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
2dfb0 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a  me, nPathname, z
2dfc0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6e  Pathname);.    n
2dfd0 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
2dfe0 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
2dff0 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 7a  name);.    z = z
2e000 55 72 69 20 3d 20 26 7a 46 69 6c 65 6e 61 6d 65  Uri = &zFilename
2e010 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  [sqlite3Strlen30
2e020 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 5d 3b 0a  (zFilename)+1];.
2e030 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b      while( *z ){
2e040 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c 69  .      z += sqli
2e050 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 31  te3Strlen30(z)+1
2e060 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 73 71 6c  ;.      z += sql
2e070 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b  ite3Strlen30(z)+
2e080 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 55 72  1;.    }.    nUr
2e090 69 20 3d 20 28 69 6e 74 29 28 26 7a 5b 31 5d 20  i = (int)(&z[1] 
2e0a0 2d 20 7a 55 72 69 29 3b 0a 20 20 20 20 61 73 73  - zUri);.    ass
2e0b0 65 72 74 28 20 6e 55 72 69 3e 3d 30 20 29 3b 0a  ert( nUri>=0 );.
2e0c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2e0d0 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68 6e 61  TE_OK && nPathna
2e0e0 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50 61 74  me+8>pVfs->mxPat
2e0f0 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 2f  hname ){.      /
2e100 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
2e110 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68 65 20   taken when the 
2e120 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20 72 65 71  journal path req
2e130 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a  uired by.      *
2e140 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  * the database b
2e150 65 69 6e 67 20 6f 70 65 6e 65 64 20 77 69 6c 6c  eing opened will
2e160 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20 70 56   be more than pV
2e170 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 20  fs->mxPathname. 
2e180 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 69 6e       ** bytes in
2e190 20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20 6d 65   length. This me
2e1a0 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
2e1b0 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65   cannot be opene
2e1c0 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69  d,.      ** as i
2e1d0 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70 6f  t will not be po
2e1e0 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74  ssible to open t
2e1f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2e200 6f 72 20 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a  or even.      **
2e210 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68 6f 74   check for a hot
2e220 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20  -journal before 
2e230 72 65 61 64 69 6e 67 2e 0a 20 20 20 20 20 20 2a  reading..      *
2e240 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
2e250 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
2e260 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
2e270 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2e280 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
2e290 62 46 72 65 65 28 30 2c 20 7a 50 61 74 68 6e 61  bFree(0, zPathna
2e2a0 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
2e2b0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
2e2c0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
2e2d0 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61  emory for the Pa
2e2e0 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 50  ger structure, P
2e2f0 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68  Cache object, th
2e300 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c  e.  ** three fil
2e310 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74  e descriptors, t
2e320 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e330 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f   name and the jo
2e340 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65  urnal .  ** file
2e350 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75   name. The layou
2e360 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61  t in memory is a
2e370 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a  s follows:.  **.
2e380 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f    **     Pager o
2e390 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20  bject           
2e3a0 20 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66           (sizeof
2e3b0 28 50 61 67 65 72 29 20 62 79 74 65 73 29 0a 20  (Pager) bytes). 
2e3c0 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f   **     PCache o
2e3d0 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20  bject           
2e3e0 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
2e3f0 50 63 61 63 68 65 53 69 7a 65 28 29 20 62 79 74  PcacheSize() byt
2e400 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74  es).  **     Dat
2e410 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c  abase file handl
2e420 65 20 20 20 20 20 20 20 20 20 20 20 20 28 70 56  e            (pV
2e430 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74  fs->szOsFile byt
2e440 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62  es).  **     Sub
2e450 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61  -journal file ha
2e460 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f  ndle         (jo
2e470 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79  urnalFileSize by
2e480 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61  tes).  **     Ma
2e490 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  in journal file 
2e4a0 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a  handle        (j
2e4b0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62  ournalFileSize b
2e4c0 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44  ytes).  **     D
2e4d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
2e4e0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  e              (
2e4f0 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65  nPathname+1 byte
2e500 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72  s).  **     Jour
2e510 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20  nal file name   
2e520 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61              (nPa
2e530 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73  thname+8+1 bytes
2e540 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20  ).  */.  pPtr = 
2e550 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  (u8 *)sqlite3Mal
2e560 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55  locZero(.    ROU
2e570 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67  ND8(sizeof(*pPag
2e580 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50  er)) +      /* P
2e590 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a  ager structure *
2e5a0 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61  /.    ROUND8(pca
2e5b0 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20  cheSize) +      
2e5c0 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f       /* PCache o
2e5d0 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55  bject */.    ROU
2e5e0 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ND8(pVfs->szOsFi
2e5f0 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54  le) +       /* T
2e600 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20  he main db file 
2e610 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  */.    journalFi
2e620 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20  leSize * 2 +    
2e630 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f        /* The two
2e640 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
2e650 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  / .    nPathname
2e660 20 2b 20 31 20 2b 20 6e 55 72 69 20 2b 20 20 20   + 1 + nUri +   
2e670 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
2e680 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e  me */.    nPathn
2e690 61 6d 65 20 2b 20 38 20 2b 20 32 20 20 20 20 20  ame + 8 + 2     
2e6a0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75           /* zJou
2e6b0 72 6e 61 6c 20 2a 2f 0a 23 69 66 6e 64 65 66 20  rnal */.#ifndef 
2e6c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
2e6d0 20 20 20 20 2b 20 6e 50 61 74 68 6e 61 6d 65 20      + nPathname 
2e6e0 2b 20 34 20 2b 20 32 20 20 20 20 20 20 20 20 20  + 4 + 2         
2e6f0 20 20 20 2f 2a 20 7a 57 61 6c 20 2a 2f 0a 23 65     /* zWal */.#e
2e700 6e 64 69 66 0a 20 20 29 3b 0a 20 20 61 73 73 65  ndif.  );.  asse
2e710 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
2e720 4c 49 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f  LIGNMENT(SQLITE_
2e730 49 4e 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e  INT_TO_PTR(journ
2e740 61 6c 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a  alFileSize)) );.
2e750 20 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20    if( !pPtr ){. 
2e760 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2e770 28 30 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  (0, zPathname);.
2e780 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2e790 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
2e7a0 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20 20  }.  pPager =    
2e7b0 20 20 20 20 20 20 20 20 20 20 28 50 61 67 65 72            (Pager
2e7c0 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61 67  *)(pPtr);.  pPag
2e7d0 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20 20  er->pPCache =   
2e7e0 20 28 50 43 61 63 68 65 2a 29 28 70 50 74 72 20   (PCache*)(pPtr 
2e7f0 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  += ROUND8(sizeof
2e800 28 2a 70 50 61 67 65 72 29 29 29 3b 0a 20 20 70  (*pPager)));.  p
2e810 50 61 67 65 72 2d 3e 66 64 20 3d 20 20 20 28 73  Pager->fd =   (s
2e820 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50  qlite3_file*)(pP
2e830 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70 63 61  tr += ROUND8(pca
2e840 63 68 65 53 69 7a 65 29 29 3b 0a 20 20 70 50 61  cheSize));.  pPa
2e850 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c  ger->sjfd = (sql
2e860 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72  ite3_file*)(pPtr
2e870 20 2b 3d 20 52 4f 55 4e 44 38 28 70 56 66 73 2d   += ROUND8(pVfs-
2e880 3e 73 7a 4f 73 46 69 6c 65 29 29 3b 0a 20 20 70  >szOsFile));.  p
2e890 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 20 28 73  Pager->jfd =  (s
2e8a0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50  qlite3_file*)(pP
2e8b0 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c  tr += journalFil
2e8c0 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72  eSize);.  pPager
2e8d0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 20 20  ->zFilename =   
2e8e0 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d   (char*)(pPtr +=
2e8f0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
2e900 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
2e910 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
2e920 54 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  T(pPager->jfd) )
2e930 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
2e940 74 68 65 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e  the Pager.zFilen
2e950 61 6d 65 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a  ame and Pager.zJ
2e960 6f 75 72 6e 61 6c 20 62 75 66 66 65 72 73 2c 20  ournal buffers, 
2e970 69 66 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  if required. */.
2e980 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20    if( zPathname 
2e990 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
2e9a0 50 61 74 68 6e 61 6d 65 3e 30 20 29 3b 0a 20 20  Pathname>0 );.  
2e9b0 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e    pPager->zJourn
2e9c0 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70  al =   (char*)(p
2e9d0 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65  Ptr += nPathname
2e9e0 20 2b 20 31 20 2b 20 6e 55 72 69 29 3b 0a 20 20   + 1 + nUri);.  
2e9f0 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
2ea00 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74  >zFilename, zPat
2ea10 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65  hname, nPathname
2ea20 29 3b 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20  );.    if( nUri 
2ea30 29 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72  ) memcpy(&pPager
2ea40 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74  ->zFilename[nPat
2ea50 68 6e 61 6d 65 2b 31 5d 2c 20 7a 55 72 69 2c 20  hname+1], zUri, 
2ea60 6e 55 72 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70  nUri);.    memcp
2ea70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
2ea80 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  al, zPathname, n
2ea90 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d  Pathname);.    m
2eaa0 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  emcpy(&pPager->z
2eab0 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d  Journal[nPathnam
2eac0 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 5c 30 30  e], "-journal\00
2ead0 30 22 2c 20 38 2b 32 29 3b 0a 20 20 20 20 73 71  0", 8+2);.    sq
2eae0 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
2eaf0 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
2eb00 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  me, pPager->zJou
2eb10 72 6e 61 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53  rnal);.#ifndef S
2eb20 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
2eb30 20 20 20 70 50 61 67 65 72 2d 3e 7a 57 61 6c 20     pPager->zWal 
2eb40 3d 20 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  = &pPager->zJour
2eb50 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 38 2b  nal[nPathname+8+
2eb60 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  1];.    memcpy(p
2eb70 50 61 67 65 72 2d 3e 7a 57 61 6c 2c 20 7a 50 61  Pager->zWal, zPa
2eb80 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  thname, nPathnam
2eb90 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  e);.    memcpy(&
2eba0 70 50 61 67 65 72 2d 3e 7a 57 61 6c 5b 6e 50 61  pPager->zWal[nPa
2ebb0 74 68 6e 61 6d 65 5d 2c 20 22 2d 77 61 6c 5c 30  thname], "-wal\0
2ebc0 30 30 22 2c 20 34 2b 31 29 3b 0a 20 20 20 20 73  00", 4+1);.    s
2ebd0 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
2ebe0 33 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  3(pPager->zFilen
2ebf0 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 7a 57 61  ame, pPager->zWa
2ec00 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  l);.#endif.    s
2ec10 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
2ec20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zPathname);.  }.
2ec30 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d    pPager->pVfs =
2ec40 20 70 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d   pVfs;.  pPager-
2ec50 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46  >vfsFlags = vfsF
2ec60 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  lags;..  /* Open
2ec70 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
2ec80 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
2ec90 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
2eca0 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74  me[0] ){.    int
2ecb0 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20   fout = 0;      
2ecc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ecd0 20 56 46 53 20 66 6c 61 67 73 20 72 65 74 75 72   VFS flags retur
2ece0 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a  ned by xOpen() *
2ecf0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2ed00 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
2ed10 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2ed20 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66  , pPager->fd, vf
2ed30 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a  sFlags, &fout);.
2ed40 20 20 20 20 61 73 73 65 72 74 28 20 21 6d 65 6d      assert( !mem
2ed50 44 62 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  Db );.#ifdef SQL
2ed60 49 54 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52  ITE_ENABLE_DESER
2ed70 49 41 4c 49 5a 45 0a 20 20 20 20 6d 65 6d 4a 4d  IALIZE.    memJM
2ed80 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f   = (fout&SQLITE_
2ed90 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b  OPEN_MEMORY)!=0;
2eda0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 61 64  .#endif.    read
2edb0 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c  Only = (fout&SQL
2edc0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
2edd0 59 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 49  Y)!=0;..    /* I
2ede0 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73  f the file was s
2edf0 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
2ee00 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  ed for read/writ
2ee10 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a  e access,.    **
2ee20 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75 6c   choose a defaul
2ee30 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20 63  t page size in c
2ee40 61 73 65 20 77 65 20 68 61 76 65 20 74 6f 20 63  ase we have to c
2ee50 72 65 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  reate the.    **
2ee60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2ee70 54 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  The default page
2ee80 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78   size is the max
2ee90 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  imum of:.    **.
2eea0 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49      **    + SQLI
2eeb0 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
2eec0 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20  SIZE,.    **    
2eed0 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  + The value retu
2eee0 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f  rned by sqlite3O
2eef0 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20  sSectorSize().  
2ef00 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61    **    + The la
2ef10 72 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20  rgest page size 
2ef20 74 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74  that can be writ
2ef30 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a  ten atomically..
2ef40 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
2ef50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2ef60 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20        int iDc = 
2ef70 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
2ef80 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
2ef90 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
2efa0 20 20 69 66 28 20 21 72 65 61 64 4f 6e 6c 79 20    if( !readOnly 
2efb0 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74 53 65  ){.        setSe
2efc0 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
2efd0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2efe0 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
2eff0 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54  PAGE_SIZE<=SQLIT
2f000 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
2f010 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  GE_SIZE);.      
2f020 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74    if( szPageDflt
2f030 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  <pPager->sectorS
2f040 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
2f050 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63   if( pPager->sec
2f060 74 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  torSize>SQLITE_M
2f070 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2f080 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
2f090 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
2f0a0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41   SQLITE_MAX_DEFA
2f0b0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ULT_PAGE_SIZE;. 
2f0c0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2f0d0 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61              szPa
2f0e0 67 65 44 66 6c 74 20 3d 20 28 75 33 32 29 70 50  geDflt = (u32)pP
2f0f0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
2f100 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2f110 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
2f120 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
2f130 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20  MIC_WRITE.      
2f140 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e    {.          in
2f150 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20  t ii;.          
2f160 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
2f170 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
2f180 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  512>>8));.      
2f190 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
2f1a0 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
2f1b0 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
2f1c0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2f1d0 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  (SQLITE_MAX_DEFA
2f1e0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36  ULT_PAGE_SIZE<=6
2f1f0 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20  5536);.         
2f200 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66   for(ii=szPageDf
2f210 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d  lt; ii<=SQLITE_M
2f220 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
2f230 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a  SIZE; ii=ii*2){.
2f240 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2f250 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41  iDc&(SQLITE_IOCA
2f260 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29  P_ATOMIC|(ii>>8)
2f270 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
2f280 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
2f290 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ii;.            
2f2a0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
2f2b0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2f2c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
2f2d0 67 65 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 73 71  ger->noLock = sq
2f2e0 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
2f2f0 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 6e 6f  n(zFilename, "no
2f300 6c 6f 63 6b 22 2c 20 30 29 3b 0a 20 20 20 20 20  lock", 0);.     
2f310 20 69 66 28 20 28 69 44 63 20 26 20 53 51 4c 49   if( (iDc & SQLI
2f320 54 45 5f 49 4f 43 41 50 5f 49 4d 4d 55 54 41 42  TE_IOCAP_IMMUTAB
2f330 4c 45 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c  LE)!=0.       ||
2f340 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
2f350 6c 65 61 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  lean(zFilename, 
2f360 22 69 6d 6d 75 74 61 62 6c 65 22 2c 20 30 29 20  "immutable", 0) 
2f370 29 7b 0a 20 20 20 20 20 20 20 20 20 20 76 66 73  ){.          vfs
2f380 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  Flags |= SQLITE_
2f390 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
2f3a0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 63           goto ac
2f3b0 74 5f 6c 69 6b 65 5f 74 65 6d 70 5f 66 69 6c 65  t_like_temp_file
2f3c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2f3d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
2f3e0 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  If a temporary f
2f3f0 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64  ile is requested
2f400 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e  , it is not open
2f410 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  ed immediately..
2f420 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
2f430 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68  ase we accept th
2f440 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
2f450 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63  ize and delay ac
2f460 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70  tually.    ** op
2f470 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75  ening the file u
2f480 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63  ntil the first c
2f490 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29  all to OsWrite()
2f4a0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2f4b0 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61  This branch is a
2f4c0 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69  lso run for an i
2f4d0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
2f4e0 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  e. An in-memory.
2f4f0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2f500 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61  is the same as a
2f510 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20   temp-file that 
2f520 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
2f530 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64   out to.    ** d
2f540 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20  isk and uses an 
2f550 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61  in-memory rollba
2f560 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  ck journal..    
2f570 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  **.    ** This b
2f580 72 61 6e 63 68 20 61 6c 73 6f 20 72 75 6e 73 20  ranch also runs 
2f590 66 6f 72 20 66 69 6c 65 73 20 6d 61 72 6b 65 64  for files marked
2f5a0 20 61 73 20 69 6d 6d 75 74 61 62 6c 65 2e 0a 20   as immutable.. 
2f5b0 20 20 20 2a 2f 20 0a 61 63 74 5f 6c 69 6b 65 5f     */ .act_like_
2f5c0 74 65 6d 70 5f 66 69 6c 65 3a 0a 20 20 20 20 74  temp_file:.    t
2f5d0 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20  empFile = 1;.   
2f5e0 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20   pPager->eState 
2f5f0 3d 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 20  = PAGER_READER; 
2f600 20 20 20 20 2f 2a 20 50 72 65 74 65 6e 64 20 77      /* Pretend w
2f610 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61  e already have a
2f620 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 70 50 61   lock */.    pPa
2f630 67 65 72 2d 3e 65 4c 6f 63 6b 20 3d 20 45 58 43  ger->eLock = EXC
2f640 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 20 20 20 20  LUSIVE_LOCK;    
2f650 2f 2a 20 50 72 65 74 65 6e 64 20 77 65 20 61 72  /* Pretend we ar
2f660 65 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 6d  e in EXCLUSIVE m
2f670 6f 64 65 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  ode */.    pPage
2f680 72 2d 3e 6e 6f 4c 6f 63 6b 20 3d 20 31 3b 20 20  r->noLock = 1;  
2f690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f6a0 20 44 6f 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 2a   Do no locking *
2f6b0 2f 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d  /.    readOnly =
2f6c0 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54   (vfsFlags&SQLIT
2f6d0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
2f6e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
2f6f0 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74  following call t
2f700 6f 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69  o PagerSetPagesi
2f710 7a 65 28 29 20 73 65 72 76 65 73 20 74 6f 20 73  ze() serves to s
2f720 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
2f730 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65  .  ** Pager.page
2f740 53 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f  Size and to allo
2f750 63 61 74 65 20 74 68 65 20 50 61 67 65 72 2e 70  cate the Pager.p
2f760 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  TmpSpace buffer.
2f770 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
2f780 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f790 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2f7a0 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20  >memDb==0 );.   
2f7b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2f7c0 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50  erSetPagesize(pP
2f7d0 61 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c  ager, &szPageDfl
2f7e0 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73 74  t, -1);.    test
2f7f0 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
2f800 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _OK );.  }..  /*
2f810 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
2f820 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2e 20 2a  PCache object. *
2f830 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2f840 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6e 45 78  TE_OK ){.    nEx
2f850 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78  tra = ROUND8(nEx
2f860 74 72 61 29 3b 0a 20 20 20 20 61 73 73 65 72 74  tra);.    assert
2f870 28 20 6e 45 78 74 72 61 3e 3d 38 20 26 26 20 6e  ( nExtra>=8 && n
2f880 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20  Extra<1000 );.  
2f890 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63    rc = sqlite3Pc
2f8a0 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44  acheOpen(szPageD
2f8b0 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65  flt, nExtra, !me
2f8c0 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  mDb,.           
2f8d0 20 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d              !mem
2f8e0 44 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30  Db?pagerStress:0
2f8f0 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72  , (void *)pPager
2f900 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  , pPager->pPCach
2f910 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  e);.  }..  /* If
2f920 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
2f930 65 64 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74  ed above, free t
2f940 68 65 20 20 50 61 67 65 72 20 73 74 72 75 63 74  he  Pager struct
2f950 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ure and close th
2f960 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  e file..  */.  i
2f970 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f980 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
2f990 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
2f9a0 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  d);.    sqlite3P
2f9b0 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  ageFree(pPager->
2f9c0 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
2f9d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
2f9e0 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
2f9f0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45   rc;.  }..  PAGE
2fa00 52 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64  RTRACE(("OPEN %d
2fa10 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44   %s\n", FILEHAND
2fa20 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29  LEID(pPager->fd)
2fa30 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
2fa40 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  ame));.  IOTRACE
2fa50 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22  (("OPEN %p %s\n"
2fa60 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
2fa70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20  ->zFilename)).. 
2fa80 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
2fa90 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75  nal = (u8)useJou
2faa0 72 6e 61 6c 3b 0a 20 20 2f 2a 20 70 50 61 67 65  rnal;.  /* pPage
2fab0 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
2fac0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
2fad0 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20  >stmtInUse = 0; 
2fae0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
2faf0 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nRef = 0; */.  /
2fb00 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
2fb10 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
2fb20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
2fb30 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
2fb40 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
2fb50 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ; */.  pPager->m
2fb60 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d  xPgno = SQLITE_M
2fb70 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20  AX_PAGE_COUNT;. 
2fb80 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74   /* pPager->stat
2fb90 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
2fba0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
2fbb0 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a  ->errMask = 0; *
2fbc0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  /.  pPager->temp
2fbd0 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46  File = (u8)tempF
2fbe0 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74  ile;.  assert( t
2fbf0 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
2fc00 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
2fc10 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  L .          || 
2fc20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
2fc30 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
2fc40 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72  USIVE );.  asser
2fc50 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
2fc60 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d  MODE_EXCLUSIVE==
2fc70 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  1 );.  pPager->e
2fc80 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28  xclusiveMode = (
2fc90 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20  u8)tempFile; .  
2fca0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
2fcb0 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
2fcc0 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
2fcd0 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75  ager->memDb = (u
2fce0 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65  8)memDb;.  pPage
2fcf0 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75  r->readOnly = (u
2fd00 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 61 73  8)readOnly;.  as
2fd10 73 65 72 74 28 20 75 73 65 4a 6f 75 72 6e 61 6c  sert( useJournal
2fd20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
2fd30 46 69 6c 65 20 29 3b 0a 20 20 70 50 61 67 65 72  File );.  pPager
2fd40 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65  ->noSync = pPage
2fd50 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69  r->tempFile;.  i
2fd60 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
2fd70 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  c ){.    assert(
2fd80 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
2fd90 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
2fda0 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78 74 72  rt( pPager->extr
2fdb0 61 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  aSync==0 );.    
2fdc0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2fdd0 73 79 6e 63 46 6c 61 67 73 3d 3d 30 20 29 3b 0a  syncFlags==0 );.
2fde0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2fdf0 65 72 2d 3e 77 61 6c 53 79 6e 63 46 6c 61 67 73  er->walSyncFlags
2fe00 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ==0 );.  }else{.
2fe10 20 20 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c      pPager->full
2fe20 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50  Sync = 1;.    pP
2fe30 61 67 65 72 2d 3e 65 78 74 72 61 53 79 6e 63 20  ager->extraSync 
2fe40 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
2fe50 3e 73 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c  >syncFlags = SQL
2fe60 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
2fe70 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 77 61 6c  .    pPager->wal
2fe80 53 79 6e 63 46 6c 61 67 73 20 3d 20 53 51 4c 49  SyncFlags = SQLI
2fe90 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 7c  TE_SYNC_NORMAL |
2fea0 20 28 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f   (SQLITE_SYNC_NO
2feb0 52 4d 41 4c 3c 3c 32 29 3b 0a 20 20 7d 0a 20 20  RMAL<<2);.  }.  
2fec0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
2fed0 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  t = 0; */.  /* p
2fee0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
2fef0 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ced = 0; */.  /*
2ff00 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
2ff10 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
2ff20 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29 6e  >nExtra = (u16)n
2ff30 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d  Extra;.  pPager-
2ff40 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
2ff50 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  t = SQLITE_DEFAU
2ff60 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f  LT_JOURNAL_SIZE_
2ff70 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28  LIMIT;.  assert(
2ff80 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2ff90 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20  fd) || tempFile 
2ffa0 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69  );.  setSectorSi
2ffb0 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ze(pPager);.  if
2ffc0 28 20 21 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b  ( !useJournal ){
2ffd0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
2ffe0 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
2fff0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
30000 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65  ;.  }else if( me
30010 6d 44 62 20 7c 7c 20 6d 65 6d 4a 4d 20 29 7b 0a  mDb || memJM ){.
30020 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
30030 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
30040 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
30050 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61  RY;.  }.  /* pPa
30060 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
30070 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  r = 0; */.  /* p
30080 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
30090 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20  lerArg = 0; */. 
300a0 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
300b0 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20  er = xReinit;.  
300c0 73 65 74 47 65 74 74 65 72 4d 65 74 68 6f 64 28  setGetterMethod(
300d0 70 50 61 67 65 72 29 3b 0a 20 20 2f 2a 20 6d 65  pPager);.  /* me
300e0 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61  mset(pPager->aHa
300f0 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50  sh, 0, sizeof(pP
30100 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a  ager->aHash)); *
30110 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
30120 7a 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f 44  zMmap = SQLITE_D
30130 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45  EFAULT_MMAP_SIZE
30140 20 2f 2f 20 77 69 6c 6c 20 62 65 20 73 65 74 20   // will be set 
30150 62 79 20 62 74 72 65 65 2e 63 20 2a 2f 0a 0a 20  by btree.c */.. 
30160 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67   *ppPager = pPag
30170 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  er;.  return SQL
30180 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a  ITE_OK;.}..../*.
30190 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
301a0 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
301b0 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66   transitioning f
301c0 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  rom PAGER_UNLOCK
301d0 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41   to.** PAGER_SHA
301e0 52 45 44 20 73 74 61 74 65 2e 20 49 74 20 74 65  RED state. It te
301f0 73 74 73 20 69 66 20 74 68 65 72 65 20 69 73 20  sts if there is 
30200 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72  a hot journal pr
30210 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20  esent in.** the 
30220 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20  file-system for 
30230 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e  the given pager.
30240 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69   A hot journal i
30250 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e  s one that .** n
30260 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65  eeds to be playe
30270 64 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e  d back. Accordin
30280 67 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  g to this functi
30290 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  on, a hot-journa
302a0 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73  l.** file exists
302b0 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
302c0 67 20 63 72 69 74 65 72 69 61 20 61 72 65 20 6d  g criteria are m
302d0 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  et:.**.**   * Th
302e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
302f0 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c  xists in the fil
30300 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a  e system, and.**
30310 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20     * No process 
30320 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44  holds a RESERVED
30330 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
30340 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
30350 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20   file, and.**   
30360 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
30370 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67 72  ile itself is gr
30380 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74  eater than 0 byt
30390 65 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a  es in size, and.
303a0 2a 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73 74  **   * The first
303b0 20 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75   byte of the jou
303c0 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
303d0 20 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30   and is not 0x00
303e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
303f0 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
30400 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30410 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72   is 0 but a jour
30420 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73  nal file.** exis
30430 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62  ts, that is prob
30440 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  ably an old jour
30450 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72  nal left over fr
30460 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61  om a prior.** da
30470 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
30480 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68  same name. In th
30490 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72  is case the jour
304a0 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a  nal file is.** j
304b0 75 73 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e  ust deleted usin
304c0 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78  g OsDelete, *pEx
304d0 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 30  ists is set to 0
304e0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a   and SQLITE_OK.*
304f0 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  * is returned..*
30500 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
30510 65 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b  e does not check
30520 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 6d   if there is a m
30530 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
30540 6c 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65  lename.** at the
30550 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
30560 2e 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 61  . If there is, a
30570 6e 64 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a  nd that master j
30580 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64  ournal file.** d
30590 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74  oes not exist, t
305a0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
305b0 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  file is not real
305c0 6c 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a  ly hot. In this.
305d0 2a 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f 75  ** case this rou
305e0 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
305f0 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76   a false-positiv
30600 65 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61  e. The pager_pla
30610 79 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  yback().** routi
30620 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72  ne will discover
30630 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
30640 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65  l file is not re
30650 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a  ally hot and .**
30660 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69   will not roll i
30670 74 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49  t back. .**.** I
30680 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  f a hot-journal 
30690 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f  file is found to
306a0 20 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73   exist, *pExists
306b0 20 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64   is set to 1 and
306c0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72   .** SQLITE_OK r
306d0 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68  eturned. If no h
306e0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
306f0 69 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78  is present, *pEx
30700 69 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74  ists is.** set t
30710 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  o 0 and SQLITE_O
30720 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  K returned. If a
30730 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
30740 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a  s while trying.*
30750 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  * to determine w
30760 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
30770 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
30780 20 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20   exists, the IO 
30790 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73  error.** code is
307a0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
307b0 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69  e value of *pExi
307c0 73 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64  sts is undefined
307d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
307e0 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61  hasHotJournal(Pa
307f0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
30800 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71   *pExists){.  sq
30810 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73  lite3_vfs * cons
30820 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d  t pVfs = pPager-
30830 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 20  >pVfs;.  int rc 
30840 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
30850 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
30860 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65   code */.  int e
30870 78 69 73 74 73 20 3d 20 31 3b 20 20 20 20 20 20  xists = 1;      
30880 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
30890 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   if a journal fi
308a0 6c 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  le is present */
308b0 0a 20 20 69 6e 74 20 6a 72 6e 6c 4f 70 65 6e 20  .  int jrnlOpen 
308c0 3d 20 21 21 69 73 4f 70 65 6e 28 70 50 61 67 65  = !!isOpen(pPage
308d0 72 2d 3e 6a 66 64 29 3b 0a 0a 20 20 61 73 73 65  r->jfd);..  asse
308e0 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
308f0 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
30900 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
30910 72 2d 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65  r->fd) );.  asse
30920 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61  rt( pPager->eSta
30930 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 29  te==PAGER_OPEN )
30940 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6a 72 6e  ;..  assert( jrn
30950 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 28 20 73 71  lOpen==0 || ( sq
30960 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
30970 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
30980 67 65 72 2d 3e 6a 66 64 29 20 26 0a 20 20 20 20  ger->jfd) &.    
30990 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
309a0 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
309b0 45 4e 0a 20 20 29 29 3b 0a 0a 20 20 2a 70 45 78  EN.  ));..  *pEx
309c0 69 73 74 73 20 3d 20 30 3b 0a 20 20 69 66 28 20  ists = 0;.  if( 
309d0 21 6a 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  !jrnlOpen ){.   
309e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
309f0 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67  ccess(pVfs, pPag
30a00 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  er->zJournal, SQ
30a10 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
30a20 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20  TS, &exists);.  
30a30 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
30a40 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20  TE_OK && exists 
30a50 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65  ){.    int locke
30a60 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
30a70 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f     /* True if so
30a80 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  me process holds
30a90 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
30aa0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65   */..    /* Race
30ab0 20 63 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a   condition here:
30ac0 20 20 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73    Another proces
30ad0 73 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65  s might have bee
30ae0 6e 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20  n holding the.  
30af0 20 20 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45    ** the RESERVE
30b00 44 20 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20  D lock and have 
30b10 61 20 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61  a journal open a
30b20 74 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41  t the sqlite3OsA
30b30 63 63 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20  ccess() .    ** 
30b40 63 61 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20  call above, but 
30b50 74 68 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20  then delete the 
30b60 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70  journal and drop
30b70 20 74 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65   the lock before
30b80 0a 20 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74  .    ** we get t
30b90 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
30ba0 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65  sqlite3OsCheckRe
30bb0 73 65 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c  servedLock() cal
30bc0 6c 2e 20 20 49 66 20 74 68 61 74 0a 20 20 20 20  l.  If that.    
30bd0 2a 2a 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  ** is the case, 
30be0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  this routine mig
30bf0 68 74 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69  ht think there i
30c00 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  s a hot journal 
30c10 77 68 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66  when.    ** in f
30c20 61 63 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e  act there is non
30c30 65 2e 20 20 54 68 69 73 20 72 65 73 75 6c 74 73  e.  This results
30c40 20 69 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69   in a false-posi
30c50 74 69 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a  tive which will.
30c60 20 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20      ** be dealt 
30c70 77 69 74 68 20 62 79 20 74 68 65 20 70 6c 61 79  with by the play
30c80 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54  back routine.  T
30c90 69 63 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20  icket #3883..   
30ca0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
30cb0 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
30cc0 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  vedLock(pPager->
30cd0 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20  fd, &locked);.  
30ce0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30cf0 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29  _OK && !locked )
30d00 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61  {.      Pgno nPa
30d10 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
30d20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
30d30 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
30d40 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  se file */..    
30d50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
30d60 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 29 3b  ->tempFile==0 );
30d70 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
30d80 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
30d90 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
30da0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30db0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
30dc0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
30dd0 65 20 69 73 20 7a 65 72 6f 20 70 61 67 65 73 20  e is zero pages 
30de0 69 6e 20 73 69 7a 65 2c 20 74 68 61 74 20 6d 65  in size, that me
30df0 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72 20  ans that either 
30e00 28 31 29 20 74 68 65 0a 20 20 20 20 20 20 20 20  (1) the.        
30e10 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 20  ** journal is a 
30e20 72 65 6d 6e 61 6e 74 20 66 72 6f 6d 20 61 20 70  remnant from a p
30e30 72 69 6f 72 20 64 61 74 61 62 61 73 65 20 77 69  rior database wi
30e40 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
30e50 20 77 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a   where.        *
30e60 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
30e70 69 6c 65 20 62 75 74 20 6e 6f 74 20 74 68 65 20  ile but not the 
30e80 6a 6f 75 72 6e 61 6c 20 77 61 73 20 64 65 6c 65  journal was dele
30e90 74 65 64 2c 20 6f 72 20 28 32 29 20 74 68 65 20  ted, or (2) the 
30ea0 69 6e 69 74 69 61 6c 0a 20 20 20 20 20 20 20 20  initial.        
30eb0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ** transaction t
30ec0 68 61 74 20 70 6f 70 75 6c 61 74 65 73 20 61 20  hat populates a 
30ed0 6e 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20  new database is 
30ee0 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
30ef0 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e  k..        ** In
30f00 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 74 68   either case, th
30f10 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
30f20 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 20 20  an be deleted.  
30f30 48 6f 77 65 76 65 72 2c 20 74 61 6b 65 20 63 61  However, take ca
30f40 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f  re.        ** no
30f50 74 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  t to delete the 
30f60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
30f70 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  it is already op
30f80 65 6e 20 64 75 65 20 74 6f 0a 20 20 20 20 20 20  en due to.      
30f90 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64    ** journal_mod
30fa0 65 3d 50 45 52 53 49 53 54 2e 0a 20 20 20 20 20  e=PERSIST..     
30fb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
30fc0 28 20 6e 50 61 67 65 3d 3d 30 20 26 26 20 21 6a  ( nPage==0 && !j
30fd0 72 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  rnlOpen ){.     
30fe0 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
30ff0 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
31000 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
31010 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67 65  agerLockDb(pPage
31020 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  r, RESERVED_LOCK
31030 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
31040 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
31050 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
31060 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
31070 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  al, 0);.        
31080 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
31090 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
310a0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70   pagerUnlockDb(p
310b0 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
310c0 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  CK);.          }
310d0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
310e0 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
310f0 63 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  c();.        }el
31100 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
31110 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
31120 65 20 65 78 69 73 74 73 20 61 6e 64 20 6e 6f 20  e exists and no 
31130 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
31140 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64 0a   has a reserved.
31150 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
31160 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
31170 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
31180 65 2e 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61  e. Now check tha
31190 74 20 74 68 65 72 65 20 69 73 0a 20 20 20 20 20  t there is.     
311a0 20 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74       ** at least
311b0 20 6f 6e 65 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79   one non-zero by
311c0 74 65 73 20 61 74 20 74 68 65 20 73 74 61 72 74  tes at the start
311d0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
311e0 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20  file..          
311f0 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 2c 20  ** If there is, 
31200 74 68 65 6e 20 77 65 20 63 6f 6e 73 69 64 65 72  then we consider
31210 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 74 6f   this journal to
31220 20 62 65 20 68 6f 74 2e 20 49 66 20 6e 6f 74 2c   be hot. If not,
31230 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69   .          ** i
31240 74 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64  t can be ignored
31250 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
31260 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72           if( !jr
31270 6e 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  nlOpen ){.      
31280 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51        int f = SQ
31290 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
312a0 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
312b0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20  AIN_JOURNAL;.   
312c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
312d0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
312e0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
312f0 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
31300 20 66 2c 20 26 66 29 3b 0a 20 20 20 20 20 20 20   f, &f);.       
31310 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
31320 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
31330 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
31340 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20 20  u8 first = 0;.  
31350 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
31360 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
31370 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20  ger->jfd, (void 
31380 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29 3b  *)&first, 1, 0);
31390 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
313a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
313b0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
313c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
313d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
313e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
313f0 20 20 20 20 20 20 20 20 69 66 28 20 21 6a 72 6e          if( !jrn
31400 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  lOpen ){.       
31410 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
31420 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
31430 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
31440 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  }.            *p
31450 45 78 69 73 74 73 20 3d 20 28 66 69 72 73 74 21  Exists = (first!
31460 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  =0);.          }
31470 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
31480 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a  ITE_CANTOPEN ){.
31490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
314a0 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  f we cannot open
314b0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
314c0 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72  urnal file in or
314d0 64 65 72 20 74 6f 20 73 65 65 20 69 66 0a 20 20  der to see if.  
314e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
314f0 68 61 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65  has a zero heade
31500 72 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  r, that might be
31510 20 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65   due to an I/O e
31520 72 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20  rror, or.       
31530 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74       ** it might
31540 20 62 65 20 64 75 65 20 74 6f 20 74 68 65 20 72   be due to the r
31550 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  ace condition de
31560 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e  scribed above an
31570 64 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20  d in.           
31580 20 2a 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33   ** ticket #3883
31590 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61  .  Either way, a
315a0 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a  ssume that the j
315b0 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20  ournal is hot.. 
315c0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68             ** Th
315d0 69 73 20 6d 69 67 68 74 20 62 65 20 61 20 66 61  is might be a fa
315e0 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42  lse positive.  B
315f0 75 74 20 69 66 20 69 74 20 69 73 2c 20 74 68 65  ut if it is, the
31600 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
31610 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a    ** automatic j
31620 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20  ournal playback 
31630 61 6e 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63  and recovery mec
31640 68 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c  hanism will deal
31650 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
31660 77 69 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e  with it under an
31670 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
31680 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20  where we do not 
31690 6e 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20  need to.        
316a0 20 20 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20      ** worry so 
316b0 6d 75 63 68 20 77 69 74 68 20 72 61 63 65 20 63  much with race c
316c0 6f 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20  onditions..     
316d0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
316e0 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d        *pExists =
316f0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
31700 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
31710 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31720 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
31730 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
31740 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
31750 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
31760 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e  called to obtain
31770 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   a shared lock o
31780 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
31790 69 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c  ile..** It is il
317a0 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71  legal to call sq
317b0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
317c0 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68 69 73  until after this
317d0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 68 61 73   function.** has
317e0 20 62 65 65 6e 20 73 75 63 63 65 73 73 66 75 6c   been successful
317f0 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66 20 61 20  ly called. If a 
31800 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 61  shared-lock is a
31810 6c 72 65 61 64 79 20 68 65 6c 64 20 77 68 65 6e  lready held when
31820 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
31830 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
31840 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
31850 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
31860 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 61  operations are a
31870 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64 20 62 79  lso performed by
31880 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
31890 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66 20 74 68  **.**   1) If th
318a0 65 20 70 61 67 65 72 20 69 73 20 63 75 72 72 65  e pager is curre
318b0 6e 74 6c 79 20 69 6e 20 50 41 47 45 52 5f 4f 50  ntly in PAGER_OP
318c0 45 4e 20 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63  EN state (no loc
318d0 6b 20 68 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f  k held.**      o
318e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
318f0 69 6c 65 29 2c 20 74 68 65 6e 20 61 6e 20 61 74  ile), then an at
31900 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
31910 20 6f 62 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20   obtain a.**    
31920 20 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e    SHARED lock on
31930 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
31940 6c 65 2e 20 49 6d 6d 65 64 69 61 74 65 6c 79 20  le. Immediately 
31950 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a  after obtaining.
31960 2a 2a 20 20 20 20 20 20 74 68 65 20 53 48 41 52  **      the SHAR
31970 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c  ED lock, the fil
31980 65 2d 73 79 73 74 65 6d 20 69 73 20 63 68 65 63  e-system is chec
31990 6b 65 64 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  ked for a hot-jo
319a0 75 72 6e 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77  urnal,.**      w
319b0 68 69 63 68 20 69 73 20 70 6c 61 79 65 64 20 62  hich is played b
319c0 61 63 6b 20 69 66 20 70 72 65 73 65 6e 74 2e 20  ack if present. 
319d0 46 6f 6c 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f  Following any ho
319e0 74 2d 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20  t-journal .**   
319f0 20 20 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65     rollback, the
31a00 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
31a10 20 63 61 63 68 65 20 61 72 65 20 76 61 6c 69 64   cache are valid
31a20 61 74 65 64 20 62 79 20 63 68 65 63 6b 69 6e 67  ated by checking
31a30 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 27 63 68  .**      the 'ch
31a40 61 6e 67 65 2d 63 6f 75 6e 74 65 72 27 20 66 69  ange-counter' fi
31a50 65 6c 64 20 6f 66 20 74 68 65 20 64 61 74 61 62  eld of the datab
31a60 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 20  ase file header 
31a70 61 6e 64 0a 2a 2a 20 20 20 20 20 20 64 69 73 63  and.**      disc
31a80 61 72 64 65 64 20 69 66 20 74 68 65 79 20 61 72  arded if they ar
31a90 65 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e  e found to be in
31aa0 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32  valid..**.**   2
31ab0 29 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  ) If the pager i
31ac0 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
31ad0 6c 75 73 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64  lusive-mode, and
31ae0 20 74 68 65 72 65 20 61 72 65 20 63 75 72 72 65   there are curre
31af0 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20  ntly.**      no 
31b00 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
31b10 72 65 6e 63 65 73 20 74 6f 20 61 6e 79 20 70 61  rences to any pa
31b20 67 65 73 2c 20 61 6e 64 20 69 73 20 69 6e 20 74  ges, and is in t
31b30 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 0a  he error state,.
31b40 2a 2a 20 20 20 20 20 20 74 68 65 6e 20 61 6e 20  **      then an 
31b50 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
31b60 74 6f 20 63 6c 65 61 72 20 74 68 65 20 65 72 72  to clear the err
31b70 6f 72 20 73 74 61 74 65 20 62 79 20 64 69 73 63  or state by disc
31b80 61 72 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74  arding.**      t
31b90 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
31ba0 68 65 20 70 61 67 65 20 63 61 63 68 65 20 61 6e  he page cache an
31bb0 64 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  d rolling back a
31bc0 6e 79 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a  ny open journal.
31bd0 2a 2a 20 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a  **      file..**
31be0 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e  .** If everythin
31bf0 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
31c00 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
31c10 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
31c20 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
31c30 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  s while locking 
31c40 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 63 68  the database, ch
31c50 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74  ecking for a hot
31c60 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72  -journal file or
31c70 20 0a 2a 2a 20 72 6f 6c 6c 69 6e 67 20 62 61 63   .** rolling bac
31c80 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  k a journal file
31c90 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  , the IO error c
31ca0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
31cb0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
31cc0 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50  agerSharedLock(P
31cd0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
31ce0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
31cf0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
31d00 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
31d10 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73  de */..  /* This
31d20 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
31d30 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 2d 74   called from b-t
31d40 72 65 65 20 61 6e 64 20 6f 6e 6c 79 20 77 68 65  ree and only whe
31d50 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20  n there are no. 
31d60 20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   ** outstanding 
31d70 70 61 67 65 73 2e 20 54 68 69 73 20 69 6d 70 6c  pages. This impl
31d80 69 65 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ies that the pag
31d90 65 72 20 73 74 61 74 65 20 73 68 6f 75 6c 64 20  er state should 
31da0 65 69 74 68 65 72 0a 20 20 2a 2a 20 62 65 20 4f  either.  ** be O
31db0 50 45 4e 20 6f 72 20 52 45 41 44 45 52 2e 20 52  PEN or READER. R
31dc0 45 41 44 45 52 20 69 73 20 6f 6e 6c 79 20 70 6f  EADER is only po
31dd0 73 73 69 62 6c 65 20 69 66 20 74 68 65 20 70 61  ssible if the pa
31de0 67 65 72 20 69 73 20 6f 72 20 77 61 73 20 69 6e  ger is or was in
31df0 20 0a 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65   .  ** exclusive
31e00 20 61 63 63 65 73 73 20 6d 6f 64 65 2e 20 20 2a   access mode.  *
31e10 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
31e20 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
31e30 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
31e40 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  e)==0 );.  asser
31e50 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f  t( assert_pager_
31e60 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29 3b  state(pPager) );
31e70 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
31e80 72 2d 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52  r->eState==PAGER
31e90 5f 4f 50 45 4e 20 7c 7c 20 70 50 61 67 65 72 2d  _OPEN || pPager-
31ea0 3e 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  >eState==PAGER_R
31eb0 45 41 44 45 52 20 29 3b 0a 20 20 61 73 73 65 72  EADER );.  asser
31ec0 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
31ed0 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
31ee0 0a 0a 20 20 69 66 28 20 21 70 61 67 65 72 55 73  ..  if( !pagerUs
31ef0 65 57 61 6c 28 70 50 61 67 65 72 29 20 26 26 20  eWal(pPager) && 
31f00 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d 3d  pPager->eState==
31f10 50 41 47 45 52 5f 4f 50 45 4e 20 29 7b 0a 20 20  PAGER_OPEN ){.  
31f20 20 20 69 6e 74 20 62 48 6f 74 4a 6f 75 72 6e 61    int bHotJourna
31f30 6c 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  l = 1;          
31f40 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 72 65  /* True if there
31f50 20 65 78 69 73 74 73 20 61 20 68 6f 74 20 6a 6f   exists a hot jo
31f60 75 72 6e 61 6c 2d 66 69 6c 65 20 2a 2f 0a 0a 20  urnal-file */.. 
31f70 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
31f80 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  B );.    assert(
31f90 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
31fa0 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
31fb0 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
31fc0 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 20 20 72 63  _LOCK );..    rc
31fd0 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
31fe0 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48  _lock(pPager, SH
31ff0 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
32000 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32010 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
32020 74 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b  t( pPager->eLock
32030 3d 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 70 50 61  ==NO_LOCK || pPa
32040 67 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 55 4e 4b 4e  ger->eLock==UNKN
32050 4f 57 4e 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  OWN_LOCK );.    
32060 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
32070 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
32080 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  a journal file e
32090 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65  xists, and there
320a0 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20   is no RESERVED 
320b0 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
320c0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
320d0 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72  , then it either
320e0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
320f0 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65  yed back or dele
32100 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
32110 69 66 28 20 70 50 61 67 65 72 2d 3e 65 4c 6f 63  if( pPager->eLoc
32120 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
32130 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61 73  {.      rc = has
32140 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
32150 72 2c 20 26 62 48 6f 74 4a 6f 75 72 6e 61 6c 29  r, &bHotJournal)
32160 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
32170 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
32180 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  .      goto fail
32190 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ed;.    }.    if
321a0 28 20 62 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b  ( bHotJournal ){
321b0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
321c0 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  r->readOnly ){. 
321d0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
321e0 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c  TE_READONLY_ROLL
321f0 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 67 6f  BACK;.        go
32200 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
32210 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 74   }..      /* Get
32220 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
32230 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
32240 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73  se file. At this
32250 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20   point it is.   
32260 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20     ** important 
32270 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44 20  that a RESERVED 
32280 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61  lock is not obta
32290 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20  ined on the way 
322a0 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
322b0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
322c0 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74  If it were, anot
322d0 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68  her process migh
322e0 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20  t open the.     
322f0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
32300 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45  e, detect the RE
32310 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64  SERVED lock, and
32320 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74   conclude that t
32330 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
32340 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20  base is safe to 
32350 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20  read while this 
32360 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
32370 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20   rolling the .  
32380 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e      ** hot-journ
32390 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a  al back..      *
323a0 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61  * .      ** Beca
323b0 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64  use the intermed
323c0 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f  iate RESERVED lo
323d0 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73  ck is not reques
323e0 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a  ted, any.      *
323f0 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  * other process 
32400 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 63  attempting to ac
32410 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
32420 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74 20  e file will get 
32430 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  to .      ** thi
32440 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63  s point in the c
32450 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 20  ode and fail to 
32460 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45  obtain its own E
32470 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20  XCLUSIVE lock . 
32480 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64       ** on the d
32490 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
324a0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
324b0 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72  Unless the pager
324c0 20 69 73 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d   is in locking_m
324d0 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f  ode=exclusive mo
324e0 64 65 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 0a  de, the lock is.
324f0 20 20 20 20 20 20 2a 2a 20 64 6f 77 6e 67 72 61        ** downgra
32500 64 65 64 20 74 6f 20 53 48 41 52 45 44 5f 4c 4f  ded to SHARED_LO
32510 43 4b 20 62 65 66 6f 72 65 20 74 68 69 73 20 66  CK before this f
32520 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
32530 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
32540 72 63 20 3d 20 70 61 67 65 72 4c 6f 63 6b 44 62  rc = pagerLockDb
32550 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
32560 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
32570 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32580 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
32590 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
325a0 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  }. .      /* If 
325b0 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
325c0 79 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 66  y open and the f
325d0 69 6c 65 20 65 78 69 73 74 73 20 6f 6e 20 64 69  ile exists on di
325e0 73 6b 2c 20 6f 70 65 6e 20 74 68 65 20 0a 20 20  sk, open the .  
325f0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
32600 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
32610 63 65 73 73 2e 20 57 72 69 74 65 20 61 63 63 65  cess. Write acce
32620 73 73 20 69 73 20 72 65 71 75 69 72 65 64 20 62  ss is required b
32630 65 63 61 75 73 65 20 0a 20 20 20 20 20 20 2a 2a  ecause .      **
32640 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
32650 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69  cess mode the fi
32660 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
32670 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20  ll be kept open 
32680 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 70 6f  .      ** and po
32690 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20  ssibly used for 
326a0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61  a transaction la
326b0 74 65 72 20 6f 6e 2e 20 41 6c 73 6f 2c 20 77 72  ter on. Also, wr
326c0 69 74 65 2d 61 63 63 65 73 73 20 0a 20 20 20 20  ite-access .    
326d0 20 20 2a 2a 20 69 73 20 75 73 75 61 6c 6c 79 20    ** is usually 
326e0 72 65 71 75 69 72 65 64 20 74 6f 20 66 69 6e 61  required to fina
326f0 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lize the journal
32700 20 69 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65   in journal_mode
32710 3d 70 65 72 73 69 73 74 20 0a 20 20 20 20 20 20  =persist .      
32720 2a 2a 20 6d 6f 64 65 20 28 61 6e 64 20 61 6c 73  ** mode (and als
32730 6f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  o for journal_mo
32740 64 65 3d 74 72 75 6e 63 61 74 65 20 6f 6e 20 73  de=truncate on s
32750 6f 6d 65 20 73 79 73 74 65 6d 73 29 2e 0a 20 20  ome systems)..  
32760 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
32770 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64  If the journal d
32780 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 69  oes not exist, i
32790 74 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20  t usually means 
327a0 74 68 61 74 20 73 6f 6d 65 20 0a 20 20 20 20 20  that some .     
327b0 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   ** other connec
327c0 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74 6f 20  tion managed to 
327d0 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c 6c 20  get in and roll 
327e0 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65 20 0a  it back before .
327f0 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f        ** this co
32800 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e 65  nnection obtaine
32810 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  d the exclusive 
32820 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c 20  lock above. Or, 
32830 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79  it .      ** may
32840 20 6d 65 61 6e 20 74 68 61 74 20 74 68 65 20 70   mean that the p
32850 61 67 65 72 20 77 61 73 20 69 6e 20 74 68 65 20  ager was in the 
32860 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e  error-state when
32870 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 66   this.      ** f
32880 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
32890 65 64 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  ed and the journ
328a0 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
328b0 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f   exist..      */
328c0 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4f 70  .      if( !isOp
328d0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
328e0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
328f0 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
32900 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
32910 66 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  fs;.        int 
32920 62 45 78 69 73 74 73 3b 20 20 20 20 20 20 20 20  bExists;        
32930 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
32940 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
32950 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ists */.        
32960 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
32970 63 65 73 73 28 0a 20 20 20 20 20 20 20 20 20 20  cess(.          
32980 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e    pVfs, pPager->
32990 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
329a0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
329b0 26 62 45 78 69 73 74 73 29 3b 0a 20 20 20 20 20  &bExists);.     
329c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
329d0 45 5f 4f 4b 20 26 26 20 62 45 78 69 73 74 73 20  E_OK && bExists 
329e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
329f0 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20   fout = 0;.     
32a00 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c       int f = SQL
32a10 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
32a20 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  TE|SQLITE_OPEN_M
32a30 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20  AIN_JOURNAL;.   
32a40 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
32a50 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
32a60 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
32a70 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
32a80 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
32a90 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
32aa0 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b  >jfd, f, &fout);
32ab0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
32ac0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
32ad0 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65   || isOpen(pPage
32ae0 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20  r->jfd) );.     
32af0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
32b00 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53  ITE_OK && fout&S
32b10 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
32b20 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NLY ){.         
32b30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
32b40 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
32b50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
32b60 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
32b70 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  >jfd);.         
32b80 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
32b90 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20     }. .      /* 
32ba0 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c  Playback and del
32bb0 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
32bc0 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62    Drop the datab
32bd0 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20  ase write.      
32be0 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63  ** lock and reac
32bf0 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c  quire the read l
32c00 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63  ock. Purge the c
32c10 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20  ache before.    
32c20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63    ** playing bac
32c30 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61  k the hot-journa
32c40 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e  l so that we don
32c50 27 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20  't end up with. 
32c60 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e       ** an incon
32c70 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20 20  sistent cache.  
32c80 53 79 6e 63 20 74 68 65 20 68 6f 74 20 6a 6f 75  Sync the hot jou
32c90 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79  rnal before play
32ca0 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  ing.      ** it 
32cb0 62 61 63 6b 20 73 69 6e 63 65 20 74 68 65 20 70  back since the p
32cc0 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 61 73  rocess that cras
32cd0 68 65 64 20 61 6e 64 20 6c 65 66 74 20 74 68 65  hed and left the
32ce0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   hot journal.   
32cf0 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 64     ** probably d
32d00 69 64 20 6e 6f 74 20 73 79 6e 63 20 69 74 20 61  id not sync it a
32d10 6e 64 20 77 65 20 61 72 65 20 72 65 71 75 69 72  nd we are requir
32d20 65 64 20 74 6f 20 61 6c 77 61 79 73 20 73 79 6e  ed to always syn
32d30 63 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a  c.      ** the j
32d40 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 70 6c  ournal before pl
32d50 61 79 69 6e 67 20 69 74 20 62 61 63 6b 2e 0a 20  aying it back.. 
32d60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
32d70 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
32d80 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  >jfd) ){.       
32d90 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
32da0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
32db0 20 20 72 63 20 3d 20 70 61 67 65 72 53 79 6e 63    rc = pagerSync
32dc0 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
32dd0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
32de0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
32df0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
32e00 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
32e10 50 61 67 65 72 2c 20 21 70 50 61 67 65 72 2d 3e  Pager, !pPager->
32e20 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  tempFile);.     
32e30 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 53 74       pPager->eSt
32e40 61 74 65 20 3d 20 50 41 47 45 52 5f 4f 50 45 4e  ate = PAGER_OPEN
32e50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32e60 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61    }else if( !pPa
32e70 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
32e80 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  de ){.        pa
32e90 67 65 72 55 6e 6c 6f 63 6b 44 62 28 70 50 61 67  gerUnlockDb(pPag
32ea0 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
32eb0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
32ec0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
32ed0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  OK ){.        /*
32ee0 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
32ef0 74 61 6b 65 6e 20 69 66 20 61 6e 20 65 72 72 6f  taken if an erro
32f00 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  r occurs while t
32f10 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 0a 20 20  rying to open.  
32f20 20 20 20 20 20 20 2a 2a 20 6f 72 20 72 6f 6c 6c        ** or roll
32f30 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72   back a hot-jour
32f40 6e 61 6c 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e  nal while holdin
32f50 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  g an EXCLUSIVE l
32f60 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 20  ock. The.       
32f70 20 2a 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   ** pager_unlock
32f80 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  () routine will 
32f90 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  be called before
32fa0 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 20 75 6e   returning to un
32fb0 6c 6f 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  lock.        ** 
32fc0 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
32fd0 20 75 6e 6c 6f 63 6b 20 61 74 74 65 6d 70 74 20   unlock attempt 
32fe0 66 61 69 6c 73 2c 20 74 68 65 6e 20 50 61 67 65  fails, then Page
32ff0 72 2e 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 0a  r.eLock must be.
33000 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74          ** set t
33010 6f 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 28  o UNKNOWN_LOCK (
33020 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  see the comment 
33030 61 62 6f 76 65 20 74 68 65 20 23 64 65 66 69 6e  above the #defin
33040 65 20 66 6f 72 20 0a 20 20 20 20 20 20 20 20 2a  e for .        *
33050 2a 20 55 4e 4b 4e 4f 57 4e 5f 4c 4f 43 4b 20 61  * UNKNOWN_LOCK a
33060 62 6f 76 65 20 66 6f 72 20 61 6e 20 65 78 70 6c  bove for an expl
33070 61 6e 61 74 69 6f 6e 29 2e 20 0a 20 20 20 20 20  anation). .     
33080 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
33090 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   In order to get
330a0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
330b0 74 6f 20 64 6f 20 74 68 69 73 2c 20 73 65 74 20  to do this, set 
330c0 50 61 67 65 72 2e 65 53 74 61 74 65 20 74 6f 0a  Pager.eState to.
330d0 20 20 20 20 20 20 20 20 2a 2a 20 50 41 47 45 52          ** PAGER
330e0 5f 45 52 52 4f 52 20 6e 6f 77 2e 20 54 68 69 73  _ERROR now. This
330f0 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   is not actually
33100 20 63 6f 75 6e 74 65 64 20 61 73 20 61 20 74 72   counted as a tr
33110 61 6e 73 69 74 69 6f 6e 0a 20 20 20 20 20 20 20  ansition.       
33120 20 2a 2a 20 74 6f 20 45 52 52 4f 52 20 73 74 61   ** to ERROR sta
33130 74 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 20  te in the state 
33140 64 69 61 67 72 61 6d 20 61 74 20 74 68 65 20 74  diagram at the t
33150 6f 70 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2c  op of this file,
33160 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 63  .        ** sinc
33170 65 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  e we know that t
33180 68 65 20 73 61 6d 65 20 63 61 6c 6c 20 74 6f 20  he same call to 
33190 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77  pager_unlock() w
331a0 69 6c 6c 20 76 65 72 79 0a 20 20 20 20 20 20 20  ill very.       
331b0 20 2a 2a 20 73 68 6f 72 74 6c 79 20 74 72 61 6e   ** shortly tran
331c0 73 69 74 69 6f 6e 20 74 68 65 20 70 61 67 65 72  sition the pager
331d0 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 4f   object to the O
331e0 50 45 4e 20 73 74 61 74 65 2e 20 43 61 6c 6c 69  PEN state. Calli
331f0 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73  ng.        ** as
33200 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
33210 28 29 20 77 6f 75 6c 64 20 66 61 69 6c 20 6e 6f  () would fail no
33220 77 2c 20 61 73 20 69 74 20 73 68 6f 75 6c 64 20  w, as it should 
33230 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a  not be possible.
33240 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65          ** to be
33250 20 69 6e 20 45 52 52 4f 52 20 73 74 61 74 65 20   in ERROR state 
33260 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 7a  when there are z
33270 65 72 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  ero outstanding 
33280 70 61 67 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  page .        **
33290 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 20 20 20   references..   
332a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
332b0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
332c0 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
332d0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
332e0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
332f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
33300 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
33310 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
33320 20 28 70 50 61 67 65 72 2d 3e 65 4c 6f 63 6b 3d   (pPager->eLock=
33330 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 0a 20 20  =SHARED_LOCK).  
33340 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61           || (pPa
33350 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
33360 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 4c  de && pPager->eL
33370 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ock>SHARED_LOCK)
33380 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
33390 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
333a0 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 70 50  ->tempFile && pP
333b0 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61  ager->hasHeldSha
333c0 72 65 64 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  redLock ){.     
333d0 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c   /* The shared-l
333e0 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65  ock has just bee
333f0 6e 20 61 63 71 75 69 72 65 64 20 74 68 65 6e 20  n acquired then 
33400 63 68 65 63 6b 20 74 6f 0a 20 20 20 20 20 20 2a  check to.      *
33410 2a 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74  * see if the dat
33420 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d  abase has been m
33430 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65  odified.  If the
33440 20 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68   database has ch
33450 61 6e 67 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20  anged,.      ** 
33460 66 6c 75 73 68 20 74 68 65 20 63 61 63 68 65 2e  flush the cache.
33470 20 20 54 68 65 20 68 61 73 48 65 6c 64 53 68 61    The hasHeldSha
33480 72 65 64 4c 6f 63 6b 20 66 6c 61 67 20 70 72 65  redLock flag pre
33490 76 65 6e 74 73 20 74 68 69 73 20 66 72 6f 6d 0a  vents this from.
334a0 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 69        ** occurri
334b0 6e 67 20 6f 6e 20 74 68 65 20 76 65 72 79 20 66  ng on the very f
334c0 69 72 73 74 20 61 63 63 65 73 73 20 74 6f 20 61  irst access to a
334d0 20 66 69 6c 65 2c 20 69 6e 20 6f 72 64 65 72 20   file, in order 
334e0 74 6f 20 73 61 76 65 20 61 0a 20 20 20 20 20 20  to save a.      
334f0 2a 2a 20 73 69 6e 67 6c 65 20 75 6e 6e 65 63 65  ** single unnece
33500 73 73 61 72 79 20 73 71 6c 69 74 65 33 4f 73 52  ssary sqlite3OsR
33510 65 61 64 28 29 20 63 61 6c 6c 20 61 74 20 74 68  ead() call at th
33520 65 20 73 74 61 72 74 2d 75 70 2e 0a 20 20 20 20  e start-up..    
33530 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61    **.      ** Da
33540 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 61  tabase changes a
33550 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20 6c  re detected by l
33560 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74  ooking at 15 byt
33570 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20  es beginning.   
33580 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20     ** at offset 
33590 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  24 into the file
335a0 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20 6f  .  The first 4 o
335b0 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65 73  f these 16 bytes
335c0 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20   are.      ** a 
335d0 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74  32-bit counter t
335e0 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  hat is increment
335f0 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68 61  ed with each cha
33600 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  nge.  The.      
33610 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20 63  ** other bytes c
33620 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77  hange randomly w
33630 69 74 68 20 65 61 63 68 20 66 69 6c 65 20 63 68  ith each file ch
33640 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20  ange when.      
33650 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e  ** a codec is in
33660 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a   use..      ** .
33670 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69        ** There i
33680 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20  s a vanishingly 
33690 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61  small chance tha
336a0 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20  t a change will 
336b0 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a  not be .      **
336c0 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20   detected.  The 
336d0 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64  chance of an und
336e0 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69  etected change i
336f0 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a  s so small that.
33700 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20        ** it can 
33710 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20  be neglected..  
33720 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 68 61      */.      cha
33730 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a  r dbFileVers[siz
33740 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
33750 6c 65 56 65 72 73 29 5d 3b 0a 0a 20 20 20 20 20  leVers)];..     
33760 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52   IOTRACE(("CKVER
33770 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  S %p %d\n", pPag
33780 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  er, sizeof(dbFil
33790 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20  eVers)));.      
337a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
337b0 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ad(pPager->fd, &
337c0 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
337d0 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20  of(dbFileVers), 
337e0 32 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  24);.      if( r
337f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
33800 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
33810 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
33820 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
33830 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
33840 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33850 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c      memset(dbFil
33860 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66  eVers, 0, sizeof
33870 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  (dbFileVers));. 
33880 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
33890 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d  ( memcmp(pPager-
338a0 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46  >dbFileVers, dbF
338b0 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
338c0 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20  dbFileVers))!=0 
338d0 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
338e0 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
338f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 6d 61  .        /* Unma
33900 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  p the database f
33910 69 6c 65 2e 20 49 74 20 69 73 20 70 6f 73 73 69  ile. It is possi
33920 62 6c 65 20 74 68 61 74 20 65 78 74 65 72 6e 61  ble that externa
33930 6c 20 70 72 6f 63 65 73 73 65 73 0a 20 20 20 20  l processes.    
33940 20 20 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20      ** may have 
33950 74 72 75 6e 63 61 74 65 64 20 74 68 65 20 64 61  truncated the da
33960 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
33970 74 68 65 6e 20 65 78 74 65 6e 64 65 64 20 69 74  then extended it
33980 20 62 61 63 6b 0a 20 20 20 20 20 20 20 20 2a 2a   back.        **
33990 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
339a0 20 73 69 7a 65 20 77 68 69 6c 65 20 74 68 69 73   size while this
339b0 20 70 72 6f 63 65 73 73 20 77 61 73 20 6e 6f 74   process was not
339c0 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 2e   holding a lock.
339d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74  .        ** In t
339e0 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20 6d  his case there m
339f0 61 79 20 65 78 69 73 74 20 61 20 50 61 67 65 72  ay exist a Pager
33a00 2e 70 4d 61 70 20 6d 61 70 70 69 6e 67 20 74 68  .pMap mapping th
33a10 61 74 20 61 70 70 65 61 72 73 0a 20 20 20 20 20  at appears.     
33a20 20 20 20 2a 2a 20 74 6f 20 62 65 20 74 68 65 20     ** to be the 
33a30 72 69 67 68 74 20 73 69 7a 65 20 62 75 74 20 69  right size but i
33a40 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 76  s not actually v
33a50 61 6c 69 64 2e 20 41 76 6f 69 64 20 74 68 69 73  alid. Avoid this
33a60 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  .        ** poss
33a70 69 62 69 6c 69 74 79 20 62 79 20 75 6e 6d 61 70  ibility by unmap
33a80 70 69 6e 67 20 74 68 65 20 64 62 20 68 65 72 65  ping the db here
33a90 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
33aa0 20 55 53 45 46 45 54 43 48 28 70 50 61 67 65 72   USEFETCH(pPager
33ab0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
33ac0 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68 28  qlite3OsUnfetch(
33ad0 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 2c 20 30  pPager->fd, 0, 0
33ae0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
33af0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
33b00 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
33b10 20 57 41 4c 20 66 69 6c 65 20 69 6e 20 74 68 65   WAL file in the
33b20 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 6f 70   file-system, op
33b30 65 6e 20 74 68 69 73 20 64 61 74 61 62 61 73 65  en this database
33b40 20 69 6e 20 57 41 4c 0a 20 20 20 20 2a 2a 20 6d   in WAL.    ** m
33b50 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ode. Otherwise, 
33b60 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  the following fu
33b70 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 69 73 20 61  nction call is a
33b80 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20   no-op..    */. 
33b90 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65     rc = pagerOpe
33ba0 6e 57 61 6c 49 66 50 72 65 73 65 6e 74 28 70 50  nWalIfPresent(pP
33bb0 61 67 65 72 29 3b 0a 23 69 66 6e 64 65 66 20 53  ager);.#ifndef S
33bc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
33bd0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
33be0 72 2d 3e 70 57 61 6c 3d 3d 30 20 7c 7c 20 72 63  r->pWal==0 || rc
33bf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 23  ==SQLITE_OK );.#
33c00 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28  endif.  }..  if(
33c10 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
33c20 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73 65  ger) ){.    asse
33c30 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
33c40 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  K );.    rc = pa
33c50 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e  gerBeginReadTran
33c60 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
33c70 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
33c80 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20  er->tempFile==0 
33c90 26 26 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  && pPager->eStat
33ca0 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20 26 26  e==PAGER_OPEN &&
33cb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
33cc0 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
33cd0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
33ce0 2c 20 26 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  , &pPager->dbSiz
33cf0 65 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64  e);.  }.. failed
33d00 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
33d10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
33d20 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
33d30 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
33d40 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73  pPager);.    ass
33d50 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74  ert( pPager->eSt
33d60 61 74 65 3d 3d 50 41 47 45 52 5f 4f 50 45 4e 20  ate==PAGER_OPEN 
33d70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
33d80 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d  pPager->eState =
33d90 20 50 41 47 45 52 5f 52 45 41 44 45 52 3b 0a 20   PAGER_READER;. 
33da0 20 20 20 70 50 61 67 65 72 2d 3e 68 61 73 48 65     pPager->hasHe
33db0 6c 64 53 68 61 72 65 64 4c 6f 63 6b 20 3d 20 31  ldSharedLock = 1
33dc0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
33dd0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  c;.}../*.** If t
33de0 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
33df0 6e 74 20 68 61 73 20 72 65 61 63 68 65 64 20 7a  nt has reached z
33e00 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ero, rollback an
33e10 79 20 61 63 74 69 76 65 0a 2a 2a 20 74 72 61 6e  y active.** tran
33e20 73 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f  saction and unlo
33e30 63 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2a  ck the pager..**
33e40 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69 6e 20 6c  .** Except, in l
33e50 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
33e60 55 53 49 56 45 20 77 68 65 6e 20 74 68 65 72 65  USIVE when there
33e70 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 69   is nothing to i
33e80 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  n.** the rollbac
33e90 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 20 75  k journal, the u
33ea0 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 70 65 72  nlock is not per
33eb0 66 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 72 65  formed and there
33ec0 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 74   is.** nothing t
33ed0 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73 6f 20 74  o rollback, so t
33ee0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
33ef0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73 74 61 74   no-op..*/ .stat
33f00 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
33f10 6f 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65  ockIfUnused(Page
33f20 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
33f30 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
33f40 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
33f50 70 50 43 61 63 68 65 29 3d 3d 30 20 29 7b 0a 20  pPCache)==0 ){. 
33f60 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
33f70 72 2d 3e 6e 4d 6d 61 70 4f 75 74 3d 3d 30 20 29  r->nMmapOut==0 )
33f80 3b 20 2f 2a 20 62 65 63 61 75 73 65 20 70 61 67  ; /* because pag
33f90 65 31 20 69 73 20 6e 65 76 65 72 20 6d 65 6d 6f  e1 is never memo
33fa0 72 79 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20 20  ry mapped */.   
33fb0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
33fc0 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
33fd0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
33fe0 65 20 70 61 67 65 20 67 65 74 74 65 72 20 6d 65  e page getter me
33ff0 74 68 6f 64 73 20 65 61 63 68 20 74 72 79 20 74  thods each try t
34000 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 66 65  o acquire a refe
34010 72 65 6e 63 65 20 74 6f 20 61 0a 2a 2a 20 70 61  rence to a.** pa
34020 67 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  ge with page num
34030 62 65 72 20 70 67 6e 6f 2e 20 49 66 20 74 68 65  ber pgno. If the
34040 20 72 65 71 75 65 73 74 65 64 20 72 65 66 65 72   requested refer
34050 65 6e 63 65 20 69 73 20 0a 2a 2a 20 73 75 63 63  ence is .** succ
34060 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65  essfully obtaine
34070 64 2c 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  d, it is copied 
34080 74 6f 20 2a 70 70 50 61 67 65 20 61 6e 64 20 53  to *ppPage and S
34090 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
340a0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61  d..**.** There a
340b0 72 65 20 64 69 66 66 65 72 65 6e 74 20 69 6d 70  re different imp
340c0 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20  lementations of 
340d0 74 68 65 20 67 65 74 74 65 72 20 6d 65 74 68 6f  the getter metho
340e0 64 20 64 65 70 65 6e 64 69 6e 67 0a 2a 2a 20 6f  d depending.** o
340f0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  n the current st
34100 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72  ate of the pager
34110 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 67 65 74 50  ..**.**     getP
34120 61 67 65 4e 6f 72 6d 61 6c 28 29 20 20 20 20 20  ageNormal()     
34130 20 20 20 20 2d 2d 20 20 54 68 65 20 6e 6f 72 6d      --  The norm
34140 61 6c 20 67 65 74 74 65 72 0a 2a 2a 20 20 20 20  al getter.**    
34150 20 67 65 74 50 61 67 65 45 72 72 6f 72 28 29 20   getPageError() 
34160 20 20 20 20 20 20 20 20 20 2d 2d 20 20 55 73 65           --  Use
34170 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69  d if the pager i
34180 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74  s in an error st
34190 61 74 65 0a 2a 2a 20 20 20 20 20 67 65 74 50 61  ate.**     getPa
341a0 67 65 4d 6d 61 70 28 29 20 20 20 20 20 20 20 20  geMmap()        
341b0 20 20 20 2d 2d 20 20 55 73 65 64 20 69 66 20 6d     --  Used if m
341c0 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20 49 2f 4f  emory-mapped I/O
341d0 20 69 73 20 65 6e 61 62 6c 65 64 0a 2a 2a 0a 2a   is enabled.**.*
341e0 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  * If the request
341f0 65 64 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  ed page is alrea
34200 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  dy in the cache,
34210 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e   it is returned.
34220 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
34230 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63  a new page objec
34240 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  t is allocated a
34250 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  nd populated wit
34260 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66  h data.** read f
34270 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
34280 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63   file. In some c
34290 61 73 65 73 2c 20 74 68 65 20 70 63 61 63 68 65  ases, the pcache
342a0 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63   module may.** c
342b0 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c  hoose not to all
342c0 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
342d0 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20   object and may 
342e0 72 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e  reuse an existin
342f0 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68  g.** object with
34300 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
34310 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a  references..**.*
34320 2a 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61  * The extra data
34330 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70   appended to a p
34340 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e  age is always in
34350 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72  itialized to zer
34360 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74  os the .** first
34370 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20   time a page is 
34380 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f  loaded into memo
34390 72 79 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ry. If the page 
343a0 72 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a  requested is .**
343b0 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
343c0 63 61 63 68 65 20 77 68 65 6e 20 74 68 69 73 20  cache when this 
343d0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
343e0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74  ed, then the ext
343f0 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65  ra.** data is le
34400 66 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65  ft as it was whe
34410 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63  n the page objec
34420 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e  t was last used.
34430 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
34440 74 61 62 61 73 65 20 69 6d 61 67 65 20 69 73 20  tabase image is 
34450 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
34460 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
34470 6f 72 20 69 66 20 0a 2a 2a 20 74 68 65 20 66 6c  or if .** the fl
34480 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f  ags parameter co
34490 6e 74 61 69 6e 73 20 74 68 65 20 50 41 47 45 52  ntains the PAGER
344a0 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 62  _GET_NOCONTENT b
344b0 69 74 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72  it and the .** r
344c0 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
344d0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73 74 6f   not already sto
344e0 72 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  red in the cache
344f0 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63  , then no .** ac
34500 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64 20 6f  tual disk read o
34510 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73 20 63  ccurs. In this c
34520 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 69  ase the memory i
34530 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  mage of the .** 
34540 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69  page is initiali
34550 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73  zed to all zeros
34560 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 50 41 47 45  . .**.** If PAGE
34570 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
34580 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e  is true, it mean
34590 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  s that we do not
345a0 20 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74   care about.** t
345b0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
345c0 68 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63  he page. This oc
345d0 63 75 72 73 20 69 6e 20 74 77 6f 20 73 63 65 6e  curs in two scen
345e0 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  arios:.**.**   a
345f0 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20 61  ) When reading a
34600 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
34610 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61  page from the da
34620 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a  tabase, and.**.*
34630 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20 73 61  *   b) When a sa
34640 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e 67  vepoint is being
34650 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64   rolled back and
34660 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61 64   we need to load
34670 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20 70  .**      a new p
34680 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61 63  age into the cac
34690 68 65 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20  he to be filled 
346a0 77 69 74 68 20 74 68 65 20 64 61 74 61 20 72 65  with the data re
346b0 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ad.**      from 
346c0 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f  the savepoint jo
346d0 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
346e0 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
346f0 45 4e 54 20 69 73 20 74 72 75 65 2c 20 74 68 65  ENT is true, the
34700 6e 20 74 68 65 20 64 61 74 61 20 72 65 74 75 72  n the data retur
34710 6e 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e  ned is zeroed in
34720 73 74 65 61 64 0a 2a 2a 20 6f 66 20 62 65 69 6e  stead.** of bein
34730 67 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  g read from the 
34740 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69  database. Additi
34750 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73  onally, the bits
34760 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
34770 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67  * to pgno in Pag
34780 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62  er.pInJournal (b
34790 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61  itvec of pages a
347a0 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e 20 74  lready written t
347b0 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  o the.** journal
347c0 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50   file) and the P
347d0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49  agerSavepoint.pI
347e0 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65  nSavepoint bitve
347f0 63 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a  cs of any open.*
34800 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65  * savepoints are
34810 20 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73   set. This means
34820 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
34830 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 61 74  made writable at
34840 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e   any.** point in
34850 20 74 68 65 20 66 75 74 75 72 65 2c 20 75 73 69   the future, usi
34860 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  ng a call to sql
34870 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
34880 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a  , its contents.*
34890 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f  * will not be jo
348a0 75 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61  urnaled. This sa
348b0 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68  ves IO..**.** Th
348c0 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
348d0 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
348e0 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
348f0 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
34900 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
34910 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
34920 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
34930 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
34940 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
34950 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
34960 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69  kup().  Both thi
34970 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f  s routine and Lo
34980 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a  okup() attempt.*
34990 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  * to find a page
349a0 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
349b0 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20  y cache first.  
349c0 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
349d0 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
349e0 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f   memory, this ro
349f0 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69  utine goes to di
34a00 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e  sk to read it in
34a10 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28   whereas Lookup(
34a20 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e  ).** just return
34a30 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69  s 0.  This routi
34a40 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65  ne acquires a re
34a50 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73  ad-lock the firs
34a60 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73  t time it.** has
34a70 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20   to go to disk, 
34a80 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70  and could also p
34a90 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a  layback an old j
34aa0 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
34ab0 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f  ary..** Since Lo
34ac0 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65  okup() never goe
34ad0 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65  s to disk, it ne
34ae0 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20  ver has to deal 
34af0 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72  with locks.** or
34b00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
34b10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
34b20 74 50 61 67 65 4e 6f 72 6d 61 6c 28 0a 20 20 50  tPageNormal(.  P
34b30 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
34b40 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
34b50 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  open on the data
34b60 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
34b70 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
34b80 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
34b90 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  r to fetch */.  
34ba0 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  DbPage **ppPage,
34bb0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70      /* Write a p
34bc0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
34bd0 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ge here */.  int
34be0 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
34bf0 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 58 58   /* PAGER_GET_XX
34c00 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  X flags */.){.  
34c10 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
34c20 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  OK;.  PgHdr *pPg
34c30 3b 0a 20 20 75 38 20 6e 6f 43 6f 6e 74 65 6e 74  ;.  u8 noContent
34c40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34c50 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 50      /* True if P
34c60 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
34c70 4e 54 20 69 73 20 73 65 74 20 2a 2f 0a 20 20 73  NT is set */.  s
34c80 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 70 61  qlite3_pcache_pa
34c90 67 65 20 2a 70 42 61 73 65 3b 0a 0a 20 20 61 73  ge *pBase;..  as
34ca0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
34cb0 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
34cc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
34cd0 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41  ager->eState>=PA
34ce0 47 45 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20  GER_READER );.  
34cf0 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
34d00 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
34d10 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
34d20 70 50 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53  pPager->hasHeldS
34d30 68 61 72 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a  haredLock==1 );.
34d40 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29  .  if( pgno==0 )
34d50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
34d60 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 70  ORRUPT_BKPT;.  p
34d70 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 50 63  Base = sqlite3Pc
34d80 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72  acheFetch(pPager
34d90 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
34da0 20 33 29 3b 0a 20 20 69 66 28 20 70 42 61 73 65   3);.  if( pBase
34db0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 67 20 3d  ==0 ){.    pPg =
34dc0 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
34dd0 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 53  ite3PcacheFetchS
34de0 74 72 65 73 73 28 70 50 61 67 65 72 2d 3e 70 50  tress(pPager->pP
34df0 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 26 70 42  Cache, pgno, &pB
34e00 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ase);.    if( rc
34e10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
34e20 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
34e30 5f 65 72 72 3b 0a 20 20 20 20 69 66 28 20 70 42  _err;.    if( pB
34e40 61 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ase==0 ){.      
34e50 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
34e60 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  M_BKPT;.      go
34e70 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
34e80 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _err;.    }.  }.
34e90 20 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65 20    pPg = *ppPage 
34ea0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  = sqlite3PcacheF
34eb0 65 74 63 68 46 69 6e 69 73 68 28 70 50 61 67 65  etchFinish(pPage
34ec0 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
34ed0 2c 20 70 42 61 73 65 29 3b 0a 20 20 61 73 73 65  , pBase);.  asse
34ee0 72 74 28 20 70 50 67 3d 3d 28 2a 70 70 50 61 67  rt( pPg==(*ppPag
34ef0 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
34f00 70 50 67 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20  pPg->pgno==pgno 
34f10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
34f20 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
34f30 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 3d   || pPg->pPager=
34f40 3d 30 20 29 3b 0a 0a 20 20 6e 6f 43 6f 6e 74 65  =0 );..  noConte
34f50 6e 74 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  nt = (flags & PA
34f60 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
34f70 54 29 21 3d 30 3b 0a 20 20 69 66 28 20 70 50 67  T)!=0;.  if( pPg
34f80 2d 3e 70 50 61 67 65 72 20 26 26 20 21 6e 6f 43  ->pPager && !noC
34f90 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a  ontent ){.    /*
34fa0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
34fb0 65 20 70 63 61 63 68 65 20 61 6c 72 65 61 64 79  e pcache already
34fc0 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 69   contains an ini
34fd0 74 69 61 6c 69 7a 65 64 20 63 6f 70 79 20 6f 66  tialized copy of
34fe0 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65  .    ** the page
34ff0 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74  . Return without
35000 20 66 75 72 74 68 65 72 20 61 64 6f 2e 20 20 2a   further ado.  *
35010 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  /.    assert( pg
35020 6e 6f 3c 3d 50 41 47 45 52 5f 4d 41 58 5f 50 47  no<=PAGER_MAX_PG
35030 4e 4f 20 26 26 20 70 67 6e 6f 21 3d 50 41 47 45  NO && pgno!=PAGE
35040 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
35050 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ) );.    pPager-
35060 3e 61 53 74 61 74 5b 50 41 47 45 52 5f 53 54 41  >aStat[PAGER_STA
35070 54 5f 48 49 54 5d 2b 2b 3b 0a 20 20 20 20 72 65  T_HIT]++;.    re
35080 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
35090 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
350a0 20 54 68 65 20 70 61 67 65 72 20 63 61 63 68 65   The pager cache
350b0 20 68 61 73 20 63 72 65 61 74 65 64 20 61 20 6e   has created a n
350c0 65 77 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e  ew page. Its con
350d0 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20  tent needs to . 
350e0 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c     ** be initial
350f0 69 7a 65 64 2e 20 42 75 74 20 66 69 72 73 74 20  ized. But first 
35100 73 6f 6d 65 20 65 72 72 6f 72 20 63 68 65 63 6b  some error check
35110 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
35120 20 28 31 29 20 54 68 65 20 6d 61 78 69 6d 75 6d   (1) The maximum
35130 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
35140 32 5e 33 31 0a 20 20 20 20 2a 2a 20 28 32 29 20  2^31.    ** (2) 
35150 4e 65 76 65 72 20 74 72 79 20 74 6f 20 66 65 74  Never try to fet
35160 63 68 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70  ch the locking p
35170 61 67 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  age.    */.    i
35180 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41  f( pgno>PAGER_MA
35190 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d  X_PGNO || pgno==
351a0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
351b0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
351c0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
351d0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
351e0 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
351f0 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_err;.    }..  
35200 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20    pPg->pPager = 
35210 70 50 61 67 65 72 3b 0a 0a 20 20 20 20 61 73 73  pPager;..    ass
35220 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61  ert( !isOpen(pPa
35230 67 65 72 2d 3e 66 64 29 20 7c 7c 20 21 4d 45 4d  ger->fd) || !MEM
35240 44 42 20 29 3b 0a 20 20 20 20 69 66 28 20 21 69  DB );.    if( !i
35250 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
35260 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53  ) || pPager->dbS
35270 69 7a 65 3c 70 67 6e 6f 20 7c 7c 20 6e 6f 43 6f  ize<pgno || noCo
35280 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 69  ntent ){.      i
35290 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  f( pgno>pPager->
352a0 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  mxPgno ){.      
352b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55    rc = SQLITE_FU
352c0 4c 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  LL;.        goto
352d0 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65   pager_acquire_e
352e0 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
352f0 20 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20    if( noContent 
35300 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61  ){.        /* Fa
35310 69 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68 65  ilure to set the
35320 20 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a   bits in the InJ
35330 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f  ournal bit-vecto
35340 72 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20  rs is benign..  
35350 20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65        ** It mere
35360 6c 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  ly means that we
35370 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65   might do some e
35380 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75  xtra work to jou
35390 72 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20  rnal a .        
353a0 2a 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f 65  ** page that doe
353b0 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
353c0 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76   journaled.  Nev
353d0 65 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75  ertheless, be su
353e0 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  re .        ** t
353f0 6f 20 74 65 73 74 20 74 68 65 20 63 61 73 65 20  o test the case 
35400 77 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65  where a malloc e
35410 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
35420 65 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20  e trying to set 
35430 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69  .        ** a bi
35440 74 20 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f  t in a bit vecto
35450 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  r..        */.  
35460 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
35470 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
35480 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67  ;.        if( pg
35490 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  no<=pPager->dbOr
354a0 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  igSize ){.      
354b0 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63      TESTONLY( rc
354c0 20 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74 76   = ) sqlite3Bitv
354d0 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49  ecSet(pPager->pI
354e0 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b  nJournal, pgno);
354f0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
35500 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
35510 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
35520 20 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f   }.        TESTO
35530 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64 54  NLY( rc = ) addT
35540 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
35550 73 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  s(pPager, pgno);
35560 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
35570 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  e( rc==SQLITE_NO
35580 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73  MEM );.        s
35590 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
355a0 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d  alloc();.      }
355b0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
355c0 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61  g->pData, 0, pPa
355d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
355e0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
355f0 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70  ZERO %p %d\n", p
35600 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
35610 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35620 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
35630 67 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20  ger==pPager );. 
35640 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 74       pPager->aSt
35650 61 74 5b 50 41 47 45 52 5f 53 54 41 54 5f 4d 49  at[PAGER_STAT_MI
35660 53 53 5d 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20  SS]++;.      rc 
35670 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67  = readDbPage(pPg
35680 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
35690 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
356a0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
356b0 5f 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20  _acquire_err;.  
356c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
356d0 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
356e0 73 68 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72  sh(pPg);.  }.  r
356f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
35700 0a 0a 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  ..pager_acquire_
35710 65 72 72 3a 0a 20 20 61 73 73 65 72 74 28 20 72  err:.  assert( r
35720 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
35730 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
35740 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
35750 6f 70 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  op(pPg);.  }.  p
35760 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
35770 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 2a 70  ed(pPager);.  *p
35780 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74  pPage = 0;.  ret
35790 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 53  urn rc;.}..#if S
357a0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
357b0 49 5a 45 3e 30 0a 2f 2a 20 54 68 65 20 70 61 67  IZE>0./* The pag
357c0 65 20 67 65 74 74 65 72 20 66 6f 72 20 77 68 65  e getter for whe
357d0 6e 20 6d 65 6d 6f 72 79 2d 6d 61 70 70 65 64 20  n memory-mapped 
357e0 49 2f 4f 20 69 73 20 65 6e 61 62 6c 65 64 20 2a  I/O is enabled *
357f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
35800 50 61 67 65 4d 4d 61 70 28 0a 20 20 50 61 67 65  PageMMap(.  Page
35810 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
35820 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65  /* The pager ope
35830 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
35840 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
35850 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
35860 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
35870 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50  o fetch */.  DbP
35880 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
35890 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e   /* Write a poin
358a0 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
358b0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
358c0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ags           /*
358d0 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58 20 66   PAGER_GET_XXX f
358e0 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  lags */.){.  int
358f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
35900 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
35910 30 3b 0a 20 20 75 33 32 20 69 46 72 61 6d 65 20  0;.  u32 iFrame 
35920 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
35930 20 20 20 20 20 2f 2a 20 46 72 61 6d 65 20 74 6f       /* Frame to
35940 20 72 65 61 64 20 66 72 6f 6d 20 57 41 4c 20 66   read from WAL f
35950 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20  ile */..  /* It 
35960 69 73 20 61 63 63 65 70 74 61 62 6c 65 20 74 6f  is acceptable to
35970 20 75 73 65 20 61 20 72 65 61 64 2d 6f 6e 6c 79   use a read-only
35980 20 28 6d 6d 61 70 29 20 70 61 67 65 20 66 6f 72   (mmap) page for
35990 20 61 6e 79 20 70 61 67 65 20 65 78 63 65 70 74   any page except
359a0 0a 20 20 2a 2a 20 70 61 67 65 20 31 20 69 66 20  .  ** page 1 if 
359b0 74 68 65 72 65 20 69 73 20 6e 6f 20 77 72 69 74  there is no writ
359c0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  e-transaction op
359d0 65 6e 20 6f 72 20 74 68 65 20 41 43 51 55 49 52  en or the ACQUIR
359e0 45 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20  E_READONLY.  ** 
359f0 66 6c 61 67 20 77 61 73 20 73 70 65 63 69 66 69  flag was specifi
35a00 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
35a10 2e 20 41 6e 64 20 73 6f 20 6c 6f 6e 67 20 61 73  . And so long as
35a20 20 74 68 65 20 64 62 20 69 73 20 6e 6f 74 20 61   the db is not a
35a30 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79   .  ** temporary
35a40 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   or in-memory da
35a50 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 63 6f  tabase.  */.  co
35a60 6e 73 74 20 69 6e 74 20 62 4d 6d 61 70 4f 6b 20  nst int bMmapOk 
35a70 3d 20 28 70 67 6e 6f 3e 31 0a 20 20 20 26 26 20  = (pgno>1.   && 
35a80 28 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3d  (pPager->eState=
35a90 3d 50 41 47 45 52 5f 52 45 41 44 45 52 20 7c 7c  =PAGER_READER ||
35aa0 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
35ab0 47 45 54 5f 52 45 41 44 4f 4e 4c 59 29 29 0a 20  GET_READONLY)). 
35ac0 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 55   );..  assert( U
35ad0 53 45 46 45 54 43 48 28 70 50 61 67 65 72 29 20  SEFETCH(pPager) 
35ae0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
35af0 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 61 73 73  _HAS_CODEC.  ass
35b00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 78 43 6f  ert( pPager->xCo
35b10 64 65 63 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66  dec==0 );.#endif
35b20 0a 0a 20 20 2f 2a 20 4f 70 74 69 6d 69 7a 61 74  ..  /* Optimizat
35b30 69 6f 6e 20 6e 6f 74 65 3a 20 20 41 64 64 69 6e  ion note:  Addin
35b40 67 20 74 68 65 20 22 70 67 6e 6f 3c 3d 31 22 20  g the "pgno<=1" 
35b50 74 65 72 6d 20 62 65 66 6f 72 65 20 22 70 67 6e  term before "pgn
35b60 6f 3d 3d 30 22 20 68 65 72 65 0a 20 20 2a 2a 20  o==0" here.  ** 
35b70 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 6d 70 69  allows the compi
35b80 6c 65 72 20 6f 70 74 69 6d 69 7a 65 72 20 74 6f  ler optimizer to
35b90 20 72 65 75 73 65 20 74 68 65 20 72 65 73 75 6c   reuse the resul
35ba0 74 73 20 6f 66 20 74 68 65 20 22 70 67 6e 6f 3e  ts of the "pgno>
35bb0 31 22 0a 20 20 2a 2a 20 74 65 73 74 20 69 6e 20  1".  ** test in 
35bc0 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 74 61  the previous sta
35bd0 74 65 6d 65 6e 74 2c 20 61 6e 64 20 61 76 6f 69  tement, and avoi
35be0 64 20 74 65 73 74 69 6e 67 20 70 67 6e 6f 3d 3d  d testing pgno==
35bf0 30 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 63 6f  0 in the.  ** co
35c00 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
35c10 70 67 6e 6f 20 69 73 20 6c 61 72 67 65 2e 20 2a  pgno is large. *
35c20 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3c 3d 31 20  /.  if( pgno<=1 
35c30 26 26 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  && pgno==0 ){.  
35c40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
35c50 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
35c60 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
35c70 65 72 2d 3e 65 53 74 61 74 65 3e 3d 50 41 47 45  er->eState>=PAGE
35c80 52 5f 52 45 41 44 45 52 20 29 3b 0a 20 20 61 73  R_READER );.  as
35c90 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
35ca0 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
35cb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
35cc0 61 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61  ager->hasHeldSha
35cd0 72 65 64 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20  redLock==1 );.  
35ce0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
35cf0 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
35d00 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 62 4d 6d  OK );..  if( bMm
35d10 61 70 4f 6b 20 26 26 20 70 61 67 65 72 55 73 65  apOk && pagerUse
35d20 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
35d30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57     rc = sqlite3W
35d40 61 6c 46 69 6e 64 46 72 61 6d 65 28 70 50 61 67  alFindFrame(pPag
35d50 65 72 2d 3e 70 57 61 6c 2c 20 70 67 6e 6f 2c 20  er->pWal, pgno, 
35d60 26 69 46 72 61 6d 65 29 3b 0a 20 20 20 20 69 66  &iFrame);.    if
35d70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
35d80 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65  ){.      *ppPage
35d90 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
35da0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
35db0 0a 20 20 69 66 28 20 62 4d 6d 61 70 4f 6b 20 26  .  if( bMmapOk &
35dc0 26 20 69 46 72 61 6d 65 3d 3d 30 20 29 7b 0a 20  & iFrame==0 ){. 
35dd0 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d     void *pData =
35de0 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
35df0 69 74 65 33 4f 73 46 65 74 63 68 28 70 50 61 67  ite3OsFetch(pPag
35e00 65 72 2d 3e 66 64 2c 20 0a 20 20 20 20 20 20 20  er->fd, .       
35e10 20 28 69 36 34 29 28 70 67 6e 6f 2d 31 29 20 2a   (i64)(pgno-1) *
35e20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
35e30 65 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  e, pPager->pageS
35e40 69 7a 65 2c 20 26 70 44 61 74 61 0a 20 20 20 20  ize, &pData.    
35e50 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
35e60 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74  QLITE_OK && pDat
35e70 61 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  a ){.      if( p
35e80 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 50 41  Pager->eState>PA
35e90 47 45 52 5f 52 45 41 44 45 52 20 7c 7c 20 70 50  GER_READER || pP
35ea0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
35eb0 7b 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d 20  {.        pPg = 
35ec0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
35ed0 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
35ee0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
35ef0 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
35f00 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
35f10 41 63 71 75 69 72 65 4d 61 70 50 61 67 65 28 70  AcquireMapPage(p
35f20 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 44 61  Pager, pgno, pDa
35f30 74 61 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20  ta, &pPg);.     
35f40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
35f50 73 71 6c 69 74 65 33 4f 73 55 6e 66 65 74 63 68  sqlite3OsUnfetch
35f60 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 69 36  (pPager->fd, (i6
35f70 34 29 28 70 67 6e 6f 2d 31 29 2a 70 50 61 67 65  4)(pgno-1)*pPage
35f80 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 44 61  r->pageSize, pDa
35f90 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ta);.      }.   
35fa0 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20     if( pPg ){.  
35fb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
35fc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
35fd0 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
35fe0 20 70 50 67 3b 0a 20 20 20 20 20 20 20 20 72 65   pPg;.        re
35ff0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
36000 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
36010 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
36020 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  _OK ){.      *pp
36030 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
36040 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
36050 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 67 65  .  }.  return ge
36060 74 50 61 67 65 4e 6f 72 6d 61 6c 28 70 50 61 67  tPageNormal(pPag
36070 65 72 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65  er, pgno, ppPage
36080 2c 20 66 6c 61 67 73 29 3b 0a 7d 0a 23 65 6e 64  , flags);.}.#end
36090 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58  if /* SQLITE_MAX
360a0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a  _MMAP_SIZE>0 */.
360b0 0a 2f 2a 20 54 68 65 20 70 61 67 65 20 67 65 74  ./* The page get
360c0 74 65 72 20 6d 65 74 68 6f 64 20 66 6f 72 20 77  ter method for w
360d0 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
360e0 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20   an error state 
360f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
36100 74 50 61 67 65 45 72 72 6f 72 28 0a 20 20 50 61  tPageError(.  Pa
36110 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
36120 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
36130 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
36140 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
36150 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
36160 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
36170 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44   to fetch */.  D
36180 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  bPage **ppPage, 
36190 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f     /* Write a po
361a0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
361b0 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
361c0 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
361d0 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 58 58 58  /* PAGER_GET_XXX
361e0 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 55   flags */.){.  U
361f0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
36200 70 67 6e 6f 29 3b 0a 20 20 55 4e 55 53 45 44 5f  pgno);.  UNUSED_
36210 50 41 52 41 4d 45 54 45 52 28 66 6c 61 67 73 29  PARAMETER(flags)
36220 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
36230 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
36240 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 2a 70 70 50  ITE_OK );.  *ppP
36250 61 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  age = 0;.  retur
36260 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
36270 65 3b 0a 7d 0a 0a 0a 2f 2a 20 44 69 73 70 61 74  e;.}.../* Dispat
36280 63 68 20 61 6c 6c 20 70 61 67 65 20 66 65 74 63  ch all page fetc
36290 68 20 72 65 71 75 65 73 74 73 20 74 6f 20 74 68  h requests to th
362a0 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 67 65  e appropriate ge
362b0 74 74 65 72 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a  tter method..*/.
362c0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
362d0 47 65 74 28 0a 20 20 50 61 67 65 72 20 2a 70 50  Get(.  Pager *pP
362e0 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
362f0 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
36300 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
36310 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
36320 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
36330 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
36340 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
36350 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
36360 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
36370 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
36380 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
36390 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
363a0 52 5f 47 45 54 5f 58 58 58 20 66 6c 61 67 73 20  R_GET_XXX flags 
363b0 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  */.){.  return p
363c0 50 61 67 65 72 2d 3e 78 47 65 74 28 70 50 61 67  Pager->xGet(pPag
363d0 65 72 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65  er, pgno, ppPage
363e0 2c 20 66 6c 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a  , flags);.}../*.
363f0 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
36400 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  e if it is alrea
36410 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  dy in the in-mem
36420 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a  ory cache.  Do.*
36430 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70  * not read the p
36440 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20  age from disk.  
36450 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
36460 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a   to the page,.**
36470 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67   or 0 if the pag
36480 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
36490 65 2e 20 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  e. .**.** See al
364a0 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  so sqlite3PagerG
364b0 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65  et().  The diffe
364c0 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
364d0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e  is routine.** an
364e0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  d sqlite3PagerGe
364f0 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74  t() is that _get
36500 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68  () will go to th
36510 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a  e disk and read.
36520 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69  ** in the page i
36530 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
36540 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63  t already in cac
36550 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  he.  This routin
36560 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c  e.** returns NUL
36570 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  L if the page is
36580 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
36590 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65   if a disk I/O e
365a0 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65  rror .** has eve
365b0 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44  r happened..*/.D
365c0 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61  bPage *sqlite3Pa
365d0 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20  gerLookup(Pager 
365e0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
365f0 6e 6f 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 70  no){.  sqlite3_p
36600 63 61 63 68 65 5f 70 61 67 65 20 2a 70 50 61 67  cache_page *pPag
36610 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  e;.  assert( pPa
36620 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
36630 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
36640 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
36650 3e 70 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20  >pPCache!=0 );. 
36660 20 70 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33   pPage = sqlite3
36670 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67  PcacheFetch(pPag
36680 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
36690 6f 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  o, 0);.  assert(
366a0 20 70 50 61 67 65 3d 3d 30 20 7c 7c 20 70 50 61   pPage==0 || pPa
366b0 67 65 72 2d 3e 68 61 73 48 65 6c 64 53 68 61 72  ger->hasHeldShar
366c0 65 64 4c 6f 63 6b 20 29 3b 0a 20 20 69 66 28 20  edLock );.  if( 
366d0 70 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72  pPage==0 ) retur
366e0 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  n 0;.  return sq
366f0 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
36700 46 69 6e 69 73 68 28 70 50 61 67 65 72 2d 3e 70  Finish(pPager->p
36710 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 70 50  PCache, pgno, pP
36720 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  age);.}../*.** R
36730 65 6c 65 61 73 65 20 61 20 70 61 67 65 20 72 65  elease a page re
36740 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54  ference..**.** T
36750 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  he sqlite3PagerU
36760 6e 72 65 66 28 29 20 61 6e 64 20 73 71 6c 69 74  nref() and sqlit
36770 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e  e3PagerUnrefNotN
36780 75 6c 6c 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62  ull() may only b
36790 65 0a 2a 2a 20 75 73 65 64 20 69 66 20 77 65 20  e.** used if we 
367a0 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 70 61  know that the pa
367b0 67 65 20 62 65 69 6e 67 20 72 65 6c 65 61 73 65  ge being release
367c0 64 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73  d is not the las
367d0 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65 20 62  t page..** The b
367e0 74 72 65 65 20 6c 61 79 65 72 20 61 6c 77 61 79  tree layer alway
367f0 73 20 68 6f 6c 64 73 20 70 61 67 65 31 20 6f 70  s holds page1 op
36800 65 6e 20 75 6e 74 69 6c 20 74 68 65 20 65 6e 64  en until the end
36810 2c 20 73 6f 20 74 68 65 73 65 20 66 69 72 73 74  , so these first
36820 0a 2a 2a 20 74 6f 20 72 6f 75 74 69 6e 65 73 20  .** to routines 
36830 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72  can be used to r
36840 65 6c 65 61 73 65 20 61 6e 79 20 70 61 67 65 20  elease any page 
36850 6f 74 68 65 72 20 74 68 61 6e 20 42 74 53 68 61  other than BtSha
36860 72 65 64 2e 70 50 61 67 65 31 2e 0a 2a 2a 0a 2a  red.pPage1..**.*
36870 2a 20 55 73 65 20 73 71 6c 69 74 65 33 50 61 67  * Use sqlite3Pag
36880 65 72 55 6e 72 65 66 50 61 67 65 4f 6e 65 28 29  erUnrefPageOne()
36890 20 74 6f 20 72 65 6c 65 61 73 65 20 70 61 67 65   to release page
368a0 31 2e 20 20 54 68 69 73 20 6c 61 74 74 65 72 20  1.  This latter 
368b0 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 68 65 63 6b  routine.** check
368c0 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
368d0 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  er of outstandin
368e0 67 20 70 61 67 65 73 20 61 6e 64 20 69 66 20 74  g pages and if t
368f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
36900 70 61 67 65 73 20 72 65 61 63 68 65 73 20 7a 65  pages reaches ze
36910 72 6f 20 69 74 20 64 72 6f 70 73 20 74 68 65 20  ro it drops the 
36920 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 0a 2a  database lock..*
36930 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
36940 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
36950 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
36960 54 45 53 54 4f 4e 4c 59 28 20 50 61 67 65 72 20  TESTONLY( Pager 
36970 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
36980 50 61 67 65 72 3b 20 29 0a 20 20 61 73 73 65 72  Pager; ).  asser
36990 74 28 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 69  t( pPg!=0 );.  i
369a0 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 20  f( pPg->flags & 
369b0 50 47 48 44 52 5f 4d 4d 41 50 20 29 7b 0a 20 20  PGHDR_MMAP ){.  
369c0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
369d0 67 6e 6f 21 3d 31 20 29 3b 20 20 2f 2a 20 50 61  gno!=1 );  /* Pa
369e0 67 65 31 20 69 73 20 6e 65 76 65 72 20 6d 65 6d  ge1 is never mem
369f0 6f 72 79 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20  ory mapped */.  
36a00 20 20 70 61 67 65 72 52 65 6c 65 61 73 65 4d 61    pagerReleaseMa
36a10 70 50 61 67 65 28 70 50 67 29 3b 0a 20 20 7d 65  pPage(pPg);.  }e
36a20 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
36a30 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
36a40 67 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 44 6f 20  g);.  }.  /* Do 
36a50 6e 6f 74 20 75 73 65 20 74 68 69 73 20 72 6f 75  not use this rou
36a60 74 69 6e 65 20 74 6f 20 72 65 6c 65 61 73 65 20  tine to release 
36a70 74 68 65 20 6c 61 73 74 20 72 65 66 65 72 65 6e  the last referen
36a80 63 65 20 74 6f 20 70 61 67 65 31 20 2a 2f 0a 20  ce to page1 */. 
36a90 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
36aa0 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
36ab0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e  Pager->pPCache)>
36ac0 30 20 29 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  0 );.}.void sqli
36ad0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62  te3PagerUnref(Db
36ae0 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66  Page *pPg){.  if
36af0 28 20 70 50 67 20 29 20 73 71 6c 69 74 65 33 50  ( pPg ) sqlite3P
36b00 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
36b10 28 70 50 67 29 3b 0a 7d 0a 76 6f 69 64 20 73 71  (pPg);.}.void sq
36b20 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 50  lite3PagerUnrefP
36b30 61 67 65 4f 6e 65 28 44 62 50 61 67 65 20 2a 70  ageOne(DbPage *p
36b40 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
36b50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
36b60 70 50 67 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pPg!=0 );.  asse
36b70 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31  rt( pPg->pgno==1
36b80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
36b90 50 67 2d 3e 66 6c 61 67 73 20 26 20 50 47 48 44  Pg->flags & PGHD
36ba0 52 5f 4d 4d 41 50 29 3d 3d 30 20 29 3b 20 2f 2a  R_MMAP)==0 ); /*
36bb0 20 50 61 67 65 31 20 69 73 20 6e 65 76 65 72 20   Page1 is never 
36bc0 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 2a 2f  memory mapped */
36bd0 0a 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d  .  pPager = pPg-
36be0 3e 70 50 61 67 65 72 3b 0a 20 20 73 71 6c 69 74  >pPager;.  sqlit
36bf0 65 33 50 61 67 65 72 52 65 73 65 74 4c 6f 63 6b  e3PagerResetLock
36c00 54 69 6d 65 6f 75 74 28 70 50 61 67 65 72 29 3b  Timeout(pPager);
36c10 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
36c20 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
36c30 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
36c40 73 65 64 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  sed(pPager);.}..
36c50 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
36c60 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74  ion is called at
36c70 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 76   the start of ev
36c80 65 72 79 20 77 72 69 74 65 20 74 72 61 6e 73 61  ery write transa
36c90 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20  ction..** There 
36ca0 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62 65 20  must already be 
36cb0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
36cc0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
36cd0 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
36ce0 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
36cf0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
36d00 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  d..**.** Open th
36d10 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
36d20 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
36d30 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72  and write a jour
36d40 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f  nal header.** to
36d50 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74   the start of it
36d60 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  . If there are a
36d70 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
36d80 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a  , open the sub-j
36d90 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c  ournal.** as wel
36da0 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  l. This function
36db0 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68   is only used wh
36dc0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
36dd0 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a  ile is being .**
36de0 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65   opened to write
36df0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20   a rollback log 
36e00 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
36e10 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65  n. It is not use
36e20 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69  d .** when openi
36e30 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ng a hot journal
36e40 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74   file to roll it
36e50 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
36e60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
36e70 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
36e80 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69   (as it may be i
36e90 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
36ea0 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  ),.** then this 
36eb0 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72  function just wr
36ec0 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68  ites a journal h
36ed0 65 61 64 65 72 20 74 6f 20 74 68 65 20 73 74 61  eader to the sta
36ee0 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72  rt of the.** alr
36ef0 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20  eady open file. 
36f00 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f  .**.** Whether o
36f10 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
36f20 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
36f30 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
36f40 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e  n, the.** Pager.
36f50 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65  pInJournal bitve
36f60 63 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  c structure is a
36f70 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  llocated..**.** 
36f80 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
36f90 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
36fa0 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74  s successful. Ot
36fb0 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
36fc0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
36fd0 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   if the attempt 
36fe0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65  to allocate Page
36ff0 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69  r.pInJournal fai
37000 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f  ls, or .** an IO
37010 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f   error code if o
37020 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  pening or writin
37030 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
37040 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  le fails..*/.sta
37050 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70  tic int pager_op
37060 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72  en_journal(Pager
37070 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
37080 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
37090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
370a0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
370b0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
370c0 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
370d0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
370e0 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  Vfs;   /* Local 
370f0 63 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69  cache of vfs poi
37100 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
37110 74 28 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74  t( pPager->eStat
37120 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45 52 5f  e==PAGER_WRITER_
37130 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 61 73 73 65  LOCKED );.  asse
37140 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
37150 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
37160 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
37170 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
37180 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20  0 );.  .  /* If 
37190 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65  already in the e
371a0 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68 69 73  rror state, this
371b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
371c0 6f 2d 6f 70 2e 20 20 42 75 74 20 6f 6e 0a 20 20  o-op.  But on.  
371d0 2a 2a 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  ** the other han
371e0 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
371f0 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
37200 69 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64  if we are alread
37210 79 20 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 72 72  y in.  ** an err
37220 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69  or state. */.  i
37230 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
37240 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65 74 75  >errCode) ) retu
37250 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
37260 64 65 3b 0a 0a 20 20 69 66 28 20 21 70 61 67 65  de;..  if( !page
37270 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
37280 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
37290 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
372a0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
372b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
372c0 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
372d0 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50  3BitvecCreate(pP
372e0 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
372f0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
37300 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a  InJournal==0 ){.
37310 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
37320 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
37330 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
37340 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
37350 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e   file if it is n
37360 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e  ot already open.
37370 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73 4f   */.    if( !isO
37380 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
37390 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
373a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
373b0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
373c0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
373d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65         sqlite3Me
373e0 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61  mJournalOpen(pPa
373f0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
37400 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
37410 69 6e 74 20 66 6c 61 67 73 20 3d 20 53 51 4c 49  int flags = SQLI
37420 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
37430 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
37440 45 41 54 45 3b 0a 20 20 20 20 20 20 20 20 69 6e  EATE;.        in
37450 74 20 6e 53 70 69 6c 6c 3b 0a 0a 20 20 20 20 20  t nSpill;..     
37460 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74     if( pPager->t
37470 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
37480 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 53       flags |= (S
37490 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
374a0 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f  EONCLOSE|SQLITE_
374b0 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
374c0 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 53  L);.          nS
374d0 70 69 6c 6c 20 3d 20 73 71 6c 69 74 65 33 43 6f  pill = sqlite3Co
374e0 6e 66 69 67 2e 6e 53 74 6d 74 53 70 69 6c 6c 3b  nfig.nStmtSpill;
374f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
37500 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
37510 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  |= SQLITE_OPEN_M
37520 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20  AIN_JOURNAL;.   
37530 20 20 20 20 20 20 20 6e 53 70 69 6c 6c 20 3d 20         nSpill = 
37540 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70  jrnlBufferSize(p
37550 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
37560 7d 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20 20  }.          .   
37570 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74       /* Verify t
37580 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
37590 20 73 74 69 6c 6c 20 68 61 73 20 74 68 65 20 73   still has the s
375a0 61 6d 65 20 6e 61 6d 65 20 61 73 20 69 74 20 64  ame name as it d
375b0 69 64 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20  id when.        
375c0 2a 2a 20 69 74 20 77 61 73 20 6f 72 69 67 69 6e  ** it was origin
375d0 61 6c 6c 79 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a  ally opened. */.
375e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 64 61 74          rc = dat
375f0 61 62 61 73 65 49 73 55 6e 6d 6f 76 65 64 28 70  abaseIsUnmoved(p
37600 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
37610 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
37620 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
37630 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  c = sqlite3Journ
37640 61 6c 4f 70 65 6e 20 28 0a 20 20 20 20 20 20 20  alOpen (.       
37650 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61         pVfs, pPa
37660 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
37670 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67  Pager->jfd, flag
37680 73 2c 20 6e 53 70 69 6c 6c 0a 20 20 20 20 20 20  s, nSpill.      
37690 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d      );.        }
376a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
376b0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
376c0 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
376d0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
376e0 20 20 20 7d 0a 20 20 0a 20 20 0a 20 20 20 20 2f     }.  .  .    /
376f0 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 72 73  * Write the firs
37700 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
37710 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
37720 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20  file and open . 
37730 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f     ** the sub-jo
37740 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
37750 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ry..    */.    i
37760 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
37770 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44   ){.      /* TOD
37780 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c 6c 20  O: Check if all 
37790 6f 66 20 74 68 65 73 65 20 61 72 65 20 72 65 61  of these are rea
377a0 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20 2a 2f  lly required. */
377b0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
377c0 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Rec = 0;.      p
377d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
377e0 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
377f0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
37800 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
37810 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
37820 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
37830 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
37840 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
37850 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
37860 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
37870 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
37880 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
37890 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72  nal);.    pPager
378a0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
378b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
378c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
378d0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49  State==PAGER_WRI
378e0 54 45 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  TER_LOCKED );.  
378f0 20 20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65    pPager->eState
37900 20 3d 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f   = PAGER_WRITER_
37910 43 41 43 48 45 4d 4f 44 3b 0a 20 20 7d 0a 0a 20  CACHEMOD;.  }.. 
37920 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
37930 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77 72 69  *.** Begin a wri
37940 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
37950 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  n the specified 
37960 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66  pager object. If
37970 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61   a .** write-tra
37980 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
37990 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
379a0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
379b0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
379c0 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20  * If the exFlag 
379d0 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73  argument is fals
379e0 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  e, then acquire 
379f0 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52  at least a RESER
37a00 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74  VED.** lock on t
37a10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
37a20 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74  . If exFlag is t
37a30 72 75 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72  rue, then acquir
37a40 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e  e at least.** an
37a50 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
37a60 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
37a70 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  is already held,
37a80 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20   no locking .** 
37a90 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20 62  functions need b
37aa0 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  e called..**.** 
37ab0 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d  If the subjInMem
37ac0 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ory argument is 
37ad0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
37ae0 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f  ny sub-journal o
37af0 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20  pened.** within 
37b00 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
37b10 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20   will be opened 
37b20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  as an in-memory 
37b30 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68 61  file. This.** ha
37b40 73 20 6e 6f 20 65 66 66 65 63 74 20 69 66 20 74  s no effect if t
37b50 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
37b60 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
37b70 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 77   (as it may be w
37b80 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69  hen.** running i
37b90 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
37ba0 29 20 6f 72 20 69 66 20 74 68 65 20 74 72 61 6e  ) or if the tran
37bb0 73 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  saction does not
37bc0 20 72 65 71 75 69 72 65 20 61 0a 2a 2a 20 73 75   require a.** su
37bd0 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68  b-journal. If th
37be0 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61  e subjInMemory a
37bf0 72 67 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f 2c  rgument is zero,
37c00 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72   then any requir
37c10 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61  ed.** sub-journa
37c20 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  l is implemented
37c30 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70 50   in-memory if pP
37c40 61 67 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d 65  ager is an in-me
37c50 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 0a  mory database, .
37c60 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61 20 74 65  ** or using a te
37c70 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f 74 68  mporary file oth
37c80 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erwise..*/.int s
37c90 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
37ca0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
37cb0 69 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e 74 20  int exFlag, int 
37cc0 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a 20  subjInMemory){. 
37cd0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
37ce0 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  _OK;..  if( pPag
37cf0 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65  er->errCode ) re
37d00 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
37d10 43 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Code;.  assert( 
37d20 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3e 3d  pPager->eState>=
37d30 50 41 47 45 52 5f 52 45 41 44 45 52 20 26 26 20  PAGER_READER && 
37d40 70 50 61 67 65 72 2d 3e 65 53 74 61 74 65 3c 50  pPager->eState<P
37d50 41 47 45 52 5f 45 52 52 4f 52 20 29 3b 0a 20 20  AGER_ERROR );.  
37d60 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65  pPager->subjInMe
37d70 6d 6f 72 79 20 3d 20 28 75 38 29 73 75 62 6a 49  mory = (u8)subjI
37d80 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20 69 66 28 20  nMemory;..  if( 
37d90 41 4c 57 41 59 53 28 70 50 61 67 65 72 2d 3e 65  ALWAYS(pPager->e
37da0 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 41  State==PAGER_REA
37db0 44 45 52 29 20 29 7b 0a 20 20 20 20 61 73 73 65  DER) ){.    asse
37dc0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
37dd0 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 0a 20 20  ournal==0 );..  
37de0 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
37df0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
37e00 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67     /* If the pag
37e10 65 72 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64  er is configured
37e20 20 74 6f 20 75 73 65 20 6c 6f 63 6b 69 6e 67 5f   to use locking_
37e30 6d 6f 64 65 3d 65 78 63 6c 75 73 69 76 65 2c 20  mode=exclusive, 
37e40 61 6e 64 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20  and an.      ** 
37e50 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
37e60 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
37e70 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 65  s not already he
37e80 6c 64 2c 20 6f 62 74 61 69 6e 20 69 74 20 6e 6f  ld, obtain it no
37e90 77 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  w..      */.    
37ea0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78    if( pPager->ex
37eb0 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 73  clusiveMode && s
37ec0 71 6c 69 74 65 33 57 61 6c 45 78 63 6c 75 73 69  qlite3WalExclusi
37ed0 76 65 4d 6f 64 65 28 70 50 61 67 65 72 2d 3e 70  veMode(pPager->p
37ee0 57 61 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20  Wal, -1) ){.    
37ef0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4c 6f      rc = pagerLo
37f00 63 6b 44 62 28 70 50 61 67 65 72 2c 20 45 58 43  ckDb(pPager, EXC
37f10 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
37f20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
37f30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
37f40 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
37f50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37f60 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 57    (void)sqlite3W
37f70 61 6c 45 78 63 6c 75 73 69 76 65 4d 6f 64 65 28  alExclusiveMode(
37f80 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c 20 31 29  pPager->pWal, 1)
37f90 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
37fa0 20 2f 2a 20 47 72 61 62 20 74 68 65 20 77 72 69   /* Grab the wri
37fb0 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6c  te lock on the l
37fc0 6f 67 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63  og file. If succ
37fd0 65 73 73 66 75 6c 2c 20 75 70 67 72 61 64 65 20  essful, upgrade 
37fe0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 50 41 47 45  to.      ** PAGE
37ff0 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65  R_RESERVED state
38000 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
38010 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
38020 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
38030 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 62 75  .      ** The bu
38040 73 79 2d 68 61 6e 64 6c 65 72 20 69 73 20 6e 6f  sy-handler is no
38050 74 20 69 6e 76 6f 6b 65 64 20 69 66 20 61 6e 6f  t invoked if ano
38060 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
38070 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20 2a 2a  already.      **
38080 20 68 6f 6c 64 73 20 74 68 65 20 77 72 69 74 65   holds the write
38090 2d 6c 6f 63 6b 2e 20 49 66 20 70 6f 73 73 69 62  -lock. If possib
380a0 6c 65 2c 20 74 68 65 20 75 70 70 65 72 20 6c 61  le, the upper la
380b0 79 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 69 74  yer will call it
380c0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
380d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c   rc = sqlite3Wal
380e0 42 65 67 69 6e 57 72 69 74 65 54 72 61 6e 73 61  BeginWriteTransa
380f0 63 74 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57  ction(pPager->pW
38100 61 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  al);.    }else{.
38110 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20        /* Obtain 
38120 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
38130 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
38140 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46  file. If the exF
38150 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20  lag parameter.  
38160 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20      ** is true, 
38170 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  then immediately
38180 20 75 70 67 72 61 64 65 20 74 68 69 73 20 74 6f   upgrade this to
38190 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
381a0 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a  ck. The.      **
381b0 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
381c0 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73  llback can be us
381d0 65 64 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  ed when upgradin
381e0 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49  g to the EXCLUSI
381f0 56 45 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  VE.      ** lock
38200 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f  , but not when o
38210 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53  btaining the RES
38220 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20  ERVED lock..    
38230 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
38240 70 61 67 65 72 4c 6f 63 6b 44 62 28 70 50 61 67  pagerLockDb(pPag
38250 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  er, RESERVED_LOC
38260 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
38270 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
38280 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  xFlag ){.       
38290 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
382a0 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
382b0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
382c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
382d0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
382e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
382f0 2f 2a 20 43 68 61 6e 67 65 20 74 6f 20 57 52 49  /* Change to WRI
38300 54 45 52 5f 4c 4f 43 4b 45 44 20 73 74 61 74 65  TER_LOCKED state
38310 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
38320 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 20 73 65 74   ** WAL mode set
38330 73 20 50 61 67 65 72 2e 65 53 74 61 74 65 20 74  s Pager.eState t
38340 6f 20 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c  o PAGER_WRITER_L
38350 4f 43 4b 45 44 20 6f 72 20 43 41 43 48 45 4d 4f  OCKED or CACHEMO
38360 44 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20  D.      ** when 
38370 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 74  it has an open t
38380 72 61 6e 73 61 63 74 69 6f 6e 2c 20 62 75 74 20  ransaction, but 
38390 6e 65 76 65 72 20 74 6f 20 44 42 4d 4f 44 20 6f  never to DBMOD o
383a0 72 20 46 49 4e 49 53 48 45 44 2e 0a 20 20 20 20  r FINISHED..    
383b0 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63    ** This is bec
383c0 61 75 73 65 20 69 6e 20 74 68 6f 73 65 20 73 74  ause in those st
383d0 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f  ates the code to
383e0 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76 65 70   roll back savep
383f0 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74  oint .      ** t
38400 72 61 6e 73 61 63 74 69 6f 6e 73 20 6d 61 79 20  ransactions may 
38410 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74  copy data from t
38420 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
38430 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
38440 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20   .      ** file 
38450 61 73 20 77 65 6c 6c 20 61 73 20 69 6e 74 6f 20  as well as into 
38460 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
38470 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20 69  Which would be i
38480 6e 63 6f 72 72 65 63 74 20 69 6e 20 0a 20 20 20  ncorrect in .   
38490 20 20 20 2a 2a 20 57 41 4c 20 6d 6f 64 65 2e 0a     ** WAL mode..
384a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
384b0 50 61 67 65 72 2d 3e 65 53 74 61 74 65 20 3d 20  Pager->eState = 
384c0 50 41 47 45 52 5f 57 52 49 54 45 52 5f 4c 4f 43  PAGER_WRITER_LOC
384d0 4b 45 44 3b 0a 20 20 20 20 20 20 70 50 61 67 65  KED;.      pPage
384e0 72 2d 3e 64 62 48 69 6e 74 53 69 7a 65 20 3d 20  r->dbHintSize = 
384f0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
38500 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
38510 46 69 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  FileSize = pPage
38520 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
38530 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
38540 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
38550 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Size;.      pPag
38560 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
38570 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61   0;.    }..    a
38580 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
38590 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
385a0 65 53 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  eState==PAGER_RE
385b0 41 44 45 52 20 29 3b 0a 20 20 20 20 61 73 73 65  ADER );.    asse
385c0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
385d0 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 53 74  K || pPager->eSt
385e0 61 74 65 3d 3d 50 41 47 45 52 5f 57 52 49 54 45  ate==PAGER_WRITE
385f0 52 5f 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20  R_LOCKED );.    
38600 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f 70  assert( assert_p
38610 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67 65  ager_state(pPage
38620 72 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47  r) );.  }..  PAG
38630 45 52 54 52 41 43 45 28 28 22 54 52 41 4e 53 41  ERTRACE(("TRANSA
38640 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47  CTION %d\n", PAG
38650 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
38660 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
38670 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 70 61 67 65  /*.** Write page
38680 20 70 50 67 20 6f 6e 74 6f 20 74 68 65 20 65 6e   pPg onto the en
38690 64 20 6f 66 20 74 68 65 20 72 6f 6c 6c 62 61 63  d of the rollbac
386a0 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74  k journal..*/.st
386b0 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
386c0 4c 49 4e 45 20 69 6e 74 20 70 61 67 65 72 41 64  LINE int pa